我想在Xul应用程序的单个窗口中使用Javascript Module(JSM),因此我可以根据需要加载资源。
但是,我需要将窗口传递给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中。
任何想法如何使其工作?
最佳答案
您将hello
函数的参数命名为window
可能会导致问题。尽管window不是保留字,但大多数浏览器环境将其视为不可分配的常量。尝试:
function hello( obj ) {
obj.alert("ALERT FROM JSM!");
}
在模块中,然后使用
hello(window)
,hello(document.window)
或hello(this)
调用它阅读Javascript Module文档之后,您似乎需要在模块中创建一个对象,然后通过引用更改其属性。因此,在您的JSM中:
var EXPORTED_SYMBOLS = ["params", "hello"];
params = {
win: this
};
function hello() {
params.win.alert("ALERT FROM JSM!");
}
然后通过首先将窗口分配给该参数然后调用该函数来进行调用:
Components.utils.import("resource://module/resource.jsm");
params.win = window;
hello();
注意:我对JSM不够熟悉,无法知道是否有更好的方法可以执行此操作,但这应该可行。