如何防止Firefox SDK内容脚本多次加载?

时间:2014-10-01 19:51:18

标签: javascript firefox-addon-sdk

如何防止多次加载Firefox SDK内容脚本?我发现的文档和错误报告建议contentScriptWhen属性应该限制我的内容脚本执行的次数,但我看到它们在页面加载中运行的时间从两次到15次。

这是我的main.js中的内容:

var data = require("sdk/self").data;
var tabs = require('sdk/tabs');

var pageMod = require('sdk/page-mod');
pageMod.PageMod({
    include: ['*'],
    contentScriptWhen: "ready",
    contentScriptFile: [data.url("extBootstrapper.js"), data.url("extContent.js")],
    onAttach: function(worker) {
       //handlers for AJAX and changing preferences, etc
       ...
});

我尝试使用contentScriptWhen属性控制此行为,以及使用“已加载”'每个脚本上的标志 - 既不会阻止脚本多次执行。

1 个答案:

答案 0 :(得分:3)

原来这是this question的副本,当然,在我发布副本后的几个小时内,它只出现在搜索结果中。去图。

它引导我this question,其中作者试图阻止他的插件在iFrame中运行。找到了!原来我的插件并没有初始化"同一页面多次,但page-mod并未区分页面和iFrame。

我使用的解决方案是使用制表符API将我的内容注入页面,如下所示:

var data = require("sdk/self").data;
var tabs = require('sdk/tabs');

tabs.on('ready', function(tab) {
     var worker = tab.attach({
          contentScriptOptions: {},
          contentScriptFile: [data.url('myScript.js')]
     });

     // now set up your hooks:        
     worker.port.on('someKey', function(data) {
          //do whatever with your data
     });

});

原来这个问题的another version也存在,其中attachTo属性用于指定pageMod.onAttach只应在顶部窗口而不是iframe上触发:

var data = require("sdk/self").data;
var page = require('sdk/page-mod');

page.PageMod({
     match:['*'],
     contentScriptOptions: {},
     contentScriptFile: [data.url('myScript.js')],
     attachTo: 'top',
     onAttach: function(worker) {
         //set up hooks or other background behavior
     },
});
相关问题