2010-05-06 109 views
1

注:这是关于Firefox扩展,而不是JS一般的问题。Firefox扩展JS对象初始化

在Firefox扩展项目中,我需要我的JavaScript对象每个Firefox窗口初始化一次。否则每次打开我的窗口时都会使用新的定时器,将使用新的属性,因此一切都将从头开始。下面

希望例子将不再神秘,我的问题:)

var StupidExtension 
{ 
    statusBarValue: "Not Initialized Yet", 
    startup: function() 
    { 
    ... 
    // Show statusBarValue in Status Bar Panel 
    }, 
    initTimerToRetrieveStatusBarValueFromNetwork: function() 
    { 
    ... 
    } 
} 

所以每次你打Ctrl + N键一个新的窗口,你会看到“尚未初始化”,然后新的计时器将被解雇,所以经过一番当它从网络中检索数据时,您将在第二个窗口中看到值,依此类推。理想情况下,只有一个定时器功能运行并更新所有Firefox窗口中的所有状态栏面板。

我当然可以做一些缓存,就像节省首选项的值或一些其他存储,然后从那里表现出来。但我觉得这是人为的。

所以问题会在那里做静态的所有Firefox窗口实例之间的对象的某些部分的“原生”的技术?

+0

“需要我的JavaScript对象每个Firefox窗口初始化一次。” - 你的意思是所有窗户一次,而不是每个窗户一次。首先让我困惑。 – Nickolay 2010-05-07 09:36:22

回答

1

https://developer.mozilla.org/en/Working_with_windows_in_chrome_code#Advanced_data_sharing

导入一个js模块(你需要编写)的所有窗口。这给你一个共享的对象。

在模块中实现定时器代码,并可以使用标准observer service的通知发送到所有窗口(计时器回调中调用.notify()只要Windows需要更新,每个窗口都有与.addObserver()注册的观察者),或者实现你在从jsm导出的对象上拥有自己的addObserver/removeObserver方法。

+0

确实,像魅力一样工作!抱歉让人困惑。 Spasibo bolshoe :) – Pablo 2010-05-07 15:42:21

+0

@迈克尔:不客气! – Nickolay 2010-05-07 16:12:29

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应该是“尚未初始化”不管它是什么肛其他窗口。

因为你是覆盖browser.xul,每个窗口都有它自己......每个人都有这是你扩展自己的版本。 (注意,这是一个新的窗口,而不是一个新的选项卡。)

所以啊,你可能不得不将它们同步在某种程度上使用类似于你所提到的技术。

+0

这是关于外观的一部分。我也看到了每次更新UI元素时的技巧,所有的浏览器窗口都被枚举并且一个函数被应用于所有的元素。不知道这有多有效。还有一点 - 静态成员怎么样,会有帮助吗? 功能部分如何,就像我有定期检索某些东西的功能一样,我只想定期运行该功能的一个实例? – Pablo 2010-05-07 05:39:46