[英]Firefox extension js object initialization
注意:这是关于Firefox扩展,而不是js一般问题。
在Firefox扩展项目中,我需要每个Firefox窗口仅初始化一次我的javascript对象。 否则,每次我打开窗口时,都会使用新的计时器,使用新的属性,因此一切都将从头开始。
希望下面的例子能使我的问题神秘化:)
var StupidExtension
{
statusBarValue: "Not Initialized Yet",
startup: function ()
{
...
// Show statusBarValue in Status Bar Panel
},
initTimerToRetrieveStatusBarValueFromNetwork: function ()
{
...
}
}
因此,每次您按Ctrl + N时,会在新窗口中看到“尚未初始化”,然后将触发新计时器,因此一段时间后,它将从网络中检索数据,您还将在第二个窗口中看到值,依此类推。 理想的情况是只运行一个计时器功能,并更新所有Firefox窗口中的所有状态栏面板。
当然,我可以进行一些缓存,例如将值保存在prefs或其他存储中,然后从那里显示它。 但是我觉得这是人为的。
因此,问题将是是否存在使所有Firefox窗口实例之间的对象的某些部分静态化的“本机”技术?
https://developer.mozilla.org/en/Working_with_windows_in_chrome_code#Advanced_data_sharing
在所有窗口中导入一个js模块(您需要编写)。 这样就为您提供了一个在所有对象之间共享的对象。
在模块中实现计时器代码,并使用标准观察者服务向所有窗口发送通知.notify()
每当需要更新窗口时,计时器回调就会调用.notify()
,每个窗口都有向.addObserver()
注册的观察者)或在从jsm导出的对象上实现自己的addObserver / removeObserver方法。
如果您的Chrome清单文件中有以下内容:
overlay chrome://browser/content/browser.xul chrome://path/to/youroverlay.xul
而且该覆盖物包含一些somejsfile.js
在somejsfile.js中,您可以这样:
var myExtension = {
statusBarValue: "Not Initialized Yet",
startup: function startup(){
// Show statusBarValue in Status Bar Panel
},
}
window.addEventListener("load", function() { myExtension.startup(); }, false);
假设我刚才所说的一切,当用户打开一个新窗口时,将为每个窗口运行启动,并且statusBarValue应该为“ Not Initialized Yet”,而不管它在另一个窗口中是什么。
因为您覆盖的是browser.xul,并且每个窗口都有它自己的...每个窗口都有它自己的扩展版本。 (请注意,这是一个新窗口,而不是新选项卡。)
是的,您可能必须使用类似于您提到的技术以某种方式将它们同步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.