【chrome扩展开发】消息通讯之onMessage消息监听

前言

chrome.runtime.onMessage.addListener 是 Chrome 扩展程序中用于监听其他模块发送的消息并做出响应的 API
当从扩展进程 (by runtime.sendMessage) 或内容脚本 (by tabs.sendMessage)发送消息时触发

语法

chrome.runtime.onMessage.addListener(callback: function,
)

callback参数如下:

(message: any, sender: MessageSender, sendResponse: function) => boolean | undefined

参数类型说明
requestAny包含发送者的信息和请求的内容
senderMessageSender包含发送者的详细信息
sendResponseFunction是一个可以用来向发送者发送响应的函数

基本示例

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {console.log(sender.id + " 发送了请求:" + request.data);// 你可以在这里处理接收到的消息// 如果需要,你可以通过 sendResponse 函数发送响应给发送者// sendResponse({data: "回复消息"});}
);

在这个例子中,我们监听来自任何发送者的消息;
每当有消息发送时,监听函数(callback)就会被调用;

注意

出于安全考虑,发送的消息和响应必须在相同的扩展程序内传递不能跨越扩展程序
onMessage方法需要在background脚本中注册

封装

示例

const listenerList = {token: function({ request, response }){// code...},/*** 创建与项目的共享变量数据*/createPluginVariable: function({ request, response }){let name = SystemEnum.APP_PLUGIN_KEY;let value = '1';let _cf = {url: SysConfig.APP_URL, name}chrome.cookies.remove(_cf,function (res) {_cf.domain = SysConfig.APP_DOMAIN;_cf.value = value;_cf.expirationDate = new Date().setDate(new Date().getDate() + 7);chrome.cookies.set(_cf, function (res) {response({name, value, config: request, res})});});}
};const message = new MessageListener();
for (let messageKey in listenerList){message.addListener(messageKey, listenerList[messageKey]);
}
message.start();// content script脚本中发送消息
// chrome.runtime.sendMessage({contentRequest:'createPluginVariable'}, ()=>{})

实现

class MessageListener {/*** @var chrome.runtime.onMessage|null*/_message/*** @var Object*/_listenerconstructor() {this._listener = {}this._message = chrome.runtime.onMessage || nullreturn {addListener: (messageKey, request) => this.addListener(messageKey, request),start: () => this.start(),}}addListener(messageKey, request) {this._listener[messageKey] = request}start() {if (!this._message) returnlet that = thisthat._message.addListener(function (request, sender, response) {return (chrome.tabs.query({ currentWindow: !0, active: !0 }, function () {if (!!that._listener[request.contentRequest]) {that._listener[request.contentRequest]({request,response,})}}),!0)})}
}

Chrome Developers官方接口文档:

  • chrome.runtime.onMessage.addListener

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

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

相关文章

使用Scrapy构建高效的网络爬虫

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 Scrapy是一个强大的Pyth…

python虚拟环境(venv)

一、什么是python环境 首先要知道什么是python环境? Python环境主要包括以下内容: 解释器 python.exe (python interpreter,使用的哪个解释看环境配置) Lib目录 标准库 第三方库:site-pakages目录,默认安装第三方…

题目:2859.计算 K 置位下标对应和

​​题目来源: leetcode题目,网址:2859. 计算 K 置位下标对应元素的和 - 力扣(LeetCode) 解题思路: 逐个计算下标是否符合要求即可。 解题代码: class Solution {public int sumIndicesWithK…

敏捷开发工具:提升软件研发效率的重要利器

在当今的软件开发领域,敏捷开发方法越来越受到推崇。敏捷开发的核心是灵活应对需求变化,以快速迭代的方式不断优化产品。为了助力敏捷开发的实施,各种敏捷开发工具应运而生。 本文将介绍几种常用的敏捷开发工具,阐述其特点、应用…

18 Python的sys模块

概述 在上一节,我们介绍了Python的os模块,包括:os模块中一些常用的属性和函数。在这一节,我们将介绍Python的sys模块。sys模块提供了访问解释器使用或维护的变量,以及与解释器进行交互的函数。 通俗来讲,sy…

第三十一章 Classes - 继承规则

第三十一章 Classes - 继承规则 继承规则 与其他基于类的语言一样,可以通过继承组合多个类定义。 类定义可以扩展(或继承)多个其他类。这些类又可以扩展其他类。 请注意,类不能继承 Python 中定义的类(即 .py 文件中…

基于DSPACE功率平衡理论的并联有源电力滤波器模型(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

入行IC | 新人入行IC选择哪个岗位更好?

很多同学入行不知道怎么选择岗位。IC的岗位一般有设计、验证、后端、封装、测试、FPGA等等。但是具体到每个人身上,就要在开始的时候确定下你要找的职位,可以有两个或三个,但是要分出主次,主次不分会让你纠结整个找工作的过程。 …

webpack配置alias后eslint和ts无法识别

背景 我们在 webpack 配置 alias 后,发现项目中引入的时候,还是会报错,如下: 可以看到,有一个是 ts报错,还有一个是 eslint 报错。 解决 ts 报错 tsconfig.json {"compilerOptions": {...&q…

【力扣每日一题】2023.9.18 打家劫舍Ⅲ

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 今天是打家劫舍3,明天估计就是打家劫舍4了。 今天的打家劫舍不太一样,改成二叉树了,不过规则没有变&…

ORACLE多列中取出数据最大的一条

1.需求说明: 当查询出来的数据存在多条数据时,想按照一定条件排序取出其中一条数据。 2.使用函数: row_number() over( partition by 分组字段 order by 排序字段 desc) 3.示例: --根据table_a中的pk_house&#x…

狗dog 数据集VOC-5912张

狗,是食肉目犬科犬属 哺乳动物 ,别称犬,与马、牛、羊、猪、鸡并称“六畜” 。狗的体型大小、毛色因品种不同而不同,体格匀称;鼻吻部较长;眼呈卵圆形;两耳或竖或垂;四肢矫健&#xff…

网站降权的康复办法(详解百度SEO数据分析)

随着搜索引擎算法的不断升级,很多网站在SEO优化过程中遭遇到降权的情况。如果您的网站也遭遇到了类似的问题,不必惊慌失措。本文将为您详细介绍网站降权恢复的方法,包括百度SEO数据分析、网站收录少的5个原因、网站被降权的6个因素以及百度SE…

超自动化的未来

如今,部分企业正尝试从小规模的自动化开始,将超级自动化用于营销分析和数据库维护等不同任务。企业应该对超自动化进行更深入的挖掘,如果人们能够更加仔细的观察总结企业的每个流程,那么就能发现更多可以从自动化技术中受益的领域…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及,网络攻击变得越来越普遍和复杂,对企业和个人的网络安全构成了重大威胁。其中,DDoS(分布式拒绝服务)攻击和CC(网络连接)攻击是两种常见且具有破坏性的攻击类型,它们…

js写一个判断字符串是否能够转为JSON 的函数

其实非常简单 这里我们需要涉及到 捕获异常 因为如果你直接在if里面转 我已经试过了 直接就报错了 一点面子不给 我们写一个这样的函数 function isJsonString(str) {try {JSON.parse(str);return true;} catch (e) {return false;} }编写如下代码 console.log(isJsonString(…

企业架构LNMP学习笔记58

开始学习Tomcat: 学习目标和内容: 1)能够描述Tomcat的使用场景; 2)能够简单描述Tomcat的工作原理; 3)能够实现部署安装Tomcat; 4)能够实现和配置Tomcat的Server服务…

openstack的port重建流程【neutron port-show 中的ip信息】

文章目录 说明日志prot重建过程 说明 为什么要重建port,是因为有一台虚拟机迁移失败回退后依然无法启动,原因是因为不能重建网络,所以尝试重建port解决这个问题。而重建port信息后,问题解决,虚拟机可以正常启动了。 …

VMware虚拟机如何设置网络

一直没弄明白怎么能让虚拟机正常上网和访问,最近总结一个小经验 要在宿主机访问虚拟机电脑服务器,要设置成nat格式,虚拟机可以上网,宿主机访问虚拟机上的ip即可访问虚拟机里的服务器,也就是这样设置就行。 这时候ip不…

blender怎么设置中文界面

你们知道Blender软件是什么吗?你知道blender怎么设置中文界面吗?Blender是个GNU的3D绘图软件,建模、算图、动画等功能都相当的完整,可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键,操作起来相当地轻…