Je sais que cette question a été posée à plusieurs reprises de différentes manières, mais j'ai essayé de parcourir toutes les réponses (j'espère que je n'ai manqué personne) et aucune d'elles n'a fonctionné pour moi.
Voici le code de mon extension:
manifeste:
{
"name": "test",
"version": "1.1",
"background":
{
"scripts": ["contextMenus.js"]
},
"permissions": ["tabs", "<all_urls>", "contextMenus"],
"content_scripts" : [
{
"matches" : [ "http://*/*" ],
"js": ["jquery-1.8.3.js", "jquery-ui.js"],
"css": [ "jquery-ui.css" ],
"js": ["openDialog.js"]
}
],
"manifest_version": 2
}
contextMenus.js
function onClickHandler(info, tab) {
if (info.menuItemId == "line1"){
alert("You have selected: " + info.selectionText);
chrome.extension.sendMessage({action:'open_dialog_box'}, function(){});
alert("Req sent?");
}
}
chrome.contextMenus.onClicked.addListener(onClickHandler);
chrome.runtime.onInstalled.addListener(function() {
chrome.contextMenus.create({"id": "line1", "type": "normal", "title": "I'm line 1", "contexts":["selection"]});
});
openDialog.js
chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.action == 'open_dialog_box') {
alert("Message recieved!");
}
});
Les deux alertes de la page d'arrière-plan fonctionnent, contrairement à celle de content_script.
message du journal de la console: Erreur de port: impossible d'établir la connexion. La fin de réception n'existe pas.
Où est ma faute?
chrome.tabs.sendMessage()
pour envoyer des messages aux scripts de contenu, paschrome.extension.sendMessage()
.Réponses:
Dans votre page de fond, vous devez appeler
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {}); });
au lieu d'utiliser
chrome.extension.sendMessage
comme vous le faites actuellement.La
chrome.tabs
variante envoie des messages aux scripts de contenu, tandis que lachrome.extension
fonction envoie des messages à tous les autres composants d'extension.la source
chrome.tabs.sendMessage
doit spécifier l'onglet auquel l'envoyer . La solution est donc de changer pour:chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } );
message
est le paramètre contenant{ action: "open_dialog_box" }
ou ce que vous envoyez.sender
est un objet contenant l'identifiant de votre extension Chrome.sendResponse
est le paramètre contenantfunction(response) {}
ou n'importe quelle fonction que vous transmettez pour être appelée une fois le message traité.@apsillers a raison. N'oubliez pas non plus de renvoyer true dans votre écouteur de script de contenu ou il pourrait se fermer trop tôt.
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { console.log(message) return true });
la source