„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie stellt man eine Kommunikation vom Hintergrundskript zum injizierten Skript über das Inhaltsskript her?

Wie stellt man eine Kommunikation vom Hintergrundskript zum injizierten Skript über das Inhaltsskript her?

Veröffentlicht am 09.11.2024
Durchsuche:687

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

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

Problem:
Obwohl versucht wurde, Nachrichten von der Hintergrundseite an ein Inhaltsskript und dann an ein injiziertes Skript zu senden, funktionierte der Prozess nicht wie beabsichtigt. Das Inhaltsskript kann keine Nachrichten vom Hintergrundskript empfangen.

Lösung:
Das Problem ergibt sich aus der Art und Weise, wie Inhaltsskripte eingefügt werden. Wenn eine Erweiterung geladen wird, werden Inhaltsskripte nicht automatisch in vorhandene Registerkarten eingefügt. Die Injektion erfolgt nur, wenn nach dem Laden der Erweiterung eine neue Registerkarte erstellt oder durch eine vorhandene Registerkarte navigiert wird.

Lösung 1: Bedingte Skriptinjektion
Um die Kommunikation zwischen Hintergrund und Inhalt sicherzustellen Skripten kann eine bedingte Skriptinjektion eingesetzt werden. Das Hintergrundskript kann prüfen, ob die Registerkarte zum Empfangen von Nachrichten bereit ist, und das Inhaltsskript nur dann einfügen, wenn es noch nicht eingefügt wurde.

Code:

// 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);
      });
    }
  });
}

Inhaltsskript:

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  if (request.ping) {
    sendResponse({ pong: true });
    return;
  }
  // Content script action
});

Lösung 2: Verhinderung der doppelten Ausführung
Eine andere Lösung besteht darin, das Inhaltsskript in die Registerkarte einzufügen, aber Maßnahmen zu implementieren, um zu verhindern, dass es mehr als einmal ausgeführt wird.

Code:

// 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);
  });
}

Inhaltsskript:

var injected;

if (!injected) {
  injected = true;
  // Your toplevel code
}

Lösung 3: Wahllose Skriptinjektion
Zuletzt können Sie das Inhaltsskript bei der Initialisierung der Erweiterung in alle Registerkarten einfügen. Dies ist nur dann ratsam, wenn sich Ihr Skript nicht selbst stört, wenn es mehrmals ausgeführt wird oder nachdem die Seite geladen wurde.

Code:

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
    });
  }
});

Sobald eine dieser Lösungen implementiert ist, können Nachrichten erfolgreich vom Hintergrundskript an das Inhaltsskript und schließlich an das injizierte Skript weitergeleitet werden.

Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729218083 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3