2017-09-14 36 views
-1

我在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和removeListener,如下所述:https://developer.chrome.com/apps/events但无法使其工作。我不知道我应该如何使用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"> 
    ... 

所以现在的问题是怎样防止打开多个标签时添加多个监听器? 任何答案,将不胜感激......

+2

等等,什么是popup.js?它在哪里加载?无论如何,我认为你可以简单地检查sender.tab && sender.tab.id ===选项卡[0] .id – wOxxOm

+1

“我尝试使用hasListener和removeListener,如下所述:https://developer.chrome.com/apps/事件,但无法让它工作。“你尝试了什么?你得到了什么错误? – pvg

+2

请将[问题]置于主题上:包括[重复问题*的[mcve]]。对于Chrome扩展程序或Firefox Web扩展程序,几乎总是需要包含* manifest.json *和一些背景,内容和/或弹出脚本/ HTML以及常用的网页HTML /脚本。寻求调试的问题帮助(“为什么我的代码不按我想要的方式工作?“)必须包括:(1)期望的行为,(2)特定的问题或错误,以及(3)在问题本身中重现*所需的最短代码*。另请参阅:[我可以在此处询问哪些主题?](/ help/on-topic)和[ask]。 – Makyen

回答

1

你有这样的background.js

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

这将查询活动标签,而是将消息发送到所有侦听器。据docs

如果发送给您的延长,runtime.onMessage活动将 在扩展的每一帧发射(除发送方的帧)

尝试用chrome.tabs.sendMessage(tabs[0].id,{task: "showPopup"})更换chrome.runtime.sendMessage({task: "showPopup"});到只将消息发送到活动选项卡。

除此之外,你是包括每个网页2个消息监听器:一个在content.js(我认为是一个内容脚本),另一种在popup.js当你在网页的iframe插入popup.html是被加载。

+0

谢谢你的回答。我相信它解决了我的问题(我实际上尝试过在改变之前和从内存中改变它不起作用 - >但我现在再试一次,它看起来像它 - 可能第一次没有很好地测试)。当我访问网站时,我会让它运行一天,如果一切都很好 - 它看起来就是这样 - 我会接受你的答案并给你200分。再次感谢你伊万。附:有两个消息侦听器在同一时间有什么问题,或者你想提示什么? :) – necker

+1

@necker不,没有错,有尽可能多的听众,因为你想。我发现它有点奇怪,但如果它适合你的扩展的架构,那就很好。高兴地帮助:) –

+0

所有的作品都很好,所以布拉沃伊万! :) – necker

相关问题