我在处理扩展程序时遇到过此问题。我正在基于tab ready事件将pageMod附加到页面上以修改页面内容,但是当我重新加载页面时,worker似乎再次连接,所以在1次重新加载后它会为同一个url加载2个worker (没有iframes),在2次重新加载后,它加载了3个工人,等等。这是我开始使用的初始代码(我将其从更大的块中删除):
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);
}
});
}
通过在ready事件处理程序的最开头附加此代码,我可以通过在每个ready事件上销毁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);
}
});
}
但是,我仍然看到两个工作人员在第一次重新加载后被连接,三次在第二次重新加载后等等。我确保我的监听器只被初始化了一次。以前有人遇到过这个吗?我没有正确使用它吗? 谢谢! 卢卡
答案 0 :(得分:1)
不,你没有正确使用它。只需设置一次pagemod即可。它会自动连接就绪。您创建的页面模型将附加到每个新页面(["*"]
)。每次加载新页面时,都会创建一个新的pagemod,它附加到每个新标签页......
如果要在每个页面中插入内容脚本,只需删除准备好的侦听器。
mod = this.pageMod.PageMod({
include: ["*"],
contentScriptFile: ["./full_page.js"],
attachTo: ["top", "frame", "existing"],
onAttach: function(worker) {
Logger.log('---------> worker.url is ' + worker.url);
}
});
如果您想使用针对特定标签的on ready listener,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);
}