Menghantar Mesej daripada Skrip Latar Belakang ke Skrip Kandungan, dan Kemudian ke Skrip yang Disuntik
Masalah:
Walaupun cuba menghantar mesej dari halaman latar belakang ke skrip kandungan dan kemudian ke skrip yang disuntik, proses itu gagal berfungsi seperti yang diharapkan. Skrip kandungan tidak dapat menerima mesej daripada skrip latar belakang.
Penyelesaian:
Isu timbul daripada cara skrip kandungan disuntik. Apabila sambungan dimuatkan, ia tidak menyuntik skrip kandungan secara automatik ke dalam tab sedia ada. Suntikan hanya berlaku apabila tab baharu dibuat atau tab sedia ada dilayari selepas sambungan dimuatkan.
Penyelesaian 1: Suntikan Skrip Bersyarat
Untuk memastikan komunikasi antara latar belakang dan kandungan skrip, suntikan skrip bersyarat boleh digunakan. Skrip latar belakang boleh menyemak sama ada tab bersedia untuk menerima mesej dan menyuntik skrip kandungan hanya jika ia belum disuntik.
Kod:
<code class="javascript">// Background script function ensureSendMessage(tabId, message, callback) { chrome.tabs.sendMessage(tabId, { ping: true }, function (response) { if (response && response.pong) { // Content script ready chrome.tabs.sendMessage(tabId, message, callback); } else { // No listener on the other end chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); throw Error("Unable to inject script into tab " + tabId); } // OK, now it's injected and ready chrome.tabs.sendMessage(tabId, message, callback); }); } }); }</code>
Skrip kandungan:
<code class="javascript">chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { if (request.ping) { sendResponse({ pong: true }); return; } // Content script action });</code>
Penyelesaian 2: Pencegahan Pelaksanaan Berganda
Penyelesaian lain melibatkan menyuntik skrip kandungan ke dalam tab tetapi melaksanakan langkah-langkah untuk menghalang pelaksanaannya lebih daripada sekali.
Kod:
<code class="javascript">// Background script function ensureSendMessage(tabId, message, callback) { chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError); throw Error("Unable to inject script into tab " + tabId); } // OK, now it's injected and ready chrome.tabs.sendMessage(tabId, message, callback); }); }</code>
Skrip kandungan:
<code class="javascript">var injected; if (!injected) { injected = true; // Your toplevel code }</code>
Penyelesaian 3: Tanpa pilih kasih Suntikan Skrip
Akhir sekali, anda boleh memilih untuk menyuntik skrip kandungan ke dalam semua tab semasa pemulaan sambungan. Ini hanya dinasihatkan jika skrip anda tidak mengganggu dirinya sendiri apabila dilaksanakan beberapa kali atau selepas halaman dimuatkan.
Kod:
<code class="javascript">chrome.tabs.query({}, function (tabs) { for (var i in tabs) { // Filter by URL if needed chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function () { // Now you can use normal messaging }); } });</code>
Sekali mana-mana daripada penyelesaian ini dilaksanakan, mesej boleh dihantar dengan jayanya daripada skrip latar belakang kepada skrip kandungan, dan akhirnya kepada skrip yang disuntik.
Atas ialah kandungan terperinci Bagaimana untuk Mewujudkan Komunikasi daripada Skrip Latar Belakang kepada Skrip Disuntik melalui Skrip Kandungan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!