2011-05-05 114 views
1

我想在我的Xul應用程序的單個窗口中使用Javascript Module(JSM),所以我可以根據需要加載資源。如何將參數傳遞給Javascript模塊?

但是,我需要將窗口傳遞給JSM,我不知道該怎麼做。如下我嘗試:

在我resource.jsm

var EXPORTED_SYMBOLS = ["hello"]; 

function hello(win) { 
    win.alert("ALERT FROM JSM!"); 
} 

在我的窗口調用具有:

Components.utils.import("resource://module/resource.jsm"); 
hello(window); 

,但我得到:

取勝是不確定的

在resource.jsm中。

任何想法如何使它工作?

+0

只是出於好奇,如果你第一次分配'window = window',會發生什麼?我記得聽說有關某些「預先定義」的全局變量(某種程度上)通過自行分配來解決一些非常奇怪的問題... – 2011-05-05 18:12:59

+0

@Platinum Azure我得到了同樣的錯誤消息。 – 2011-05-05 18:24:00

+0

@Platinum Azure我想你看到的是這個[頁面示例](https://developer.mozilla.org/En/Code_snippets/Modules)。 – 2011-05-05 19:27:18

回答

0

可能會導致您將hello函數的參數命名爲window的問題。雖然窗口不是保留字,但大多數瀏覽器環境將其視爲不可分類的常量。嘗試:

function hello(obj) { 
    obj.alert("ALERT FROM JSM!"); 
} 

你的模塊中,然後用hello(window)hello(document.window),或hello(this)


調用它讀取的Javascript模塊文檔之後,它看起來像你需要創建中的一個對象模塊,然後通過引用更改它的屬性。因此,在您的JSM:

Components.utils.import("resource://module/resource.jsm"); 
params.win = window; 
hello(); 

注:

var EXPORTED_SYMBOLS = ["params", "hello"]; 

params = { 
    win: this 
}; 

function hello() { 
    params.win.alert("ALERT FROM JSM!"); 
} 

然後你會先分配窗口該參數,然後調用函數調用我不夠熟悉JSMs知道有更好的方法來做到這一點,但這應該工作。

+0

我改變了,但隨着任何調用,我得到'OBJ是未定義的...... – 2011-05-05 18:47:20

+0

更新答案與替代解決方案。 – mVChr 2011-05-05 19:03:44

+0

非常好的觀察。但是我得到了'params.win.alert不是一個函數'。並且通過將'param.win'聲明爲'null',我意識到它沒有被分配,因爲'alert()'調用了'params.win'。有些事情在分配前(或分配之後)是錯誤的。(我會在這裏發帖,如果我找到的話) – 2011-05-05 19:31:57