2012-03-08 183 views
4

我正在寫一個Firefox擴展,在命令行中需要自定義開關,並在components目錄設置我cmdline.js內部變量全局變量,我們稱之爲可變switchDetected這是一個布爾值。現在基於這個變量,我想要在chrome/content目錄中的overlay.js文件中執行操作。 我遇到的問題是我似乎無法訪問中從chrome/contents/overlay.js中聲明的變量switchDetected訪問在Firefox擴展

我已經嘗試了很多方法來做到這一點,但似乎沒有任何工作。所以我只是想知道是否有人知道如何實現。

+0

SOLUTION(我會適當加了這一點讓我,6小時) 通常我發現瞭解決方案張貼問題,10分鐘後。解決方案是使用Javascript代碼模塊。這裏是鏈接 https://developer.mozilla.org/zh/JavaScript_code_modules/使用 我用getter和setters而不是暴露變量我想改變,因爲它似乎暴露變量本身並沒有工作,但功能,這是很好的。 我希望這可以節省其他人無盡的搜索。 – Lipwig 2012-03-08 13:33:23

+0

那麼,使用JavaScript模塊是另一種可能 - 但如果您已經有XPCOM組件,您可以直接與它通信。看到我的答案。 – 2012-03-08 13:44:13

回答

4

加載到疊加層中的腳本在瀏覽器窗口的上下文中運行 - 其全局變量存儲爲與瀏覽器對應的window對象的屬性。如果打開第二個瀏覽器窗口,則同一腳本將再次加載並在新瀏覽器窗口的上下文中運行 - 它將具有不同的全局變量。另一方面,包含XPCOM組件的腳本只加載一次,並且它們具有未綁定到窗口的獨立上下文。所以他們的全局變量不能直接從瀏覽器窗口訪問,就像兩個瀏覽器窗口不能直接訪問其他全局變量一樣。

相反,瀏覽器窗口應該使用通常的方法與XPCOM組件通信:獲取組件實例並調用其方法。如果您不想定義自己的接口,用於(你可能不),你可以use a trick,這樣的事情:

CommandLineHandler.prototype = { 
    handle: function(commandLine) {...}, 
    get helpInfo() {...}, 
    isSwitchDetected: function() 
    { 
    return switchDetected; 
    }, 
    get wrappedJSObject() 
    { 
    return this; 
    }, 
    QueryInterface: XPCOMUtils.generateQI(["nsICommandLineHandler"]); 
}; 

wrappedJSObject特性可確保您的組件可以解開 - 所有的方法並且屬性將變得可以訪問,而不僅僅是在界面中定義的屬性。所以,你的覆蓋腳本需要做到以下幾點:

var cmdLineHandler = Components.classes["@myself.com/my-command-line-handler;1"] 
           .getService() 
           .wrappedJSObject; 
var switchDetected = cmdLineHandler.isSwitchDetected(); 
+0

乾杯,很好的解釋我會給它一個去 – Lipwig 2012-03-08 15:34:33