访问Firefox Addon SDK main.js文件中的自定义函数?

时间:2014-06-02 12:37:52

标签: javascript firefox-addon-sdk

为什么我无法使用Firefox Addon SDK访问自定义函数?

在下面的示例代码中,单击上下文菜单Sub Item 1不起作用;它引用自定义函数verifyTest()但返回ReferenceError:verifyTest未定义。单击指向内置函数alert()的子项2可以很好地工作。

我也尝试过self.postMessage(和onMessage)但没有成功..我需要做些什么才能访问(或定义)我的插件工作所需的自定义函数?

///// Content in main.js

function verifyTest() {
    alert('test1');
}

var script1 = 'self.on("click", function(node, data){'+
             '   verifyTest();'+
             '});';

var script2 = 'self.on("click", function(){'+
             '   alert(\'test2\');'+
             '});';

var cm = require("sdk/context-menu");
cm.Menu({
  label: "Main Item",
  context: cm.SelectorContext("body"),
  items: [
    cm.Item({ label: "Sub Item 1", context: cm.SelectorContext("input[type=text]"), contentScript: script1, data: "item1" }),
    cm.Item({ label: "Sub Item 2", context: cm.SelectorContext("input[type=text]"), contentScript: script2, data: "item2" })
  ]
});

1 个答案:

答案 0 :(得分:1)

因为verifyTest是在main.js而不是script1的背景下定义的。

一种解决方案是将verifyTest置于script1内(作为引用文字)。

更好的解决方案是使用此内容创建文件script1.js(或其他有意义的名称):

function verifyTest() {
    alert('test1');
}

self.on("click", function(node, data){
    verifyTest();
});

并使用contentScriptFile代替contentScript加载它(请参阅Loading Content Scripts)。

cm.Item({ label: "Sub Item 1", context: cm.SelectorContext("input[type=text]"), contentScriptFile: require("sdk/self").data.url("script1.js"), data: "item1" }),

这使它更具可读性和可维护性,并避免使用在不同上下文中定义的变量/函数的错误。