sendMessage vom Erweiterungshintergrund oder Popup zum Inhaltsskript funktioniert nicht

86

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?

U-Bahn
quelle
Sie sollten verwenden chrome.tabs.sendMessage(), um Nachrichten an Inhaltsskripte zu senden, nicht chrome.extension.sendMessage().
Apsiller

Antworten:

141

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.sendMessagewie bisher zu verwenden.

Die chrome.tabsVariante sendet Nachrichten an Inhaltsskripte, während die chrome.extensionFunktion Nachrichten an alle anderen Erweiterungskomponenten sendet.

Apsiller
quelle
6
Danke. Das ist richtig, außer dass angegeben werden 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) { }); });
U-Bahn
1
Diese Antwort hat mir geholfen. Vielen Dank für diese nützliche Antwort.
Touhid
13
Was soll geschrieben werden, um auf content-script.js zu empfangen?
Kushal Jain
5
@KushalJain Ich habe das gerade herausgefunden. In Ihrer Inhaltsskript-JS-Datei möchten Sie einen Ereignis-Listener wie den folgenden hinzufügen: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); messageIst der Parameter, der enthält { action: "open_dialog_box" }oder was auch immer Sie senden. senderist ein Objekt, das die ID Ihrer Chrome-Erweiterung enthält. sendResponseist der Parameter, der function(response) {}oder welche Funktion Sie übergeben, die aufgerufen werden soll, sobald die Nachricht verarbeitet wurde.
Jsea
5
Diese Lösung hat bei mir nicht funktioniert. Ich folge der Dokumentation genau. Ich habe den gesamten Code von developer.chrome.com/extensions/messaging kopiert. Dies ist ein sehr einfaches Beispiel, konnte es aber nicht richtig machen. Fehler erhalten Verbindung konnte nicht hergestellt werden. Empfangsende existiert nicht. Irgendwelche Ideen
umsateesh
0

@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
});
Ronan Ca.
quelle