我想在我的Xul应用程序的单个窗口中使用Javascript模块(JSM),这样我就可以根据需要加载资源。
但是,我需要将窗口传递给 JSM,但我不知道该怎么做。遵循我的尝试:
在我的资源.jsm中:
var EXPORTED_SYMBOLS = ["hello"];
function hello(win) {
win.alert("ALERT FROM JSM!");
}
在我的窗口中打电话:
Components.utils.import("resource://module/resource.jsm");
hello(window);
但我得到:
胜利是未定义的
在资源.jsm中。
知道如何让它工作吗?
可能会导致将hello
函数的参数命名为window
的问题。 虽然 window 不是保留字,但大多数浏览器环境将其视为某种不可分配的常量。 尝试:
function hello( obj ) {
obj.alert("ALERT FROM JSM!");
}
,然后使用 hello(window)
、 hello(document.window)
或 hello(this)
调用它
阅读 Javascript 模块文档后,看起来您需要在模块中创建一个对象,然后通过引用更改其属性。 所以在你的 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 不够熟悉,不知道是否有更好的方法来做到这一点,但这应该可以工作。