Chrome扩展程序代码(邮件传递?)执行多次

时间:2015-07-20 20:49:26

标签: google-chrome google-chrome-extension gmail-api

使用Chrome的OAuth构建我的第一个Chrome扩展程序(适用于Gmail)。当我运行以下代码时,它经常执行多次。从background.js传递到content.js的“Hi”消息在刷新页面时多次注销,并且通常不止一次从background.js文件中注销“HERE”。当我从不同的页面转到gmail时,似乎没有复制该行为,而只是在我刷新gmail时。我猜这与“onUpdated”事件监听器有关,但我不明白为什么它会多次执行。

注意:有趣的是,如果我关闭gmail,刷新我的background.js文件,然后重新打开gmail(或刷新它),代码似乎只执行一次。

Content.js

chrome.runtime.sendMessage({data: "hello"}, function(response) {
});

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  console.log(sender.tab ?
              "from a content script:" + sender.tab.url :
              "from the extension");
  if (request.data)
    console.log(request.data)
});

Background.js

 chrome.tabs.onUpdated.addListener( function (tabId, changeInfo, tab) {
          if (changeInfo.status == 'complete') {
            chrome.identity.getAuthToken({ 'interactive': true }, function(token) {
              chromeIdentityToken = token
              chrome.runtime.onMessage.addListener(
                function(request,sender,sendResponse){
                  console.log("HERE")

                  <Program code>

                  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
                    chrome.tabs.sendMessage(tabs[0].id, {data: "Hi"}, function(response) {
                    });
                  });
                }
              );
            });
          }
        })

1 个答案:

答案 0 :(得分:1)

添加侦听器时,您需要确保只添加一次。看起来你多次添加一个监听器,而没有清理旧的监听器,它不会覆盖旧的监听器,只是不断添加更多的监听器。

例如:

chrome.runtime.onMessage.addListener(
    function(request,sender,sendResponse){
        console.log("HERE")
    });
chrome.runtime.onMessage.addListener(
    function(request,sender,sendResponse){
        console.log("HERE2")
    });

在这种情况下,第二个侦听器不会覆盖第一个侦听器;你会打印“HERE”和“HERE2”。