Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Membetulkan Ralat \'Konteks Sambungan Tidak Sah\' Disebabkan oleh Skrip Kandungan Yatim dalam Sambungan Chrome?

Bagaimana untuk Membetulkan Ralat \'Konteks Sambungan Tidak Sah\' Disebabkan oleh Skrip Kandungan Yatim dalam Sambungan Chrome?

Susan Sarandon
Susan Sarandonasal
2024-11-01 04:59:27897semak imbas

How to Fix

Cara Mengalih Keluar Skrip Orphaned selepas Kemas Kini Sambungan Chrome

Masalah

Memuat semula sambungan Chrome secara tidak sengaja, terutamanya dalam mod pembangun, boleh mencipta kandungan yatim skrip. Skrip ini kekal berjalan di latar belakang tetapi kehilangan komunikasi dengan pelanjutan yang lain, mengakibatkan ralat seperti "konteks sambungan tidak sah" dan "masa jalan yang tidak ditanda.lastError".

Penyelesaian

Yang yatim piatu. skrip kandungan masih boleh menerima mesej DOM. Untuk mengalih keluarnya:

1. Hantar Mesej daripada Skrip Kandungan Baharu:

  • Dalam skrip kandungan baharu yang berfungsi, hantar mesej kepada skrip yatim menggunakan window.dispatchEvent.
  • Gunakan pengecam mesej unik , seperti orphanMessageId.

2. Nyahdaftar Pendengar dalam Skrip Orphaned:

  • Dalam skrip yatim, tentukan pendengar untuk orphanMessageId.
  • Dalam pendengar ini, nyahdaftar semua pendengar terdahulu dan batalkan pembolehubah global.
  • Ini menjadikan skrip lama layak untuk kutipan sampah.

3. Skrip Latar Belakang:

  • Suntikan semula skrip kandungan pada muat semula/pasang sambungan.

4. Skrip Kandungan:

  • Gunakan fungsi yang dinamakan untuk pendengar acara untuk mengekalkan rujukan mereka.
  • Tetapkan window.running property untuk menunjukkan kejadian yang aktif.
  • Apabila menerima orphanMessageId, nyahdaftar pendengar dan tandai skrip sebagai yatim.

5. Skrip Pop Timbul:

  • Semak sama ada skrip kandungan berfungsi hadir sebelum menghantar mesej.
  • Gunakan ensureContentScript untuk memastikan suntikan skrip.

Contoh Kod:

background.js:

<code class="javascript">// Re-inject content script
chrome.runtime.onInstalled.addListener(() => {
  chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
    chrome.tabs.executeScript(tabs[0].id, { file: 'content.js' });
  });
});</code>

content.js:

<code class="javascript">// Orphaned script detection and cleanup
var orphanMessageId = chrome.runtime.id + 'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// Register named listeners
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);

// Orphan flag and cleanup function
window.running = true;

function unregisterOrphan() {
  if (chrome.runtime.id) {
    // Not orphaned
    return;
  }
  window.removeEventListener(orphanMessageId, unregisterOrphan);
  document.removeEventListener('mousemove', onMouseMove);
  try {
    chrome.runtime.onMessage.removeListener(onMessage);
  } catch (e) {}
  return true;
}</code>

popup.js:

<code class="javascript">async function sendMessage(data) {
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  if (await ensureContentScript(tab.id)) {
    return await chrome.tabs.sendMessage(tab.id, data);
  }
}

async function ensureContentScript(tabId) {
  try {
    const [{ result }] = await chrome.scripting.executeScript({
      target: { tabId },
      func: () => window.running === true,
    });
    if (!result) {
      await chrome.scripting.executeScript({
        target: { tabId },
        files: ['content.js'],
      });
    }
    return true;
  } catch (e) {}
}</code>

Atas ialah kandungan terperinci Bagaimana untuk Membetulkan Ralat \'Konteks Sambungan Tidak Sah\' Disebabkan oleh Skrip Kandungan Yatim dalam Sambungan Chrome?. 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