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

Access custom functions within the Firefox Addon SDK main.js file?

本文关键字:文件 自定义函数 js main Firefox 插件 SDK 访问      更新时间:2023-09-26

为什么我不能使用Firefox插件SDK访问自定义函数?

在下面的示例代码中,单击上下文菜单subitem 1不起作用;它引用自定义函数verifyTest(),但返回ReferenceError: verifyTest is undefined。点击指向内置功能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" })
  ]
});

因为verifyTest是在main.js的上下文中定义的,而不是script1

一个解决方案是把verifyTest放在script1里面(引用文本)。

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

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

并使用contentScriptFile而不是contentScript来加载它(参见加载内容脚本)。

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

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