sendMessage dari latar belakang ekstensi atau popup ke skrip konten tidak berfungsi

88

Saya tahu bahwa pertanyaan itu telah berulang kali ditanyakan dengan cara yang berbeda, tetapi saya mencoba untuk menjawab semua jawaban (semoga saya tidak melewatkan siapa pun) dan tidak ada yang berhasil untuk saya.

Ini kode ekstensi saya:

nyata:

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

Dua peringatan dari halaman latar belakang berfungsi, sedangkan salah satu content_script tidak.

pesan log konsol: Kesalahan port: Tidak dapat membuat koneksi. Akhir penerimaan tidak ada.

Dimana salahku

Kereta bawah tanah
sumber
Anda harus menggunakan chrome.tabs.sendMessage()untuk mengirim pesan ke skrip konten, bukan chrome.extension.sendMessage().
apsillers

Jawaban:

144

Di halaman latar belakang Anda, Anda harus menelepon

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

alih-alih menggunakan chrome.extension.sendMessageseperti yang Anda lakukan saat ini.

The chrome.tabsvarian mengirim pesan ke skrip konten, sedangkan chrome.extensionfungsi mengirim pesan ke semua komponen ekstensi lainnya.

apsillers
sumber
7
Terimakasih. Itu benar kecuali yang chrome.tabs.sendMessage harus menentukan tab mana yang akan dikirim . Jadi solusinya adalah ganti ke:chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
Subway
1
Jawaban ini telah membantu saya. Terima kasih banyak atas jawaban yang bermanfaat ini.
Touhid
13
apa yang harus ditulis untuk diterima di content-script.js?
Kushal Jain
5
@Kushal Saya baru saja menemukan ini. Dalam file JS script konten Anda, Anda akan ingin menambahkan event listener seperti ini: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); messageadalah parameter yang mengandung { action: "open_dialog_box" }atau apa pun yang Anda kirim. senderadalah objek yang berisi ID ekstensi Chrome Anda. sendResponseadalah parameter yang berisi function(response) {}atau fungsi apa pun yang Anda berikan untuk dipanggil setelah pesan ditangani.
jsea
6
Solusi ini tidak berhasil untuk saya. Saya mengikuti dokumentasi persis Saya menyalin semua kode dari developer.chrome.com/extensions/messaging Ini adalah contoh yang sangat sederhana tetapi tidak bisa melakukannya dengan benar. Mendapatkan kesalahan Tidak dapat membuat koneksi. Akhir penerimaan tidak ada. Ada ide
umsateesh
4

@apsiller benar. Juga jangan lupa untuk mengembalikan true di pemroses skrip konten Anda atau mungkin ditutup terlalu dini.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});
Ronan Ca
sumber
Ini memperbaikinya untuk saya - saya tidak mendapat tanggapan, tetapi menambahkan return truemembuatnya berfungsi.
rupertonline
0

Berikut adalah contoh skrip latar belakang yang mengirimkan pesan ke file skrip konten.

background.js

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

content-script / content.js

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

Kasus penggunaan saya memerlukan pengiriman pesan ke skrip latar belakang dari halaman web. Saya dulu chrome.runtime.onMessageExternalmenangkap pesan ini.

Di dalam pendengar ini saya pada dasarnya meneruskan pesan ke skrip konten saya sehingga bisa melakukan tugasnya, tetapi saya tidak tahu mengapa skrip konten saya pada pendengar onMessage tidak akan menangkap pesan tersebut.

Ternyata dengan menunggu 1 detik sebelum mengirim pesan dari halaman web (pada dasarnya saya melakukannya saat memuat) saya dapat melihat pesan mengenai skrip konten saya.

Nikita Jerschow
sumber