为什么这样contentscript在Firefox的运行各种次附加?(Why this conte

2019-10-20 03:18发布

我正在学习如何创建一个Firefox插件。 我想做一个简单的插件,将在页面注入一个脚本。 我已阅读文档,但我解决不了这个问题。

在CFX运行日志,我可以看到它运行脚本不同时间在同一个页面时,它应该做的只有一次。

main.js

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

pageMod.PageMod({
  include:  ['*'],
  contentScriptWhen: 'end',
  contentScriptFile: data.url('starter.js')
})
 

starter.js

 
var script = document.createElement('script');

script.id = 'i-inject';
script.type = 'text/javascript';
script.src = 'http://localhost:8888/injectme.js';
document.getElementsByTagName('head')[0].appendChild(script);
console.log('injected');
 

你看到这个的console.log(“注入”)? 我可以看到,它的印刷5次在控制台当我这样做CFX运行,每次我重新加载页面。 我不理解这种行为。

任何帮助非常感谢:)

Answer 1:

我刚说完问同样的问题,由于某种原因,多次搜索,并没有导致我对这个问题到现在为止。

链接您张贴有关的iFrame导致我这个解决方案,这似乎运作良好。

在Firefox中,iFrame中依然页,并且默认的SDK不Iframe和顶端页区别对待,从而导致内容的脚本附加到任何加载页面(或iframe),以满足您的pageMod“匹配”的要求。 而不是使用页面MOD,你可以使用标签来注入所需的脚本和数据。

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
     });

});

另外,您也可以修改PageMod的行为仅适用于首页,这将阻止它在任何网页上的iFrame中运行。

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

pageMod.PageMod({
    match: [*],
    attachTo: ["top"],
    contentScriptOptions: {},
    contentScriptFile: [data.url('myScript.js')],
    onAttach: function(worker) {
        //function body
    }
});

就如何进一步控制页面-MOD行为的详细信息可以在他们找到API文档



文章来源: Why this contentscript runs various times in a firefox add-on?