”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何通过内容脚本建立后台脚本与注入脚本的通信?

如何通过内容脚本建立后台脚本与注入脚本的通信?

发布于2024-11-09
浏览:694

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

将消息从后台脚本发送到内容脚本,然后发送到注入脚本

问题:
尽管尝试将消息从后台页面发送到内容脚本,然后发送到注入脚本,但该过程未能按预期工作。内容脚本无法接收来自后台脚本的消息。

解决方案:
该问题是由内容脚本注入的方式引起的。加载扩展时,它不会自动将内容脚本注入现有选项卡中。仅当创建新选项卡或加载扩展后导航现有选项卡时才会发生注入。

解决方案1:条件脚本注入
确保后台和内容之间的通信脚本,可以采用条件脚本注入。后台脚本可以检查选项卡是否准备好接收消息,并仅在尚未注入的情况下注入内容脚本。

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

内容脚本:

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

解决方案 2:双重执行预防
另一个解决方案是将内容脚本注入选项卡,但采取措施防止其多次执行。

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

内容脚本:

var injected;

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

解决方案3:不加区别的脚本注入
最后,您可以选择在扩展初始化时将内容脚本注入到所有选项卡中。仅当您的脚本在多次执行或页面加载后不会干扰自身时,才建议这样做。

代码:

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

一旦实现这些解决方案中的任何一个,消息就可以成功地从后台脚本中继到内容脚本,并最终中继到注入的脚本。

