2015-07-20 118 views
1

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

注意:有趣的是,如果我关闭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) { 
        }); 
        }); 
       } 
      ); 
      }); 
      } 
     }) 
+2

看起来您每次调用背景脚本时都要添加一个侦听器。你是否多次拨打这个电话而没有删除旧的听众? – Brian

+0

@Brian Avoid回覆评论;你是对的,请把它作为答案。 – Xan

+0

@Xan对不起,并不是100%确定......将其添加为答案。 – Brian

回答

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”。

相关问题