#Chrome扩展程序开发教程--03:消息传递

news2024/12/25 3:53:59

#Chrome扩展程序开发教程--03:消息传递

    • 引言
    • 1、基本介绍
    • 2、简单通信
    • 3、长时间通信
    • 4、其它通信
      • 4.1、Cross-extension messaging
      • 4.2、Sending messages from web pages
      • 4.3、Native messaging

引言

        本系列博客旨在带来最新的Chrome扩展程序开发入门教程。


1、基本介绍

        因为 content scripts 是注入到网页中运行的,不能直接和扩展程序其它部分共享环境和变量,所以需要一些方式来与扩展程序的其它部分进行通信。扩展程序中的任何一方都可以监听从另一端发出的消息,并在同一通道上作出回应。消息可以是任何有效的 JSON 对象(null、布尔值、数字、字符串、数组或对象)。

2、简单通信

        简单通讯适用于单次的即时消息发送,chrome.runtime对象中内置了一个消息通道,可以直接发送。从 content scripts 向 service worker 发送消息的代码如下所示:

(async () => {
  const response = await chrome.runtime.sendMessage({greeting: "hello"});
  // do something with response here, not outside the function
  console.log(response);
})();

        如果需要从 service worker 向 content scripts 发送消息的话,则需要指定 tab 对象:

(async () => {
  const [tab] = await chrome.tabs.query({active: true, lastFocusedWindow: true});
  const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
  // do something with response here, not outside the function
  console.log(response);
})();

        无论接收方是 service worker 或 content scripts ,只需要添加接收消息的监听器即可:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.greeting === "hello")
      sendResponse({farewell: "goodbye"});
  }
);

        但需要注意的是,如果存在多个接收方,那么只有第一个调用 sendResponse 的接收方返回的消息才能被发送方接收。

3、长时间通信

        有些时候,扩展程序中的部分模块之间需要进行长时间稳定通信,此时在用上面那种通信方法就不太合适了。
        以下代码为从 content scripts 向 service worker 发送建立连接请求。其中 connect 的时候可以指定 name 属性,用以区分不同目的和功能的连接。

var port = chrome.runtime.connect({name: "knockknock"});
port.postMessage({joke: "Knock knock"});
port.onMessage.addListener(function(msg) {
  if (msg.question === "Who's there?")
    port.postMessage({answer: "Madame"});
  else if (msg.question === "Madame who?")
    port.postMessage({answer: "Madame... Bovary"});
});

        如果需要从 service worker 向 content scripts 发送建立连接请求,则需要指定 tab 对象,和简单通信中的做法类似。
        无论接收方是 service worker 或 content scripts ,只需要添加接收连接的监听器即可:

chrome.runtime.onConnect.addListener(function(port) {
  console.assert(port.name === "knockknock");
  port.onMessage.addListener(function(msg) {
    if (msg.joke === "Knock knock")
      port.postMessage({question: "Who's there?"});
    else if (msg.answer === "Madame")
      port.postMessage({question: "Madame who?"});
    else if (msg.answer === "Madame... Bovary")
      port.postMessage({question: "I don't get it."});
  });
});

        这里面的 port 就是连接的双方用来进行通信的对象,但其中有一些细节需要注意一下:
        当从 service worker 向 content scripts 发送建立连接请求时,若目标 tab 中存在多个 frame ,且 content scripts 注入到了每个 frame 中,则每个 frame 中的 runtime.onConnect 事件都会被触发。同样的,也可能会出现多个 frame 中的 runtime.connect() 一起调用的情况。

4、其它通信

        主要用到的就是上面介绍的两种通信手段,但还存在另外的通信,除非特殊目的,否则不会用到的,因此这里只简单介绍一下:

4.1、Cross-extension messaging

        除了在自己的扩展程序中的不同组件之间进行通信外,还可以使用消息传递 API 与其他扩展程序进行通信。

4.2、Sending messages from web pages

        与 Cross-extension messaging 一样,扩展程序可以接收和响应来自普通网页的消息。

4.3、Native messaging

        扩展程序可以与主机上的应用程序进行通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441402.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试,监控磁盘读写iostat

性能测试,监控磁盘读写iostat iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况。同vmstat一样,ios…

