Déclenchez chrome.browserAction.onCliqueté avec une fonction

Je veux déclencher le clic, auquel le code suivant écoute:

chrome.browserAction.onClicked.addListener(function(tab) {});

La raison en est que j'ai une extension fonctionnelle, qui écoute dans un script d'arrière-plan (l'addListener ci-dessus) et exécute quelques scripts sur le clic:

 chrome.browserAction.onClicked.addListener(function(tab) { chrome.tabs.executeScript(tab.id, {file: 'abc.js'}); chrome.tabs.executeScript(tab.id, {file: 'xxx.js'}); }); 

Et maintenant, je veux déclencher cette "onClicked" à partir d'un menu contextuel:

 var myContextPage = chrome.contextMenus.create({"title": myTitle, "contexts":["page"], "onclick": fctContext}); 

Donc, je pensais que la façon la plus simple serait d'avoir "cliquer" dans fctContext. Peut-être y a-t-il une meilleure façon, mais je ne peux pas résoudre mon problème. J'ai également essayé d'exécuter "executeScript", mais cela ne fonctionne pas non plus.

Merci d'avance!

//Mettre à jour

Solution des réponses: cette solution fonctionne:

 //Shared code. When the argument length is two, it is coming from the context // menu, while a single argument is coming from the browser action. function fctContext() { var tab = arguments.length == 2 ? arguments[1] : arguments[0]; // Do whatever you want with the tab. } // Browser Action chrome.browserAction.onClicked.addListener(fctContext); // Context Menu chrome.contextMenus.create({ title: myTitle, contexts: ['page'], onclick: fctContext }); 

Solution après avoir testé d'autres choses:

 function fctStart() { chrome.tabs.getSelected(null, function(tab){ chrome.tabs.executeScript(tab.id, {file: 'abc.js'}); chrome.tabs.executeScript(tab.id, {file: 'xxx.js'}); }); } 

Dans ce cas, fctStart() fonctionne à partir de n'importe quel point sans avoir à passer l'onglet.

Rappelez-vous que les arguments sont facultatifs en JavaScript. Chaque fonction a un objet arguments associé. Ces arguments servent de tableau. Dans votre cas, l'un d'entre eux exige que l'autre ne le soit pas. Avoir des arguments N est identique dans une fonction (Action du navigateur) que d'avoir des arguments M dans l'autre (Menu contextuel), la seule différence entre ces deux arguments est la arguments.callee qui fournit un moyen de référencer le code réel dans la fonction elle-même . Vous ne devez pas vous en soucier si vous voulez quelque chose de basique.

Votre fctContext pourrait être le code partageable entre votre clic d'action du navigateur et votre menu contextuel. J'ai fait quelque chose de similaire dans l'extension Reload All Tabs.

Recherchez this.reload dans https://github.com/mohamedmansour/reload-all-tabs-extension/blob/master/js/reload_controller.js , vous remarquerez que this.reload est utilisé pour le menu contextuel et le Action du navigateur. Vous partagez simplement le code.

MISE À JOUR avec l'exemple d'arguments cuit dans:

Dans votre cas, vous faites exactement la même chose.

 // Shared code. When the argument length is two, it is coming from the context // menu, while a single argument is coming from the browser action. function fctContext() { var tab = arguments.length == 2 ? arguments[1] : arguments[0]; // Do whatever you want with the tab. } // Browser Action chrome.browserAction.onClicked.addListener(fctContext); // Context Menu chrome.contextMenus.create({ title: myTitle, contexts: ['page'], onclick: fctContext }); 

Le problème avec l'approche ci-dessus est la facilité de maintenance, si l'API change, elle pourrait se briser. Personnellement, je préférerais préciser les arguments. Donc, l'utilisateur n'a pas à faire une recherche dans le tableau des arguments.

 function fctContext(tab) { // Do whatever you want with the tab. } // Browser Action chrome.browserAction.onClicked.addListener(fctContext); // Context Menu chrome.contextMenus.create({ title: myTitle, contexts: ['page'], onclick: function (detail, tab) { fctContext(tab) } }); 

J'espère que cela pourra aider!

Dans votre exemple particulier, vous n'avez pas besoin de passer tab.id car il serait par défaut à la page actuelle de toute façon:

 function fctContext() { chrome.tabs.executeScript(null, {file: 'abc.js'}); chrome.tabs.executeScript(null, {file: 'xxx.js'}); } 

Si vous avez besoin de l'onglet, procédez comme suit:

 function fctContext(tab) { chrome.tabs.executeScript(tab.id, {file: 'abc.js'}); chrome.tabs.executeScript(tab.id, {file: 'xxx.js'}); } chrome.browserAction.onClicked.addListener(fctContext); chrome.contextMenus.create({"title": myTitle, "contexts":["page"], "onclick": function(info, tab) { fctContext(tab); }});