首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >chrome.webNavigation.onCompleted -事件触发多次

chrome.webNavigation.onCompleted -事件触发多次
EN

Stack Overflow用户
提问于 2016-06-12 21:13:58
回答 2查看 3.9K关注 0票数 6

我加载了用于向页面注入代码的抄袭,清单代码:

代码语言:javascript
运行
复制
{
  "name": "any",
  "version": "1.0",
  "permissions": [
    "webNavigation",
    "*://*/*" 
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "manifest_version": 2
}

background.js:

代码语言:javascript
运行
复制
chrome.webNavigation.onCompleted.addListener(function(details) {
    chrome.tabs.executeScript(details.tabId, {
        code: 'console.log("A")'
    });
});

问题是事件在页面加载后触发几次,我希望事件只发生一次。我犯了什么错?如果你能帮忙我会很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-26 04:58:47

即使导航发生在子帧中,也会调用chrome.webNavigation.onCompleted。一种只捕获一次的方法是使用框架id的条件来实现代码。框架id =0对应于父帧。您的代码看起来应该是:

代码语言:javascript
运行
复制
chrome.webNavigation.onCompleted.addListener(function(tab) {
    if(tab.frameId==0){
    //logic
    }
});

这里有详细的文档:https://developers.chrome.com/extensions/webNavigation

票数 11
EN

Stack Overflow用户

发布于 2020-04-06 01:27:09

最佳实践是使用命名函数,在准备就绪时注册它们,从性能角度来看,只对请求的URL进行注册(如果可能的话)。在下一个示例中,如果筛选器包含URL,则侦听器将在注册之前被移除:

代码语言:javascript
运行
复制
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);

命名者应该遵循这样的模式:

代码语言:javascript
运行
复制
const onBeforeNavigate = (details) => {
    if (details.frameId > 0)
        return;
...
}

请参阅更多信息:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation/onCompleted

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37779142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档