sendMessage dallo sfondo dell'estensione o dal popup allo script del contenuto non funziona


88

So che quella domanda è stata ripetutamente posta in modi diversi, ma ho cercato di esaminare tutte le risposte (spero di non essermi perso nessuno) e nessuna di queste ha funzionato per me.

Ecco il codice della mia estensione:

manifesto:

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

I due avvisi della pagina in background funzionano, mentre quello di content_script no.

messaggio del registro della console: Errore porta: impossibile stabilire la connessione. La fine della ricezione non esiste.

Dov'è colpa mia?


Dovresti usare chrome.tabs.sendMessage()per inviare messaggi a script di contenuto, non chrome.extension.sendMessage().
apsillers

Risposte:


144

Nella tua pagina di sfondo dovresti chiamare

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

invece di usare chrome.extension.sendMessagecome fai attualmente.

La chrome.tabsvariante invia messaggi agli script di contenuto, mentre la chrome.extensionfunzione invia messaggi a tutti gli altri componenti di estensione.


7
Grazie. È corretto tranne che chrome.tabs.sendMessage deve specificare a quale scheda inviarlo . Quindi la soluzione è cambiare in:chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
Metropolitana

1
Questa risposta mi ha aiutato. Grazie mille per questa utile risposta.
Touhid

13
cosa scrivere per ricevere su content-script.js?
Kushal Jain

5
@KushalJain L'ho appena capito. Nel file JS dello script di contenuto, ti consigliamo di aggiungere un listener di eventi come questo: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); messageè il parametro che contiene { action: "open_dialog_box" }o qualunque cosa invii. senderè un oggetto contenente l'ID dell'estensione di Chrome. sendResponseè il parametro che contiene function(response) {}o qualunque funzione tu passi da chiamare una volta che il messaggio è stato gestito.
jsea

6
Questa soluzione non ha funzionato per me. Sto seguendo esattamente la documentazione Ho copiato tutto il codice da developer.chrome.com/extensions/messaging Questo è un esempio molto semplice ma non sono riuscito a farlo bene. Ricezione dell'errore Impossibile stabilire la connessione. La fine della ricezione non esiste. Tutte le idee
umsateesh

4

@apsillers è corretto. Inoltre, non dimenticare di restituire true nel tuo listener di script di contenuto o potrebbe chiudersi troppo presto.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});

Questo ha risolto il problema per me: non ricevevo risposta, ma l'aggiunta return trueha funzionato.
rupertonline

0

Ecco un esempio di uno script in background che invia un messaggio al file di script di contenuto.

background.js

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

content-script / content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});

0

Il mio caso d'uso richiedeva l'invio di un messaggio allo script in background da una pagina web. Ho usato chrome.runtime.onMessageExternalper catturare questo messaggio.

All'interno di questo ascoltatore stavo sostanzialmente inoltrando il messaggio al mio script di contenuto in modo che potesse fare il suo dovere, ma non riuscivo a capire perché il mio script di contenuto sull'ascoltatore di messaggi non avrebbe catturato il messaggio.

Si scopre che aspettando 1 secondo prima di inviare il messaggio dalla pagina web (praticamente lo stavo facendo al caricamento) sono stato in grado di vedere il messaggio che colpisce il mio script di contenuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.