如何在background.js 和popup.js 之间进行通信?

2024-01-11

我有一个带有后台脚本的扩展:

"background": {
    "scripts": ["scripts/background.js"]
  },

和内容脚本:

"content_scripts": [
    {
      "matches": ["*://*/*"],
      "js": ["scripts/content_script.js"]
    }
  ],

弹出窗口(popup.html)和一个弹出脚本(popup.js)。 popup.js 未注册到清单中,它处理 popup.html 外观,并监听 popup.html 中的用户操作,例如单击按钮。

我想延期,什么通过电子邮件发送当前选项卡的页面,为此,我需要使用以下命令获取页面 DOMcontent_script,将数据(DOM)传递给background script。之后,当用户触发popup.html中的事件时,popup.js会捕获该事件,并且我希望popup.js能够从background.js获取传递的数据(DOM)。我怎样才能做到这一点?所以,我的问题是,如何在 background.js 和 popup.js 之间进行通信?


我找到了我自己问题的答案:

谢谢埃尔维斯,我想我解决了这个问题;我只需要在内容脚本中获取网站的 DOM,但我的问题的解决方案是这样的:

内容脚本.js

 // SEND DOM structure to the background page
    chrome.extension.sendRequest({dom: "page DOM here"});

背景.html

<html>
<head>
<script>
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.dom != "")
        var theDOM = request.dom;
        console.log(request.dom); // page DOM here -> works
        chrome.extension.sendRequest({theDOM: theDOM}); // theDOM : "page DOM here"
});
</script>
</head>
<body>
</body>
</html>

popup.js

var dom;
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if(request.theDOM != ""){
        console.log("popup request: "+request.theDOM);
        dom = request.theDOM;
    }
});

// HANDLE TAB_1 REQUESTS (EMAIL PAGE)
// ---------------------------------
$("#send").click(function(){
    console.log(dom); // page DOM here
}

谢谢您的帮助 ;)


您可以进行消息传递。来自文档 https://code.google.com/chrome/extensions/messaging.html:

在您的内容脚本中使用它:

chrome.extension.sendRequest({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});

它发送{greeting: "hello"}到背景。注意指定的回调

后台页面可以使用以下方式监听这些请求:

chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
  });

论点sendResponse函数将被传递给回调

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在background.js 和popup.js 之间进行通信? 的相关文章

随机推荐

  • Fabricjs删除backgroundImage

    是否可以删除背景图像fabric Canvas设置后 canvas setBackgroundImage img url function canvas renderAll 或者只是回到标准背景 要设置backgroundColor to
  • Kotlin 中 lambda 表达式的默认参数

    我想创建一个 lambda 并将其分配给一个变量 并且以下内容按预期工作 val rollDice min Int max Int gt min max random 但是 当我尝试为参数分配默认值时 出现错误 val rollDice m
  • Android应用程序生命周期和静态的使用

    对于 Android 来说 这是正确的代码吗 调用 init 来自MyApplication onCreate public class Connectivity static ConnectivityManager cm public s
  • 在 Python 中实现 __concat__

    我尝试实施 concat 但没有成功 gt gt gt class lHolder def init self l self l l def concat self l2 return self l l2 def iter self ret
  • Java 中已弃用的 JDBC 日期(java.sql 包)

    我正在使用 JDBC 和 MySQL 我有一个日期列 需要将其包含在结果集中 不幸的是 我找不到 Java 中的类来检索日期 SQL Date 类已弃用 如何从结果集中获取 Date 对象 You use java sql 日期 http
  • 基于图的数据库 (http://neo4j.org/) 有哪些用例? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Laravel:如何检查 Redis 可用性?

    我如何检查Redis连接的可用性拉拉维尔 5 4 我尝试了下面的代码 但 ping 线路出现异常 如果 Redis 未连接 我该怎么办而不是做其他事情以避免异常 由于目标机器主动连接 无法建立连接 拒绝了 tcp 127 0 0 1 637
  • 询问用户 SIM 卡 PIN 码

    我搜索了与此类似的问题 但没有运气 我正在编写一个应用程序 为了正确验证用户身份 它应该要求他输入正确的 SIM 卡 是否有可能 或者我是否必须使用另一个 PIN 码才能进行应用程序身份验证 我不确定这是否可行 但由于有些设备没有 SIM
  • 在 IntelliJ 中生成文件时关闭“创建者”标记

    我找不到这个选项 例如 当我创建一个新的 Scala 类时 以下文本将放置在文件中 Created by ben on 6 23 14 In IntelliJ 13 and above it is in the File and Code
  • 布尔系统(适用于 C++/C#/java)

    我如何以编程方式解决此类系统 A B B C D B E A E B 所以我可以通过替换A C D 3 and E B 2 我只需要2组的数量 如果无法获得 2 个组 我会显示一条错误消息 万一 这不是作为一个骗局而关闭 从我的answer
  • GuiceApplicationLoader配置错误

    因此 我尝试使用如下所示的方法来实现编译时 DI package modules class MyModule extends AbstractModule def configure bind classOf MyT to classOf
  • Django NoReverseMatch

    我正在 django 1 6 和 python 2 7 中制作一个简单的登录应用程序 并且在开始时出现错误 该错误不允许我继续 这是网站的 url py from django conf urls import patterns inclu
  • docker run 的命令行参数

    我正在尝试慢慢构建一个 docker 镜像来满足我们的需求 我想做的是运行具有单声道的基本映像 然后让单声道在后台运行可执行文件 从普通的命令行 如果不尝试在容器中运行它 它看起来像 usr local bin mono home crys
  • 在 codeigniter 中删除后从文件夹中删除图像

    我不仅想删除数据库中的图像 还想删除文件夹中的图像 这是我的模型 public function delete id if this gt db gt delete np gallery id id return true 这是我的控制器
  • 在特定时间在 qglwidget 上绘制一个矩形

    我在 ubuntu 16 04 上使用 Qt 5 7 和 c 我正在尝试实现一个继承 qglwidget 的类 它以给定的速率 3 10 Hz 将图像渲染到屏幕上 除此之外 我想在屏幕上的某处绘制一个小矩形 将其颜色从黑色更改为白色 反之亦
  • 拆分 html 代码标签和内容

    有没有比我对正则表达式了解更多的人知道如何拆分 html 代码 以便将所有标签和所有单词分开 即 p Some content a href www test com A link a p 是这样分开的 array 0 gt p 1 gt
  • Notepad++ Regex + python脚本(替换中添加)

    我也遇到了这个人同样的问题 Notepad 正则表达式将数字相加 https stackoverflow com questions 20506990 notepad regular expression add up numbers 35
  • 获取不带“px;”的样式值的数字后缀

    我正在尝试对 HTML 元素的位置进行一些比较逻辑 我有一个我认为应该可以工作的系统 但是有一个问题 在我的代码中 我使用不等式语句将一个绝对定位元素的当前左侧值和顶部值与另一个 可能正在移动 的元素进行比较 gt and lt 问题是我得
  • 如果我为实体分配一个 ID,那么如何让 NHibernate 保存它,否则生成一个 ID?

    根据 REST 哲学 PUTrequest 应该更新 URL 上的资源 如果存在 如果不存在则创建它 换句话说 如果我使用以下 URL PUT http server item 5 If an ItemID 为 5 的存在 它将被更新 如果
  • 如何在background.js 和popup.js 之间进行通信?

    我有一个带有后台脚本的扩展 background scripts scripts background js 和内容脚本 content scripts matches js scripts content script js 弹出窗口 p