2017-09-14 2 views
-1

je le code suivant dans mes popup.js:Comment empêcher l'extension Chrome pour ajouter des écouteurs plusieurs

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);}); 
    } 
    } 
); 

Lorsqu'un utilisateur ouvre plusieurs onglets ce qui conduit à avoir plusieurs événements addListener lorsque l'utilisateur décide de cliquer sur le l'action du navigateur.

background.js ressemble à ceci:

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

J'ai essayé plusieurs choses mais n'ont pas été en mesure de le faire fonctionner correctement. J'ai expérimenté avec hasListener et removeListener comme décrit ici: https://developer.chrome.com/apps/events mais ne pouvait pas le faire fonctionner. Je ne suis pas sûr de savoir comment utiliser removeListener. J'ai ajouté à la fin de la fonction requestEvents (dans popup.js) mais cela n'a pas semblé supprimer l'écouteur. Je ne sais pas non plus comment vérifier quels écouteurs sont actuellement ajoutés.

Que dois-je faire pour éviter d'ajouter plusieurs écouteurs lors de l'ouverture de plusieurs onglets?

EDIT: En content.js J'ai:

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") 

Comme on peut le voir ci-dessus le code I injectent popup.html dans un site Web.

popup.html ressemble à ce

<!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"> 
    ... 

La question est de savoir comment on empêcher l'ajout de plusieurs auditeurs lors de l'ouverture de plusieurs onglets? Toutes les réponses seraient appréciées ...

+2

Attendez, c'est quoi popup.js? Où est-il chargé? De toute façon, je pense que vous pouvez simplement vérifier sender.tab && sender.tab.id === tabs [0] .id – wOxxOm

+1

"J'ai expérimenté avec hasListener et removeListener comme décrit ici: https://developer.chrome.com/apps/ événements, mais n'a pas pu le faire fonctionner. " Qu'avez-vous essayé? Quelles erreurs avez-vous eu? – pvg

+2

S'il vous plaît [modifier] la question à être sur le sujet: inclure un [mcve] qui * duplique le problème *. Pour les extensions Chrome ou Firefox WebExtensions, vous devez presque toujours inclure votre * manifest.json * et une partie de l'arrière-plan, du contenu et/ou des scripts contextuels/HTML, et souvent des HTML/scripts de pages Web. Des questions sur l'aide au débogage («Pourquoi mon code ne fonctionne-t-il pas comme je le souhaite?") doit inclure: (1) le comportement désiré, (2) un problème ou une erreur spécifique et (3) le code le plus court nécessaire pour le reproduire * dans la question elle-même * Voir aussi: [Quels sujets puis-je poser ici? ?] (/ help/on-topic), et [ask] – Makyen

Répondre

1

Vous avez cette background.js:

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

Ce interrogera l'onglet actif, mais envoyer un message à tous les auditeurs. Selon docs:

Si vous envoyez à votre poste, l'événement runtime.onMessage sera tiré dans chaque cadre de votre poste (sauf pour le cadre de l'expéditeur)

Essayez de remplacer chrome.runtime.sendMessage({task: "showPopup"}); avec chrome.tabs.sendMessage(tabs[0].id,{task: "showPopup"}) à envoyer le message à seulement l'onglet actif.

En dehors de cela, vous incluez 2 auditeurs de messages par page: un dans content.js (que je suppose est un script de contenu) et un autre dans popup.js qui est chargé lorsque vous insérez popup.html dans un iframe dans la page web.

+0

Merci pour votre réponse. Je crois qu'il a résolu mon problème (j'ai essayé de le changer avant et de mémoire cela n'a pas fonctionné -> mais j'ai essayé encore maintenant et il semble qu'il fait - probablement n'a pas bien testé la première fois). Je vais le laisser courir pendant un jour quand je visite des sites Web, si tout est bon - et il semble que c'est - j'accepterai votre réponse et vous donnerai 200 crédits. Merci encore Ivan. p.s. Est-ce qu'il y a quelque chose qui ne va pas avec deux écouteurs de message en même temps ou que vouliez-vous suggérer ...? :) – necker

+1

@necker Non, il n'y a rien de mal à avoir autant d'auditeurs que vous le souhaitez. Je l'ai trouvé un peu étrange, mais si ça correspond à l'architecture de votre extension, tout va bien. Heureux d'aider :) –

+0

Tout fonctionne bien donc bravo Iván! :) – necker