版本声明 本文转载于:1729218083如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在 PHP 中将 Data-URI 转换为文件时如何解决图像损坏问题?
    在 PHP 中将 Data-URI 转换为文件时如何解决图像损坏问题?
    PHP Data-URI 到文件:解决损坏的图像问题在从 Data-URI 转换为文件格式期间保持图像数据的完整性至关重要。使用 PHP 的 file_put_contents 函数保存来自 JavaScript canvas.toDataURL() 调用的数据时遇到的一个常见挑战是生成的图像损坏。...
    编程 发布于2024-11-09
  • 数据库中哪种分层数据结构最好:邻接表还是替代方案?
    数据库中哪种分层数据结构最好:邻接表还是替代方案?
    数据库中的分层数据结构:邻接表与其他方法在关系数据库中实现分层数据时,开发人员通常会考虑两种方法:邻接表和嵌套树。虽然邻接列表看起来更简单,但由于可能存在大量查询,因此对其遍历操作的性能产生了担忧。邻接列表和嵌套树的替代品除了这两个选项,存在表示数据库中分层数据的其他方法,包括:嵌套集合路径枚举闭包...
    编程 发布于2024-11-09
  • Cucumber.js:行为驱动测试的完整指南
    Cucumber.js:行为驱动测试的完整指南
    Cucumber.js 是一种流行的工具,用于运行以简单语言编写的自动化测试,允许开发人员和非开发人员协作进行测试。它在行为驱动开发 (BDD) 中特别有用,因为利益相关者之间的清晰沟通是关键。通过使用人类可读的语言,Cucumber js 使产品所有者、测试人员和开发人员能够确保软件按预期运行,...
    编程 发布于2024-11-09
  • 天国冒险:穿越空间和代码的旅程
    天国冒险:穿越空间和代码的旅程
    灵感 我一直对宇宙的浩瀚和神秘着迷。行星的错综复杂的运动、天体的壮丽——这些元素一直激发着我的好奇心。当我遇到这个挑战时,我认为这是一个将我对太空的热情与创造力和技术结合起来的机会。我想建造一些能够捕捉宇宙敬畏的东西,并让每个人都能接触到它,无论他们身在何处或使用什么设备。这个项目成为我将灵感转化为...
    编程 发布于2024-11-09
  • 如何获取 Openpyxl 中单元格的原始值,即使它包含公式?
    如何获取 Openpyxl 中单元格的原始值,即使它包含公式?
    如何在 Openpyxl 中检索实际单元格值使用 openpyxl 访问 Excel 中的单元格值时,您可能会遇到显示的值与存储在 Openpyxl 中的实际值之间的差异单元格(如果单元格包含公式)。这是因为 openpyxl 通常解释公式并检索计算结果。要检索实际单元格值(包括公式),可以在加载工...
    编程 发布于2024-11-09
  • React 的基本核心概念
    React 的基本核心概念
    在快速发展的 Web 开发世界中,React 仍然是构建动态和高性能用户界面的基石。无论您是经验丰富的开发人员还是刚刚起步的开发人员,了解 React 的核心概念对于充分发挥其潜力至关重要。在本文中,我们将探讨 React 的基本原理,从它的库状态到 hooks 的强大功能,并为您提供增强 Reac...
    编程 发布于2024-11-09
  • 如何防止 Chrome 的自动填充更改您的字体?
    如何防止 Chrome 的自动填充更改您的字体?
    克服 Chrome 的自动填充字体更改挑战在 Windows 上遇到 Chrome 的自动填充功能时,您可能会遇到烦人的字体更改问题。将鼠标悬停在已保存的用户名上时,字体大小和样式会发生变化,从而破坏表单的对齐方式。虽然您可以对输入应用固定宽度来缓解此问题,但更有效的解决方案在于完全防止字体更改。要...
    编程 发布于2024-11-09
  • Em 和 Rem:有什么区别?
    Em 和 Rem:有什么区别?
    简介:rem和em都是CSS中的大小单位。 Rem 是 root 元素的字体大小。 Em 是本地上下文的字体大小。 em 单位 是从印刷版式世界借来的,它是一个允许设置元素的字体大小相对于其组件层次结构中最接近的声明字体大小的单位。 rem 单元 是 root em 的缩写,始终引用根元素(即 元...
    编程 发布于2024-11-09
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-09
  • 修复 D3.js GeoJSON 绘图问题:如何纠正缠绕顺序?
    修复 D3.js GeoJSON 绘图问题:如何纠正缠绕顺序?
    D3.js 错误绘制 GeoJSON:缠绕顺序问题当尝试使用 geoJSON 数据可视化俄罗斯地区时,程序员遇到了一个问题其中 D3.js 绘制单个黑色矩形而不是所需的地图轮廓。这种差异是由于 geoJSON 文件中坐标的缠绕顺序问题引起的。了解缠绕顺序GeoJSON 坐标可以按顺时针或逆时针顺序排...
    编程 发布于2024-11-09
  • 多重继承的问题
    多重继承的问题
    Java不支持类的多重继承,标准方法不规避此限制,因为类可以维护状态(使用实例变量),但接口不能。 默认方法提供了行为多重继承的有限形式,允许一个类通过默认方法从多个接口继承行为。 当一个类实现的两个接口具有相同的默认方法时,可能会发生冲突,例如两个接口 Alpha 和 Beta 都使用了 res...
    编程 发布于2024-11-09
  • 如何避免 getImageData() 中的“画布已被跨域数据污染”错误?
    如何避免 getImageData() 中的“画布已被跨域数据污染”错误?
    如何避免 getImageData() 中出现“画布已被跨源数据污染”错误使用 getImageData( 时) 方法从画布检索像素数据,您可能会遇到错误“画布已被跨源数据污染”。当您尝试访问受从其他域加载的数据影响的画布上的像素数据时,会出现此错误。要了解此错误的原因,请考虑大多数浏览器中实现的安...
    编程 发布于2024-11-09
  • ## Promise.all:Node.js 中是并行执行还是顺序执行?
    ## Promise.all:Node.js 中是并行执行还是顺序执行?
    Promise.all:Node.js 中并行执行还是顺序执行?问题: Promise.all(iterable) 是否顺序处理 Promise 或并行?答案: Promise.all 不执行 Promise;相反,它只是同时等待多个承诺。 Promise 的计算和结果由调用 Promise.all...
    编程 发布于2024-11-09
  • 如何克服 Splinter/Selenium 中的 ElementClickInterceptedException:被其他拦截时单击元素的指南
    如何克服 Splinter/Selenium 中的 ElementClickInterceptedException:被其他拦截时单击元素的指南
    被其他人拦截时单击元素:在 Splinter/Selenium 中处理 ElementClickInterceptedException抓取网页时,单击某些元素可能会具有挑战性,因为模糊元素的存在。在 Selenium 中,当尝试单击被另一个元素遮挡的元素时,会引发 ElementClickInte...
    编程 发布于2024-11-09
  • Java Sound 可以播放 MP3 文件吗?
    Java Sound 可以播放 MP3 文件吗?
    Java Sound 默认不支持 MP3。对于特定 JRE 中支持的类型,请检查 AudioSystem.getAudioFileTypes()。有一种方法可以添加 MP3 支持。将基于 JMF 的 mp3plugin.jar 添加到项目的运行时类路径中。虽然 javax.sound.sampled...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3