skrypt sendMessage z tła rozszerzenia lub wyskakującego okienka do zawartości nie działa

Wiem, że to pytanie było wielokrotnie zadawane na różne sposoby, ale starałam się przejrzeć wszystkie odpowiedzi (mam nadzieję, że nikogo nie przegapiłam) i żadna z nich nie zadziałała na mnie.

Oto Mój kod rozszerzenia:

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!");
  }
});

Dwa alerty strony tła działają, podczas gdy jeden z content_script nie.

Komunikat dziennika konsoli: Błąd portu: nie można nawiązać połączenia. Koniec odbioru nie istnieje.

Gdzie moja wina?
Author: wOxxOm, 2013-01-09

4 answers

Na twojej 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ć {[1] } tak jak obecnie.

Wariant chrome.tabs wysyła wiadomości do skryptów zawartości, podczas gdy funkcja chrome.extension wysyła wiadomości do wszystkich innych komponentów rozszerzenia.

 147
Author: apsillers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-09 20:31:58

@apsillers ma rację. Również nie zapomnij zwrócić true w treści-skrypt słuchacza lub może zamknąć zbyt wcześnie.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});
 7
Author: Ronan Ca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-04 16:52:23

Oto przykład skryptu w tle, który wysyła wiadomość do pliku content-script.

Tło.js

chrome.tabs.sendMessage(tabs[0].id,"your message"); 

Content-script/content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});
 0
Author: Saravanan Selvamohan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-19 10:45:08

Mój przypadek użycia wymagał wysłania wiadomości do skryptu tła ze strony internetowej. Użyłem chrome.runtime.onMessageExternal, aby złapać tę wiadomość.

Wewnątrz tego słuchacza w zasadzie przekazywałem wiadomość do mojego skryptu treści, aby mógł zrobić swoje, ale nie mogłem zrozumieć, dlaczego mój skrypt treści onmessage słuchacz nie złapie wiadomości.

Okazuje się, że czekając na 1 sekundę przed wysłaniem wiadomości ze strony (w zasadzie robiłem to przy ładowaniu), mogłem zobaczyć wiadomość / align = "left" /

 0
Author: Nikita Jerschow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-22 22:35:36