Google chrome extension 如何防止Chrome扩展添加多个侦听器

Google chrome extension 如何防止Chrome扩展添加多个侦听器,google-chrome-extension,Google Chrome Extension,我的popup.js中有以下代码: function setDomain(domain) { $.ajax({ url: "http://example.com/api/" + domain, type: "GET", success: function (returnedData) { //do sth with returnedData } }) } chrome.runtime.

我的popup.js中有以下代码:

function setDomain(domain) {      
   $.ajax({
        url: "http://example.com/api/" + domain,
        type: "GET",
        success: function (returnedData) {
          //do sth with returnedData
        }
   })
}


chrome.runtime.onMessage.addListener(
  function requestEvents(request, sender, sendResponse) {

    if (request.task==="showPopup"){
         chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {
         chrome.tabs.sendMessage(tabs[0].id, {from: 'popup', subject: 'domainName'}, setDomain);});
    }
  }
);
当用户打开多个选项卡时,当用户决定单击浏览器操作时,会导致多个addListener事件

background.js如下所示:

chrome.browserAction.onClicked.addListener(function(){
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.runtime.sendMessage({task: "showPopup"});
  })
});

我尝试了多种方法,但都无法使其正常工作。我尝试了hasListener和RemovelListener,如这里所述:但无法让它工作。我不确定如何使用removeListener。我在函数requestEvents(在popup.js中)的末尾添加了它,但它似乎没有删除侦听器。也不知道如何检查当前附加了哪些侦听器

在打开多个选项卡时,应如何防止添加多个侦听器

编辑: 在content.js中,我有:

chrome.runtime.onMessage.addListener(function (msg, sender, response) {
  if ((msg.from === 'popup') && (msg.subject === 'domainName')) {
    var domainName = document.domain;
    domainName = extractDomain(domainName)
    response(domainName)
  }
}

var iframe = document.createElement('iframe');
iframe.id="iframe-pl"
iframe.frameBorder = "none";
iframe.src = chrome.extension.getURL("popup.html")
从上面的代码中可以看出,我将popup.html注入了一个网站

popup.html如下所示

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="popup.js"></script>
    <script type="text/javascript" src="jquery-3.2.0.min.js"></script>
    <link href="stylesheets/stylesheet.css" rel="stylesheet">
    <link href="stylesheets/font-awesome-4.7.0/css/font-awesome.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css?family=Ubuntu|Hind|Varela|Lato:300,400,500,600,700,900", rel="stylesheet", type="text/css">
  </head>
  <body>
  <div class="title white">
    ...

...
因此,问题是如何防止在打开多个选项卡时添加多个侦听器?
任何答案都将不胜感激……

您有此背景。js

chrome.browserAction.onClicked.addListener(function(){
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.runtime.sendMessage({task: "showPopup"});
  })
});
这将查询活动选项卡,但会向所有侦听器发送消息。根据:

如果发送到扩展,runtime.onMessage事件将 在扩展的每个帧中激发(发件人帧除外)

尝试替换
chrome.runtime.sendMessage({task:“showPopup”})
使用
chrome.tabs.sendMessage(tabs[0].id,{task:“showPopup”})
只向活动选项卡发送消息


除此之外,每个网页还包括两个消息侦听器:一个在
content.js
(我假设是一个内容脚本)中,另一个在
popup.js
中,当您在网页的iframe中插入
popup.html
时,会加载该侦听器。

等等,什么是popup.js?在哪里装的?无论如何,我认为您可以简单地检查sender.tab&&sender.tab.id==tabs[0].id“我尝试了hasListener和RemovelListener,如这里所述:但无法使其工作。”您尝试了什么?你犯了什么错误?请回答主题中的问题:包括重复该问题的问题。对于Chrome扩展或Firefox WebExtensions,您几乎总是需要包含manifest.json和一些背景、内容和/或弹出脚本/HTML,通常还有网页HTML/scripts。寻求调试帮助的问题(“为什么我的代码没有按我想要的方式工作?”)必须包括:(1)所需的行为,(2)特定的问题或错误,(3)在问题本身中重现它所需的最短代码。请参见:,和。我在content.js和popup.html中添加了我的内容@当用户单击浏览器操作时,我加载popup.js——或者我是这么想的?它可能会在每次打开新选项卡时加载。。。1.选项卡已打开。2.Content.js脚本加载一个选项卡,并插入popup.js。3.添加popup.js中的侦听器以侦听background.js“show popup”中的消息。-->看起来每次用户单击浏览器操作(我想)时都会添加第三步侦听器。所以我的问题是如何防止在popup.js中添加多个侦听器?@pvg我添加了:chrome.extension.onRequest.removeListener(requestEvents);在popup.js函数requestEvents中的不同位置。它没有抛出任何错误,但似乎也没有删除侦听器。由于多次调用setDomain方法。。。我可能不知道如何正确使用removeListener方法?谢谢你的回答。我相信它解决了我的问题(事实上,我以前尝试过改变它,但从记忆中看它不起作用->但是我现在又尝试了一次,它看起来起作用了-第一次可能没有很好地测试)。我会让它运行一天,当我访问网站,如果一切都是好的-它看起来是-我会接受你的答案,给你200学分。再次感谢你,伊万。p、 在美国,同时有两个消息侦听器是否有问题,或者您想提示什么…?:)@内克尔:不,有你想要的那么多听众没什么错。我只是觉得有点奇怪,但如果它适合您的扩展架构,那就好了。很乐意帮忙:)@necker我很高兴一切正常。快乐编码!