1

我正在使用附加 SDK 创建一个 Firefox 扩展。由于各种原因(主要是 simple-prefs 模块中的功能不足),我不得不创建一个 XUL 窗口并使用 window/utils 将其包含在内。此窗口显示正确,并且完全按照应有的方式工作。

我的问题是我需要main.js从我的 XUL 窗口中包含的脚本文件中调用我的函数。它们不存在于同一个命名空间中,所以我不确定如何访问我的函数。我很高兴使用消息传递,但我不认为portXPCOM 中包含的脚本可以使用该功能。

我在想我需要设置某种回调,但我真的不知道该怎么做。我考虑创建自己的 XPCOM 组件,但根据XUL 迁移指南,似乎不允许我使用附加 SDK 注册 XPCOM 组件

作为参考,这是我的(缩写)文件夹结构:

- package.json
- chrome.manifest (to allow me to open a XUL window)
- lib
   - main.js
- chrome
   - content
      - window.xul
      - script.js

我希望 .in 中main.js的某些代码可以调用某些代码script.js。请注意,窗口是在 main.js 中创建的(就像这样)

var { open } = require('sdk/window/utils');
var window = open('chrome://my-app-id/content/window.xul', { features: {
    chrome: true,
    centerscreen: true,
    toolbar: true
}});

这很有效。有没有人有任何想法?

编辑:我可以通过观察偏好变化来解决这个问题main.js,然后在我想要调用函数时让它发生变化,但这让我觉得这是对偏好系统的巨大滥用。我想以正确的方式来做,如果有的话。

4

1 回答 1

1

我以自己满意的方式解决了自己的问题。

我更改了上述对window.opento的调用,window.openDialog并将回调函数作为参数传递,如下所示:

var { openDialog } = require('sdk/window/utils');
var window = openDialog({url: 'chrome://my-app-id/content/window.xul',
    features: {
        chrome: true,
        centerscreen: true,
        toolbar: true
    },
    args: {
        doStuff: function(){
            //Do all the stuff
        }
    }
});

然后script.js,当我想要调用回调时,我使用

window.arguments[0].doStuff();
于 2013-08-21T13:51:09.527 回答