为什么这个内容脚本在firefox附加组件中运行不同的时间?

时间:2014-05-10 19:27:43

标签: javascript firefox-addon code-injection

我正在学习如何创建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('注入')?我可以看到,当我执行cfx运行并且每次重新加载页面时,它在控制台中打印了5次。我不明白这种行为。

任何帮助都非常感谢:)

1 个答案:

答案 0 :(得分:2)

我刚刚问了同样的问题,由于某种原因,直到现在多次搜索都没有引导我这个问题。

您发布的有关iFrames的链接引导我使用此解决方案,该解决方案似乎运行良好。

在Firefox中,iFrame仍然是Pages,默认情况下,SDK不区分iFrame和top页面,导致内容脚本附加到符合pageMod“匹配”要求的任何已加载页面(或iFrame)。您可以使用选项卡注入所需的脚本和数据,而不是使用page-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
    }
});

有关如何进一步控制页面模式行为的更多详细信息,请参见API docs