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

时间:2016-06-12 21:13:59

标签: javascript google-chrome-extension

我将Inject代码的plagin加载到页面,清单代码:

Vector3.Reflect()

background.js:

{
  "name": "any",
  "version": "1.0",
  "permissions": [
    "webNavigation",
    "*://*/*" 
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "manifest_version": 2
}

问题是在页面加载后触发了几次事件,我希望事件只有一次。我的错是什么? 我将不胜感激任何帮助。

2 个答案:

答案 0 :(得分:1)

最佳做法是使用 命名函数 ,并在准备就绪时注册它们,并且从性能的角度来看,仅对请求的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

答案 1 :(得分:0)

即使在子帧中进行导航,也会调用

chrome.webNavigation.onCompleted。仅捕获一次的一种方法是使用框架ID条件实现代码。 frame id = 0对应于父帧。您的代码如下:

chrome.webNavigation.onCompleted.addListener(function(tab) {
    if(tab.frameId==0){
    //logic
    }
});

可在此处找到详细文档:https://developers.chrome.com/extensions/webNavigation