47

Ich weiß, dass die Frage wurde wiederholt auf verschiedene Arten gefragt, aber ich habe versucht, alle Antworten durchzugehen (hoffentlich habe ich niemanden vermisst) und keiner von ihnen hat für mich gearbeitet.Chrome-Erweiterung: sendMessage von Hintergrund zu Inhalt Skript funktioniert nicht

Hier ist der Code meiner Erweiterung:

manifestieren:

{ 
"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, während die von content_script nicht funktioniert.

Meldung des Konsolenprotokolls: Portfehler: Verbindung konnte nicht hergestellt werden. Empfangsende existiert nicht.

Wo ist meine Schuld?

+0

Sie sollten 'chrome.tabs.sendMessage()' verwenden, um Nachrichten an Inhaltsskripts zu senden, nicht an 'chrome.extension.sendMessage()'. – apsillers

Antwort

89

In Ihrem Hintergrund Seite sollten Sie

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ 
    chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {}); 
}); 

statt chrome.extension.sendMessage verwenden nennen, wie Sie gerade tun.

Die Variante chrome.tabs sendet Nachrichten an Inhaltsskripten, während die Funktion chrome.extension Nachrichten an alle anderen Erweiterungskomponenten sendet.

+4

Danke dir. Das stimmt, außer dass 'chrome.tabs.sendMessage' [muss angeben, an welchen Tab es gesendet werden soll] (http://developer.chrome.com/extensions/messaging.html). Die Lösung lautet also: chrome.tabs.query ({active: true}, function (tabs)) { \t \t chrome.tabs.sendMessage (tab.id, {aktion: "open_dialog_box"}, funktion (response) { \t \t \t}); \t \t}); ' – Subway

+1

Hoppla, ja, natürlich. Ich werde meine Antwort aktualisieren. – apsillers

+0

OK, ich habe die Bearbeitung, die ich der Frage hinzugefügt habe, entfernt. – Subway

Verwandte Themen