【iOS-#import <> ““, @class和C- #include<> ““, 】

前言 寒假分享会的遗漏问题总结 引入 在C/CPP语言里&#xff0c;引入某个头文件的操作 #include<iostream> #include<string>也有 #include "string"同样在OC里面 引入某个类会用到 #import关键字 #import "LoginViewController.h" #im…

web开发HTML生成PDF的三种解决方案(服务器端mpdf、html2canvas.js、浏览器打印、PDF虚拟打印机)

系列文章目录 python数据可视化开发(4)&#xff1a;爬取对应地址的pdf文档并分类保存到本地文件夹&#xff08;爬虫&#xff09;php使用mPDF实战案例分析字符串太长时文本变小无法自动分页的解决方案web开发HTML生成PDF的三种解决方案&#xff08;服务器端mdf、h2pdf.js、浏览…

Nuxt.js - 超详细实现路由 “伪静态“,将浏览器网页路径 URL 链接后面加上 .html 后缀名称(可以自定义任何结尾后缀名称)详细示例教程

前言 正常的项目,路由都是 /index | /user/add 这种,但有一个办法可以让其后面带上 .html,比如:/index.html。 本文 在 Nuxt.js 项目中,描述了如何实现伪静态详细教程,让页面路由后面都跟上一段自定义后缀名,比如 .html / .asp, 你可以按照本文的教程,最终得到伪静态…

阿赵的MaxScript学习笔记分享十四《Struct结构体的使用和面向对象的思考》

MaxScript学习笔记目录 大家好&#xff0c;我是阿赵 之前写了一些MaxScript的学习笔记&#xff0c;里面实现的功能不算很复杂&#xff0c;所以都是使用了偏向于面向过程的方式去编写的。 我本人其实是比较习惯用面向对象的方式去编写代码。关于面向过程和面向对象之间的优缺点…

3.5 方程组的状态与解的迭代改善

学习目标&#xff1a; 如果我要学习方程组的状态与解的迭代改善&#xff0c;我会采取以下步骤&#xff1a; 学习迭代方法的基本理论&#xff1a;首先&#xff0c;我会学习迭代方法的基本概念、原理和公式&#xff0c;包括雅可比迭代法、高斯-赛德尔迭代法和逐次超松弛迭代法等…

融合CDN行为分析动态加速解决方案

网络延迟对电商企业产生了巨大的负面影响&#xff0c;延迟是电子商务的杀手&#xff0c;网站访客等待的时间越长&#xff0c;最终实现转化的可能性就越小&#xff0c;同时他们对你的网站品牌的认可度也就越低&#xff0c;快速的网站内容交付是具有全球意识的电商企业不可或缺的…

Qt优秀开源项目之十八:QtService

QtService是一个用于实现Windows服务或unix守护进程的开源项目 github地址&#xff1a;https://github.com/qtproject/qt-solutions/tree/master/qtservice 源码可以编译成动态库&#xff0c;也可以直接在项目中引用源码 源码目录qtservice/examples中包含了三个例子&#xff0…

【Linux】system V 消息队列 | system V 信号量(简单赘述)

文章目录 1 . system V 消息队列(了解)接口查看消息队列 2.system V 信号量 (了解)1.进程互斥等概念的理解2.认识信号量3. 接口 这两部分主要是了解即可&#xff0c;为后面学习做铺垫 1 . system V 消息队列(了解) 为了让两个进程间通信 创建一个队列queue 进程A可以通过消息队…

Python——第2章 数据类型、运算符与内置函数

目录 1 赋值语句 2 数据类型 2.1 常用内置数据类型 2.1.1 整数、实数、复数 2.1.2 列表、元组、字典、集合 2.1.3 字符串 2.2 运算符与表达式 2.2.1 算术运算符 2.2.2 关系运算符 2.2.3 成员测试运算符 2.2.4 集合运算符 2.2.5 逻辑运算符 2.3 常用内置…

Kubernetes 笔记(15)— 应用保障、容器资源配额、容器状态探针概念及使用

作为 Kubernetes 里的核心概念和原子调度单位&#xff0c;Pod 的主要职责是管理容器&#xff0c;以逻辑主机、容器集合、进程组的形式来代表应用&#xff0c;它的重要性是不言而喻的。 在上层 API 对象的基础上&#xff0c;一起来看看在 Kubernetes 里配置 Pod 的两种方法&…

