Heim > Web-Frontend > js-Tutorial > Hauptteil

Wie sende ich Nachrichten von einem Hintergrundskript an ein Inhaltsskript und dann an ein injiziertes Skript?

Barbara Streisand
Freigeben: 2024-10-18 12:04:26
Original
265 Leute haben es durchsucht

How to Send Messages from a Background Script to a Content Script and then to an Injected Script?

Senden einer Nachricht von einem Hintergrundskript an ein Inhaltsskript und dann an ein injiziertes Skript

Problemstellung

Die Aufgabe Das vorliegende Ziel besteht darin, einen Kommunikationskanal zwischen einem Hintergrundskript und einem Inhaltsskript einzurichten. Das Inhaltsskript ist dafür verantwortlich, ein weiteres Skript in die Webseite einzufügen, und das eingefügte Skript ist der Empfänger der Nachrichten. Diese Kommunikation erweist sich jedoch als erfolglos, insbesondere die anfängliche Nachrichtenübertragung vom Hintergrundskript zum Inhaltsskript.

Das Problem verstehen

Die Wurzel des Problems liegt darin die Art der Content-Script-Injection. Chrome fügt Inhaltsskripte nicht automatisch in vorhandene Tabs ein, wenn eine Erweiterung geladen oder neu geladen wird. Stattdessen erfolgt die Injektion nur bei anschließender Tab-Navigation oder beim Öffnen neuer Tabs, die den angegebenen URL-Mustern entsprechen.

Lösungen

Lösung 1: Stellen Sie die Bereitschaft des Inhaltsskripts sicher

<code class="js">// Background
function ensureSendMessage(tabId, message, callback){
  chrome.tabs.sendMessage(tabId, {ping: true}, function(response){
    if(response &amp;&amp; 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); }
        else { chrome.tabs.sendMessage(tabId, message, callback); }
      });
    }
  });
}

// Content script
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if(request.ping) { sendResponse({pong: true}); return; }
  /* Content script action */
});</code>
Nach dem Login kopieren

Lösung 2: Skript immer mit Laufzeitprüfung injizieren

<code class="js">// Background
function ensureSendMessage(tabId, message, callback){
  chrome.tabs.executeScript(tabId, {file: "content_script.js"}, function(){
    if(chrome.runtime.lastError) { console.error(chrome.runtime.lastError); }
    else { chrome.tabs.sendMessage(tabId, message, callback); }
  });
}

// Content script
var injected;

if(!injected){
  injected = true;
  /* your toplevel code */
}</code>
Nach dem Login kopieren

Lösung 3: Wahllose Injektion bei der Initialisierung

<code class="js">chrome.tabs.query({}, function(tabs) {
  for(var i in tabs) { chrome.tabs.executeScript(tabs[i].id, {file: "content_script.js"}); }
}); </code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie sende ich Nachrichten von einem Hintergrundskript an ein Inhaltsskript und dann an ein injiziertes Skript?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage