javascript - 为什么此 contentscript 在 firefox 附加组件中运行多次?

标签 javascript firefox-addon code-injection

我正在学习如何创建 Firefox 附加组件。我想做一个简单的附加组件,它将在页面中注入(inject)脚本。我已阅读文档,但无法解决此问题。

在 cfx 运行日志中,我可以看到它在同一页面中多次运行脚本,而它应该只运行一次。

主要.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('injected') 了吗?当我执行 cfx run 并且每次重新加载页面时,我都可以看到它在控制台中打印了 5 次。我不明白这种行为。

非常感谢任何帮助:)

最佳答案

我刚问完同一个问题,出于某种原因,多次搜索直到现在才让我想到这个问题。

您发布的有关 iFrame 的链接使我找到了这个解决方案,它似乎运行良好。

在 Firefox 中,iFrame 仍然是页面,默认情况下,SDK 不区分 iFrame 和热门页面,导致内容脚本附加到满足 pageMod“匹配”要求的任何加载页面(或 iFrame)。除了使用 page-mod,您还可以使用选项卡来注入(inject)所需的脚本和数据。

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

有关如何进一步控制 page-mod 行为的更多详细信息,请参阅他们的 API docs

关于javascript - 为什么此 contentscript 在 firefox 附加组件中运行多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585352/

相关文章:

javascript - 在 JavaScript 中分配给变量时使用命名函数的目的是什么?

javascript - 让 JavaScript 命令在函数完成之前运行?

javascript - Firefox WebExtensions : can not get canceled request data

performance - @EJB 注入(inject)与查找 - 性能问题

JavaScript 安全问题

javascript - 使用javascript选中复选框后如何验证 "textarea"

javascript - 使用 nsINavHistoryObserver 为 Firefox 扩展创建事件

javascript - 使用 Javascript 在另一个窗口中获取上次访问的站点

linux - 如何在 Linux 下自动将给定的 so 加载到任何新启动的进程中?

javascript - 正则表达式匹配整个字符串