Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk Mewujudkan Komunikasi daripada Skrip Latar Belakang kepada Skrip Disuntik melalui Skrip Kandungan?

Bagaimana untuk Mewujudkan Komunikasi daripada Skrip Latar Belakang kepada Skrip Disuntik melalui Skrip Kandungan?

DDD
DDDasal
2024-10-18 11:06:03302semak imbas

How to Establish Communication from Background Script to Injected Script through Content Script?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn