Chrome WebRequest - 添加Chrome事件侦听器一次

时间:2017-08-18 18:35:57

标签: javascript google-chrome-extension

问题

  • 我试图将标题传递给在。中运行的Chrome扩展程序 标签。目前我的代码,每次刷新页面时都会添加一个事件,这意味着如果您在同一页面上刷新5次,那么在每次页面加载时触发事件的次数为5次。

限制

  • 我必须使用后台脚本运行选项卡以允许用户访问 排除它运行的网站。
  • 为了获得我想要的特定标头,我必须使用后台扩展来监听,因为尝试重新请求资源是CORS并且可以访问减少的标头集。

代码

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    // Prevent double firing of event - extension should run once on complete.
    if (changeInfo.status == "complete") {          
         chrome.webRequest.onCompleted.addListener(
             function(details) {
                 console.log(details);
                 // Pseudo code, where things are pulled from storage
                 // Based on this I then:
                 executeScript(tabId, "built_seo_traffic.js");
             },
             {
                urls: ["*://*/*"],
                types: ["main_frame"],
                tabId: tab.id
            },
            ["responseHeaders"]
         );
    }
});

我尝试了什么

我已经尝试设置一个变量来检查事件是否已经被触发,但是我只能这样做,所以脚本然后在所有选项卡上运行一次,而不是在每个选项卡上运行一次。

我是否正确处理了这个问题?我只是遗漏了让事情变得简单的事情?

1 个答案:

答案 0 :(得分:0)

感谢@wOxxOm,我设法得到了以下解决方案:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    // Prevent double firing of event - extension should run once on complete.
    if (changeInfo.status == "complete") {          
         chrome.webRequest.onCompleted.addListener(
             executeTrafficLights,
             {
                urls: ["*://*/*"],
                types: ["main_frame"],
                tabId: tab.id
            },
            ["responseHeaders"]
         );
    }
});


executeTrafficLights(details){
    console.log(details);
    // Pseudo code, where things are pulled from storage
    // Based on this I then:
    executeScript(tabId, "built_seo_traffic.js");

    // Then remove self after executing
    chrome.webRequest.onCompleted.removeListener(executeTrafficLights);
}

值得注意的是,我一直在努力的部分是因为命名函数只能在没有参数的情况下调用,所以我不知道如何传入tabId和tab。

将我需要的信息(tabId和URL)都显示在详细信息对象中。

不确定tab中是否包含details中没有的任何其他信息,但对我而言,这种信息效果很好!