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

How do I prevent Firefox SDK content scripts from loading multiple times?

本文关键字:脚本 本多 加载 何防止 Firefox SDK      更新时间:2023-09-26

如何防止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属性来控制这种行为,也尝试过在每个脚本上都有一个"isLoaded"标志——这两个标志都不会阻止脚本多次执行。

原来这是这个问题的重复,自然,这个问题在我发布重复后的几个小时才出现在搜索结果中。想想看。

这让我想到了这个问题,作者试图阻止他的插件在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
     });
});

事实证明,这个问题也存在另一个版本,其中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
     },
});