加載到疊加層中的腳本在瀏覽器窗口的上下文中運行 - 其全局變量存儲爲與瀏覽器對應的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();
SOLUTION(我會適當加了這一點讓我,6小時) 通常我發現瞭解決方案張貼問題,10分鐘後。解決方案是使用Javascript代碼模塊。這裏是鏈接 https://developer.mozilla.org/zh/JavaScript_code_modules/使用 我用getter和setters而不是暴露變量我想改變,因爲它似乎暴露變量本身並沒有工作,但功能,這是很好的。 我希望這可以節省其他人無盡的搜索。 – Lipwig 2012-03-08 13:33:23
那麼,使用JavaScript模塊是另一種可能 - 但如果您已經有XPCOM組件,您可以直接與它通信。看到我的答案。 – 2012-03-08 13:44:13