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

前言

chrome.runtime.onMessage.addListener 是 Chrome 扩展程序中用于监听其他模块发送的消息并做出响应的 API

当从扩展进程 (by runtime.sendMessage) 或内容脚本 (by tabs.sendMessage)发送消息时触发

语法

javascript 复制代码
chrome.runtime.onMessage.addListener(
  callback: function,
)

callback参数如下:

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

参数 类型 说明
request Any 包含发送者的信息和请求的内容
sender MessageSender 包含发送者的详细信息
sendResponse Function 是一个可以用来向发送者发送响应的函数

基本示例

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

在这个例子中,我们监听来自任何发送者的消息;

每当有消息发送时,监听函数(callback)就会被调用;

注意

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

封装

示例

javascript 复制代码
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'}, ()=>{})

实现

javascript 复制代码
class MessageListener {
  /**
   * @var chrome.runtime.onMessage|null
   */
  _message
  /**
   * @var Object
   */
  _listener

  constructor() {
    this._listener = {}
    this._message = chrome.runtime.onMessage || null
    return {
      addListener: (messageKey, request) => this.addListener(messageKey, request),
      start: () => this.start(),
    }
  }

  addListener(messageKey, request) {
    this._listener[messageKey] = request
  }

  start() {
    if (!this._message) return
    let that = this
    that._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官方接口文档:

相关推荐
叫兽~~8 分钟前
uniapp 使用vue3写法,拿不到uni-popup的ref
前端·uni-app
nyf_unknown8 分钟前
(vue)给循环遍历的el-select选择框加全选/清空/反选,禁选,添加行移除行功能
前端·javascript·vue.js
夏兮颜☆29 分钟前
【react-pdf】实现在线pdf加载——翻页加载和下拉滚动加载
javascript·react.js·pdf
一颗不甘坠落的流星32 分钟前
【React】刷新页面或跳转路由时进行二次确认
前端·javascript·react.js
一棵开花的树,枝芽无限靠近你1 小时前
【PPTist】批注、选择窗格
前端·笔记·学习·编辑器·pptist
一棵开花的树,枝芽无限靠近你1 小时前
【PPTist】查找替换、绘制文本框
javascript·笔记·学习·编辑器·pptist
一水鉴天1 小时前
智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之24 重审 前端实现:主页页面
前端
东方小月2 小时前
NestJS中如何优雅的实现接口日志记录
前端·后端·nestjs
丢失的林夕2 小时前
axios的替代方案onion-middleware
前端·vue.js·ajax·typescript·reactjs
JINGWHALE12 小时前
设计模式 行为型 策略模式(Strategy Pattern)与 常见技术框架应用 解析
前端·人工智能·后端·设计模式·性能优化·系统架构·策略模式