我加载了用于向页面注入代码的抄袭,清单代码:
{
"name": "any",
"version": "1.0",
"permissions": [
"webNavigation",
"*://*/*"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"manifest_version": 2
}
background.js:
chrome.webNavigation.onCompleted.addListener(function(details) {
chrome.tabs.executeScript(details.tabId, {
code: 'console.log("A")'
});
});
问题是事件在页面加载后触发几次,我希望事件只发生一次。我犯了什么错?如果你能帮忙我会很感激。
发布于 2019-06-26 04:58:47
即使导航发生在子帧中,也会调用chrome.webNavigation.onCompleted。一种只捕获一次的方法是使用框架id的条件来实现代码。框架id =0对应于父帧。您的代码看起来应该是:
chrome.webNavigation.onCompleted.addListener(function(tab) {
if(tab.frameId==0){
//logic
}
});
这里有详细的文档:https://developers.chrome.com/extensions/webNavigation
发布于 2020-04-06 01:27:09
最佳实践是使用命名函数,在准备就绪时注册它们,从性能角度来看,只对请求的URL进行注册(如果可能的话)。在下一个示例中,如果筛选器包含URL,则侦听器将在注册之前被移除:
if (filter.url.length < 1) {
resolve(dictionary);
return;
}
if (chrome.webNavigation.onBeforeNavigate.hasListener(onBeforeNavigate))
chrome.webNavigation.onBeforeNavigate.removeListener(onBeforeNavigate);
chrome.webNavigation.onBeforeNavigate.addListener(onBeforeNavigate, filter);
命名者应该遵循这样的模式:
const onBeforeNavigate = (details) => {
if (details.frameId > 0)
return;
...
}
请参阅更多信息:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation/onCompleted
https://stackoverflow.com/questions/37779142
复制相似问题