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
background
google-chrome-extension
sendmessage
content-script
Kereta bawah tanah
sumber
sumber
chrome.tabs.sendMessage()
untuk mengirim pesan ke skrip konten, bukanchrome.extension.sendMessage()
.Jawaban:
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.sendMessage
seperti yang Anda lakukan saat ini.The
chrome.tabs
varian mengirim pesan ke skrip konten, sedangkanchrome.extension
fungsi mengirim pesan ke semua komponen ekstensi lainnya.sumber
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) { }); });
chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } );
message
adalah parameter yang mengandung{ action: "open_dialog_box" }
atau apa pun yang Anda kirim.sender
adalah objek yang berisi ID ekstensi Chrome Anda.sendResponse
adalah parameter yang berisifunction(response) {}
atau fungsi apa pun yang Anda berikan untuk dipanggil setelah pesan ditangani.@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 });
sumber
return true
membuatnya berfungsi.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); });
sumber
Kasus penggunaan saya memerlukan pengiriman pesan ke skrip latar belakang dari halaman web. Saya dulu
chrome.runtime.onMessageExternal
menangkap 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.
sumber