我在开发扩展时遇到了这个问题。我根据选项卡就绪事件将 pageMod 附加到页面以修改页面的内容,但是当我重新加载页面时,工作人员似乎又附加了一次,因此在 1 次重新加载后,它会为同一网址加载 2 个工作人员(没有 iframe),在 2 次重新加载后,它会加载 3 个工作线程,等等。这是我开始使用的初始代码(我将其从较大的 block 中剥离出来):
mod = null;
tabs.on('ready', function(tab) {
mod = this.pageMod.PageMod({
include: ["*"],
contentScriptFile: ["resource://data/full_page.js"],
attachTo: ["top", "frame", "existing"],
onAttach: function(worker) {
Logger.log('---------> worker.url is ' + worker.url);
}
});
}
我能够通过在就绪事件处理程序的最开始附加此代码来销毁每个就绪事件上的 mod,从而在某种程度上解决此问题。
mod = null;
tabs.on('ready', function(tab) {
if (mod) {
mod.destroy();
}
mod = this.pageMod.PageMod({
include: ["*"],
contentScriptFile: ["resource://data/full_page.js"],
attachTo: ["top", "frame", "existing"],
onAttach: function(worker) {
Logger.log('---------> worker.url is ' + worker.url);
}
});
}
但是,我仍然看到第一次重新加载后连接了两个工作人员,第二次重新加载后连接了三个工作人员,依此类推。我确保我的监听器仅初始化一次。以前有人遇到过这个吗?是我使用方法不正确吗? 谢谢! 卢卡
最佳答案
不,你没有正确使用它。 pagemod 只需要设置一次。准备就绪后它会自动连接。您创建的页面 mod 将附加到每个新页面 (["*"]
)。每次加载新页面时,都会创建一个附加到每个新选项卡的新 pagemod...
如果您想在每个页面中插入内容脚本,只需删除就绪监听器即可。
mod = this.pageMod.PageMod({
include: ["*"],
contentScriptFile: ["./full_page.js"],
attachTo: ["top", "frame", "existing"],
onAttach: function(worker) {
Logger.log('---------> worker.url is ' + worker.url);
}
});
如果您想对特定选项卡使用就绪监听器,attach a script to the tab :
tabs.on('ready', function(tab) {
var worker = tab.attach({
contentScriptFile: ["./full_page.js"]
});
Logger.log('---------> worker.url is ' + worker.url);
}
关于javascript - pageMod 多次附加 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31083725/