dell t630服务器风扇控制笔记记录(耗时一天)

1、打开虚拟控制台得用IE&#xff1b; 2、Dell PowerEdge T640 加装显卡之后风扇狂转问题解决 - 知乎 感谢知乎Billy&#xff0c; 操作步骤&#xff1a; 1、查看iDrac版本&#xff0c;必须在3.30.30.30及以下&#xff0c;之后的版本关闭了手动控制风扇转速的权限&#xff0…

从视图树到GPU:探索Android渲染机制

简介 在 Android 中&#xff0c;渲染技术可以分为 CPU 渲染和 GPU 渲染两种方式。CPU 渲染是直接使用 CPU 处理数据&#xff0c;并将其显示在屏幕上&#xff0c;而 GPU 渲染则是将数据传递给 GPU 进行处理和显示。 具体的渲染技术如下&#xff1a; Canvas绘图&#xff1a;An…

多层感知器介绍

一、概览 现实世界中很多真实的问题都不是线性可分的&#xff0c;即无法使用一条直线、平面或者超平面分割不同的类别&#xff0c;其中典型的例子是异或问题&#xff08;Exclusive OR&#xff0c;XOR&#xff09;&#xff0c;即假设输入为x1和x2&#xff0c;如果它们相同&…

Linux远程访问及控制SSH命令

目录 一. SSH服务1.1 SSH基础1.1.1什么是SSH服务器&#xff1f;1.1.2SSH优点1.1.3常见的ssh协议 二. 服务端配置文件常用选项2.1设置白名单2.2设置黑名单 三. SSH服务的两种验证方式3.1 公钥与私钥的关系 四. ssh客户端程序4.1ssh远程登录4.2 scp 远程复制4.3 sftp 安全的ftp 五…

Direct3D 12——计算着色器——计算着色器概念

计算着色器虽然是一种可编程的着色器&#xff0c;但Direct3D并没有将它直接归为渲染流水线中的一部分。虽然如此&#xff0c;但位于流水线之外的计算着色器却可以读写GPU资源。从本质上来说&#xff0c;计算着 色器能够使我们访问GPU来实现数据并行算法&#xff0c;而不必渲染出…

ESP32设备驱动-BH1745NUC 亮度和颜色传感器驱动

BH1745NUC 亮度和颜色传感器驱动 文章目录 BH1745NUC 亮度和颜色传感器驱动2、硬件准备3、软件准备4、驱动实现BH1745NUC 是具有 IC 总线接口的数字颜色传感器 IC。 该 IC 感应红光、绿光和蓝光 (RGB) 并将它们转换为数字值。 高灵敏度、宽动态范围和出色的 Ircut 特性使该 IC …

【CSS3】CSS3 伪元素字体图标 ( 生成 icommon 字体文件 | 字体图标基本使用 | 使用伪元素实现 icommon 字体图标显示 )

文章目录 一、icommon 字体图标基本使用1、生成 icommon 字体文件2、字体图标基本使用 二、使用伪元素实现 icommon 字体图标显示 一、icommon 字体图标基本使用 字体图标 指的是 将图标做成字体样式 , 在 放图标的地方 使用 文字 即可实现 图标显示 ; 1、生成 icommon 字体文件…

Vue2-黑马(十三)

目录&#xff1a; &#xff08;1&#xff09;实战-permissions.js-动态路由 &#xff08;2&#xff09;实战-第三方登录-流程分析 &#xff08;3&#xff09;实战-第三方登录-代码解读 &#xff08;1&#xff09;实战-permissions.js-动态路由 在做根据用户角色动态生成路由…

【Unity+MySQL】实现注册登录系统(升级版)

目录 1 UI界面重新设计1.1 注册界面1.2 登录界面1.3 交互实现 2 注册功能完善2.1 判断用户输入的用户名是否与数据库中的重复2.2 将当前时间更新至用户表的当前注册时间列2.3 将用户输入的注册密码使用哈希加密 3 登录功能完善 接着 上篇文章所谈到的系统缺陷&#xff0c;这篇…