"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como estabelecer a comunicação do script de segundo plano para o script injetado por meio do script de conteúdo?

Como estabelecer a comunicação do script de segundo plano para o script injetado por meio do script de conteúdo?

Publicado em 2024-11-09
Navegar:495

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

Enviando mensagem de um script em segundo plano para um script de conteúdo e depois para um script injetado

Problema:
Apesar da tentativa de enviar mensagens da página de plano de fundo para um script de conteúdo e depois para um script injetado, o processo não funcionou conforme o esperado. O script de conteúdo não consegue receber mensagens do script em segundo plano.

Solução:
O problema surge da maneira como os scripts de conteúdo são injetados. Quando uma extensão é carregada, ela não injeta automaticamente scripts de conteúdo nas guias existentes. A injeção ocorre apenas quando uma nova guia é criada ou uma guia existente é navegada após o carregamento da extensão.

Solução 1: injeção condicional de script
Para garantir a comunicação entre o plano de fundo e o conteúdo scripts, uma injeção de script condicional pode ser empregada. O script de segundo plano pode verificar se a guia está pronta para receber mensagens e injetar o script de conteúdo somente se ele ainda não estiver injetado.

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

Script de conteúdo:

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

Solução 2: prevenção de dupla execução
Outra solução envolve injetar o script de conteúdo na guia, mas implementar medidas para evitar sua execução mais de uma 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 conteúdo:

var injected;

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

Solução 3: injeção indiscriminada de script
Por último, você pode optar por injetar o script de conteúdo em todas as guias após a inicialização da extensão. Isso só é aconselhável se o seu script não interferir consigo mesmo quando executado várias vezes ou após o carregamento da página.

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

Depois que qualquer uma dessas soluções for implementada, as mensagens poderão ser retransmitidas com êxito do script de segundo plano para o script de conteúdo e, eventualmente, para o script injetado.

Declaração de lançamento Este artigo foi reimpresso em: 1729218083 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3