2010-05-06 151 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