注意:这是关于Firefox扩展,而不是一般性问题。
在Firefox扩展项目中,我需要每个Firefox窗口初始化一次javascript对象。否则,每当我打开窗口时,都会使用新的计时器,将使用新的属性,所以一切都将从头开始。
希望下面的例子能揭开我的问题的神秘面纱:)
var StupidExtension
{
statusBarValue: "Not Initialized Yet",
startup: function ()
{
...
// Show statusBarValue in Status Bar Panel
},
initTimerToRetrieveStatusBarValueFromNetwork: function ()
{
...
}
}
因此,每次按Ctrl + N一个新窗口,您将看到“Not Initialized Yet”,然后将触发新的计时器,所以一段时间后它会从网络中检索数据,您将在第二个窗口看到值,依此类推。理想情况下,只需运行一个计时器功能并更新所有Firefox窗口中的所有状态栏面板。
当然我可以做一些缓存,比如保存prefs或其他存储中的值,然后从那里显示它。但我觉得这是假的。
所以问题是在所有Firefox窗口实例中是否有“本机”技术使对象的某些部分静态化?
答案 0 :(得分:1)
https://developer.mozilla.org/en/Working_with_windows_in_chrome_code#Advanced_data_sharing
在所有窗口中导入js模块(您需要编写)。这为你提供了一个在所有这些对象上共享的对象。
在模块中实现定时器代码并使用标准observer service向所有窗口发送通知(每当需要更新窗口时,定时器回调调用.notify()
,每个窗口都有一个观察者注册使用.addObserver()
)或在从jsm导出的对象上实现自己的addObserver / removeObserver方法。
答案 1 :(得分:0)
如果您的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,每个窗口都有自己的...每个窗口都有你自己的扩展版本。 (请注意,这是一个新窗口,而不是新选项卡。)
所以,你可能不得不使用类似你提到的技术以某种方式同步它们。