"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo establecer comunicación desde el guión de fondo hasta el guión inyectado a través del guión de contenido?

¿Cómo establecer comunicación desde el guión de fondo hasta el guión inyectado a través del guión de contenido?

Publicado el 2024-11-09
Navegar:699

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

Envío de mensaje desde un script en segundo plano a un script de contenido y luego a un script inyectado

Problema:
A pesar de intentar enviar mensajes desde la página en segundo plano a un script de contenido y luego a un script inyectado, el proceso no funcionó según lo previsto. La secuencia de comandos de contenido no puede recibir mensajes de la secuencia de comandos en segundo plano.

Solución:
El problema surge de la manera en que se inyectan las secuencias de comandos de contenido. Cuando se carga una extensión, no inyecta automáticamente secuencias de comandos de contenido en las pestañas existentes. La inyección solo ocurre cuando se crea una nueva pestaña o se navega por una pestaña existente después de cargar la extensión.

Solución 1: Inyección de script condicional
Para garantizar la comunicación entre el fondo y el contenido scripts, se puede emplear una inyección de script condicional. El script en segundo plano puede verificar si la pestaña está lista para recibir mensajes e inyectar el script de contenido solo si aún no está inyectado.

Código:

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

Script de contenido:

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

Solución 2: Prevención de doble ejecución
Otra solución implica inyectar el script de contenido en la pestaña pero implementar medidas para evitar su ejecución más de una vez.

Código:

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

Script de contenido:

var injected;

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

Solución 3: Inyección indiscriminada de scripts
Por último, puede optar por inyectar el script de contenido en todas las pestañas al inicializar la extensión. Esto solo es recomendable si su secuencia de comandos no interfiere consigo misma cuando se ejecuta varias veces o después de que la página se haya cargado.

Código:

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

Una vez implementada cualquiera de estas soluciones, los mensajes se pueden transmitir exitosamente desde el script en segundo plano al script de contenido y, finalmente, al script inyectado.

Declaración de liberación Este artículo se reimprime en: 1729218083 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3