Wiem, że to pytanie było wielokrotnie zadawane na różne sposoby, ale próbowałem przejść przez wszystkie odpowiedzi (mam nadzieję, że nikogo nie przegapiłem) i żadna z nich nie zadziałała.
Oto kod mojego rozszerzenia:
oczywisty:
{
"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!");
}
});
Dwa alerty strony w tle działają, a jeden z content_script nie.
komunikat dziennika konsoli: Błąd portu: nie można nawiązać połączenia. Koniec odbierający nie istnieje.
Gdzie moja wina?
chrome.tabs.sendMessage()
do wysyłania wiadomości do skryptów zawartości, a niechrome.extension.sendMessage()
.Odpowiedzi:
Na swojej stronie w tle powinieneś zadzwonić
chrome.tabs.query({active: true, currentWindow: true}, function(tabs){ chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {}); });
zamiast używać
chrome.extension.sendMessage
tak, jak obecnie.chrome.tabs
Wariant wysyła wiadomości do skryptów treści, podczas gdychrome.extension
funkcja wysyła wiadomości do wszystkich innych komponentów rozszerzających.źródło
chrome.tabs.sendMessage
musi określać, do której karty wysłać . Więc rozwiązaniem jest zmiana na: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
to parametr zawierający{ action: "open_dialog_box" }
lub cokolwiek wysyłasz.sender
to obiekt zawierający identyfikator rozszerzenia Chrome.sendResponse
to parametr zawierającyfunction(response) {}
lub jakąkolwiek funkcję, którą przekazujesz, która ma zostać wywołana po obsłużeniu wiadomości.@apsillers jest poprawne. Nie zapomnij również zwrócić wartości true w odbiorniku content-script, w przeciwnym razie może on zamknąć się zbyt wcześnie.
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { console.log(message) return true });
źródło
return true
sprawiło, że zadziałało.