Firefox扩展js对象初始化

时间:2010-05-06 23:58:38

标签: javascript firefox object initialization

注意:这是关于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窗口实例中是否有“本机”技术使对象的某些部分静态化?

2 个答案:

答案 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,每个窗口都有自己的...每个窗口都有你自己的扩展版本。 (请注意,这是一个新窗口,而不是新选项卡。)

所以,你可能不得不使用类似你提到的技术以某种方式同步它们。

相关问题