我正在使用Add-on SDK创建一个firefox扩展。由于各种原因(主要是simple-prefs模块中的功能很少),我必须创建一个XUL窗口并使用window / utils包含它。此窗口正确显示并完全按照应有的方式运行。
我的问题是我需要从我的XUL窗口中包含的脚本文件中调用main.js
中的函数。它们不存在于同一名称空间中,因此我不确定如何访问我的函数。我很高兴使用消息传递,但我不认为XPCOM中包含的脚本可以使用port
功能。
我想我需要设置一些回调,但我真的不知道我怎么会这样做。我考虑创建自己的XPCOM组件,但似乎我不允许使用附加SDK注册XPCOM组件,根据the XUL Migration Guide
供参考,这是我的(缩写)文件夹结构:
- package.json
- chrome.manifest (to allow me to open a XUL window)
- lib
- main.js
- chrome
- content
- window.xul
- script.js
我希望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
中的偏好更改然后在我希望调用该函数时更改它来解决这个问题,但这让我感到非常震惊滥用偏好系统。如果有的话,我想以正确的方式去做。
答案 0 :(得分:1)
我以一种我满意的方式解决了自己的问题。
我将window.open
的上述调用更改为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();