Ich weiß, dass diese Frage wiederholt auf unterschiedliche Weise gestellt wurde, aber ich habe versucht, alle Antworten durchzugehen (hoffentlich habe ich niemanden vermisst), und keine davon hat für mich funktioniert.
Hier ist der Code meiner Erweiterung:
Manifest:
{
"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!");
}
});
Die beiden Warnungen der Hintergrundseite funktionieren, die des content_script nicht.
Meldung des Konsolenprotokolls: Portfehler: Verbindung konnte nicht hergestellt werden. Empfangsende existiert nicht.
Wo ist meine Schuld?
chrome.tabs.sendMessage()
, um Nachrichten an Inhaltsskripte zu senden, nichtchrome.extension.sendMessage()
.Antworten:
Auf Ihrer Hintergrundseite sollten Sie anrufen
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {}); });
anstatt
chrome.extension.sendMessage
wie bisher zu verwenden.Die
chrome.tabs
Variante sendet Nachrichten an Inhaltsskripte, während diechrome.extension
Funktion Nachrichten an alle anderen Erweiterungskomponenten sendet.quelle
chrome.tabs.sendMessage
muss, an welche Registerkarte es gesendet werden soll . Die Lösung lautet also: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
Ist der Parameter, der enthält{ action: "open_dialog_box" }
oder was auch immer Sie senden.sender
ist ein Objekt, das die ID Ihrer Chrome-Erweiterung enthält.sendResponse
ist der Parameter, derfunction(response) {}
oder welche Funktion Sie übergeben, die aufgerufen werden soll, sobald die Nachricht verarbeitet wurde.@apsillers ist korrekt. Vergessen Sie auch nicht, true in Ihrem Content-Script-Listener zurückzugeben, da es sonst möglicherweise zu früh geschlossen wird.
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { console.log(message) return true });
quelle