由Chrome扩展程序背景页以编程方式注入的内容脚本多次注入

时间:2014-04-10 12:21:37

标签: google-chrome-extension

我有一个chrome扩展名,说它将内容脚本a.js注入到匹配“http://example.com/ *”的网址中。然后,当我单击example.com页面中的某些页面元素时,a.js会要求后台创建一个带有已定义url的新选项卡,并以编程方式将内容脚本b.js注入新选项卡,您可以检查代码: / p>


chrome.tabs.create({
    url: 'http://example.com'
}, function (tab) {
    var taskTab = tab.id;
    chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
        if (tabId === taskTab) {
            chrome.tabs.executeScript(taskTab, {
                file: 'scripts/b.js'
            });
        }
    });
});

问题是,内容脚本b.js会被注入新标签很多次。我也尝试了chrome.webNavigation,结果是一样的。

所以,如果我想将b.js只注入新标签一次?我该怎么做?

顺便说一句,b.js实际上是一个远程文件,我把它加载到jQuery页面,这里简化了我把它变成本地文件的问题。

非常感谢。

更新

我弄清楚我的代码发生了什么。

首先,我将onUpdated事件监听器包装在create回调中是错误的,每次创建新选项卡,关闭它,再次创建它,事件监听器都会绑定一个更多时间。越多越多。

其次,@ Xan是对的,我可以通过检查changeInfo.status来做到这一点。所以代码是:


var taskTab;
chrome.tabs.create({
    url: 'http://example.com'
}, function (tab) {
    taskTab = tab.id;
});
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
  if (changeInfo.status === 'complete'){
    if (tabId === taskTab) {
       chrome.tabs.executeScript(taskTab, {
            file: 'scripts/b.js'
        });
    }
  }
});

b.js只会被注入一次,无论是本地文件还是jQuery加载的远程文件。

1 个答案:

答案 0 :(得分:1)

  1. onUpdated事件可能会因为很多原因而触发:

      

    object changeInfo

         

    列出对已更新的选项卡状态的更改。

         

    string (optional) status:标签的状态。可以加载也可以完成。

         

    string (optional) url:标签的网址(如果已更改)。

         

    boolean (optional) pinned:标签的新固定状态。

         

    string (optional) favIconUrl:标签的新favicon网址。

    您可能希望按onUpdated

  2. 的属性过滤changeInfo个事件
  3. 故障安全方法:当您注入第二个脚本时,请在执行脚本的其余部分之前设置一些为undefined检查的保护变量。注入脚本的任何其他尝试都将在相同的上下文中,并将看到变量集。有点像C #ifndef包括。