Das unbeabsichtigte Neuladen einer Chrome-Erweiterung, insbesondere im Entwicklermodus, kann zu verwaisten Inhalten führen Skripte. Diese Skripte laufen weiterhin im Hintergrund, verlieren jedoch die Kommunikation mit dem Rest der Erweiterung, was zu Fehlern wie „Erweiterungskontext ungültig gemacht“ und „ungeprüfter runtime.lastError“ führt.
Die verwaiste Das Inhaltsskript kann weiterhin DOM-Nachrichten empfangen. Um es zu entfernen:
1. Nachricht vom neuen Inhaltsskript senden:
2. Registrierung von Listenern im verwaisten Skript aufheben:
3. Hintergrundskript:
4. Inhaltsskript:
5. Popup-Skript:
Beispielcode:
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>
Das obige ist der detaillierte Inhalt vonWie behebe ich „Extension Context Invalidated'-Fehler, die durch verwaiste Inhaltsskripts in Chrome-Erweiterungen verursacht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!