我想在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不够熟悉,无法知道是否有更好的方法可以执行此操作,但这应该可行。

09-25 18:32