2010-06-06 33 views
1

現在我正在開發一個Firefox擴展,我可以在主要的xul中定義一個全局數組。我發現當我用另一個xs在另一個js中使用它時,它無法工作,所以我搜索了Firefox開發的文檔。我發現一個普通數組不能在兩個不同的xul文件的js文件之間傳輸。然後我在js中定義了一個xpcom mutablearray:var eleList = Components.classes [「@ mozilla.org/array; 1」] .createInstance(Components.interfaces.nsIMutableArray);xpcom數組可以傳輸不同的xul文件嗎?

但是,當我想在另一個JS使用它:它仍然無法正常工作,爲什麼?非常感謝你!

回答

3

問題在於,即使在創建可變數組時,您也將該數組對象的引用存儲在創建該數組對象的XUL上下文中的變量中。從另一個XUL中,您看不到該變量,因此您無法訪問該數組。

有幾種解決方案來訪問對象翻過不同的情境:

  • 從上下文之一,得到其他方面的參考。例如,您在主窗口中定義了一個變量(browser.xul覆蓋圖),您可以通過使用窗口管理器獲取對主窗口的引用,從側邊欄獲取該變量。

  • 您可以創建自己的XPCOM對象,雖然這不是簡單的事情,專門爲一個簡單的情況下,像你這樣的

  • 您可以使用JavaScript的模塊,從而建立一個全球性的單。

您應該考慮查看JavaScript模塊選項。這是最簡單和最可靠的方法。它在Firefox 3.0中引入的,你只需使用JavaScript這樣做,而不必在這裏創建XPCOM

詳細信息請參考:

https://developer.mozilla.org/en/JavaScript_code_modules/Using_JavaScript_code_modules

更新:

這裏有一些有關如何獲得對主窗口的引用以查看browser.xul中定義的變量的更多詳細信息。

你定義在browser.xul覆蓋變量(主窗口):

myArray = [1, 2, 3]; 

然後從側邊欄XUL,你可以在主窗口的引用,並使用引用訪問您的變量:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIWebNavigation) 
        .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
        .rootTreeItem 
        .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIDOMWindow); 

var value = mainWindow.myArray[0]; 

這些鏈接可能有用的信息,供各位:

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

https://developer.mozilla.org/en/Code_snippets/Tabbed_browser

+0

首先非常感謝你!正如你所說的:「你在主窗口中定義了一個變量(browser.xul覆蓋圖),你可以通過使用窗口管理器獲得對主窗口的引用從側邊欄獲取它。」我不清楚。和我的情況一樣,你已經說過:我在js主窗口(瀏覽器xul覆蓋圖)中獲得了一個觀察swf文件路徑的數組,並且我想從側欄js中獲取它們,所以我將在瀏覽器中定義一個變量.xul?以及如何做到,如何從側欄js中獲取?再次感謝你。 – jin 2010-06-07 02:21:28

+0

只需在響應中添加更多信息。希望能幫助到你! – flpmor 2010-06-07 13:06:01

+0

感謝您的幫助,我認爲這些代碼可能會添加xs的js,因爲我的js代碼很長? – jin 2010-06-08 01:34:20

相關問題