我在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">
...
所以现在的问题是怎样防止打开多个标签时添加多个监听器? 任何答案,将不胜感激......
等等,什么是popup.js?它在哪里加载?无论如何,我认为你可以简单地检查sender.tab && sender.tab.id ===选项卡[0] .id – wOxxOm
“我尝试使用hasListener和removeListener,如下所述:https://developer.chrome.com/apps/事件,但无法让它工作。“你尝试了什么?你得到了什么错误? – pvg
请将[问题]置于主题上:包括[重复问题*的[mcve]]。对于Chrome扩展程序或Firefox Web扩展程序,几乎总是需要包含* manifest.json *和一些背景,内容和/或弹出脚本/ HTML以及常用的网页HTML /脚本。寻求调试的问题帮助(“为什么我的代码不按我想要的方式工作?“)必须包括:(1)期望的行为,(2)特定的问题或错误,以及(3)在问题本身中重现*所需的最短代码*。另请参阅:[我可以在此处询问哪些主题?](/ help/on-topic)和[ask]。 – Makyen