繁体   English   中英

Firefox扩展js对象初始化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM