Chrome扩展之通信

这篇具有很好参考价值的文章主要介绍了Chrome扩展之通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Chrome扩展通信

chrome扩展的5种js

js类型 介绍
popup 单击插件图标后的弹窗中的js,由于单击图标打开popup,焦点离开又立即关闭,生命周期一般很短。
content-script 与页面共享DOM,但是不共享JS,可访问部分chrome扩展API。
background 权限最高,几乎可调用所有Chrome扩展API(除了devTools),且可以无限制跨域。生命周期最长,跟随浏览器开关。
injected-script 通过DOM操作的方式向页面注入的一种JS,和原始页面共享js(即可访问原始页面变量,方法等),无法访问Chrome扩展API。
devtools 每打开一个开发者工具窗口,都会创建devtools的页面的实例,F12窗口关闭,页面也随之关闭,故devtools的生命周期和devtools窗口是一致的。可访问一组特有的DevTools API(background都无权访问):chrome.devtools.panels(面板相关);chrome.devtools.inspectedWindow(获取被审查窗口的相关信息);chrome.devtools.network(获取有关网络请求信息)。

Chrome插件提供的2种额外的通信方式

  1. chrome.tabs.sendMessagechrome.runtime.sendMessage 用于简单的一次性请求;
  2. chrome.tabs.connectchrome.runtime.connect,用于长时效连接。

通信接口使用限制

inject-script content-script popup-js background
inject-script - window.postMessage - -
content-script window.postMessage - chrome.runtime.sendMessage chrome.runtime.connect chrome.runtime.sendMessage chrome.runtime.connect
popup-js - chrome.tabs.sendMessage chrome.tabs.connect - chrome.runtime.sendMessage chrome.runtime.connect
background-js - chrome.tabs.sendMessage chrome.tabs.connect chrome.tabs.sendMessage chrome.tabs.connect -
devtools-js chrome.devtools.inspectedWindow.eval chrome.runtime.sendMessage chrome.runtime.sendMessage

chrome.runtime.onMessageExternal 接口用于扩展间通信,与chrome.tabs.sendMessage 用法类似。

一次性请求

一次性请求类似于HTTP请求,包含一次请求和一次返回,且如果接收方不在线,就会出现请求失败;

扩展程序(popup、background)向content-script一次性通信

//popup.js发送
function sendToContentScript(message, callback){
	chrome.tabs.query({active: true, currentWindow: true}, tabs => {
		chrome.tabs.sendMessage(tabs[0].id, message, callback);
	});
}
sendToContentScript({cmd:'test', value:'popup_to_content'}, res => {
	console.log(res)   *// {res:'content_to_popup'}*
} );

// content_script.js接收
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
	console.log(request)   *// {cmd:'test', value:'popup_to_content'}*
	if(request.cmd === 'content_to_bg'){
		sendResponse({res:'content_to_popup'})
	  // 若异步使用sendResponse,需添加return true*
	}
})

双方通信直接发送的都是JSON对象,不是JSON字符串,所以无需解析,很方便(当然也可以直接发送字符串)

content-script主动向扩展程序(background、popup)一次性通信

// content_script.js发送
chrome.runtime.sendMessage({cmd: 'test', value:'content_to_bg'}, res => {
	console.log(res);     //{res:'bg_to_content'}
});

// background.js接收
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
	console.log(request);   // {cmd: 'test', value:'content_to_bg'}
	sendResponse({res:'bg_to_content'})
});

注意事项

  • content_scriptspopup主动发消息的前提是popup处于打开状态,否则需要利用background作中转;
  • 使用chrome.runtime.sendMessage后无论是否需要回应,接收方都需调用sendReponse反馈,若不调用则发送方就会报错:
  • 如果backgroundpopup同时监听,那么它们都可以同时收到消息,但是只有一个可以sendResponse,一个先发送了,那么另外一个再发送就无效

页面脚本(包括inject-script)和content-script之间一次性通信

由于inject-script和content-script内均可获取到原始页面的window对象,故可通过window.postMessage来进行通信。该方法还可规避跨域的限制,可以在任意页面之间进行通信。

//inject-script
window.postMessage({cmd:"test",value:"inject_to_content"},"*")

//content-script
window.addEventListener("message", e => {
	console.log(e.data)    //{cmd:"test",value:"inject_to_content"}
})

长时效连接

长连类似 WebSocket,建立连接后会一直保持,双方可以随时互发消息。

chrome.tabs.connectchrome.runtime.connect 长时效连接通信示例

扩展程序和web页面之间建立长连接,只需要从一端建立就可以了。
在popup或js或background发起连接请求:

//popup.js或background.js 发起连接需要指定发送到某个标签页
chrome.tabs.query({active: true, currentWindow: true}, tabs => {
	const port = chrome.tabs.connect(tabs[0].id, {name: 'popup'});
	//向指定tabd页发起连接请求
	port.postMessage({cmd: 'popup-connect',value:'extension'});
	port.onMessage.addListener(msg => {
		if(msg.cmd === 'connected') {
			//do something
			port.postMessage({cmd: 'done'});
		}
	});
});

在content-script发起连接和监听消息:

// content-script直接建立长链接
const port = chrome.runtime.connect({name: 'content'});
port.postMessage({cmd: 'cnt-connect'});
port.onMessage.addListener(msg => {
	if(msg.cmd === 'connected'){
		//do something
		port.postMessage({cmd: 'done'});
	}
});

任意一端监听连接请求:文章来源地址https://www.toymoban.com/news/detail-816732.html

chrome.runtime.onConnect.addListener(port => {
	if(port.name == 'popup') {
		port.onMessage.addListener(msg => {
			if(msg.cmd== 'popup-connect') port.postMessage({cmd: 'connnected'});
		});
	}else if(port.name === 'content'){
		......
	}
});

postMessagemessageChannel 长时效连接通信

  • 同一MessageChannel实例下的port1和port2两个对象可以通过postMessageonmessage方法相互发送和接收消息;
  • port1和port2是MessagePort实例,MessagePort继承了Transferable接口,可在不同可执行上下文之间传递。
  • window.postMessage(message, targetOrigin, [transfer]),第三个参数可以用来传递Transferable对象
//inject-script
const {port1,port2} = new MessageChannel();
window.addEventListener("load", () => {
port1.onmessage = (e) => {
	console.log(e)
}
window.postMessage('来自inject_script的信息', '*', [port2]);
});

//content-script
window.addEventListener('message', e=>{
  e.port[0].postMessage('来自content-script的信息')
});

到了这里,关于Chrome扩展之通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • chrome扩展控制popup页面动态切换

    下面在mv2版本的API下完成 实际上通过控制页面元素实现popup页面切换,是一种伪切换,从视觉上达到了切换效果,实际上还是一个popup.html popup.html示例 判断展示哪一个div的内容 不需要在manifest里单独配置browser_action,通过所在的页面决定使用哪一个popup.html页面 准备两个popu

    2024年02月15日
    浏览(61)
  • Chrome扩展的核心:manifest 文件(上)

    大家好,我是dom哥。我正在写关于 Chrome 扩展开发的系列文章,感兴趣的可以点个小星星。 Chrome 在全球浏览器市场份额独占 6 成,无论是对普通用户还是开发者,都是电脑里的必备利器。Chrome 无论是在性能还是 UI 交互方面都非常出色,而 Chrome 扩展则为开发者提供了接口,

    2024年02月05日
    浏览(40)
  • Chrome扩展的核心:manifest 文件(下)

    大家好,我是 dom 哥。这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星。 在上篇和中篇中已经完成了对 manifest 文件中以下字段的解释: \\\"manifest_version\\\" \\\"name\\\" \\\"version\\\" \\\"description\\\" \\\"icons\\\" \\\"content_scripts\\\" \\\"background\\\" \\\"permissions\\\" 本篇接着说剩下的 manifest 可选字段。 定义

    2024年02月04日
    浏览(46)
  • Chrome扩展的核心:manifest 文件(中)

    大家好,我是 dom 哥。我正在写关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星 。 在上一篇中已经完成了 Chrome 扩展的雏形,本篇接着介绍 manifest 中的可选字段,完善扩展的细节。 向 web 页面注入 JavaScript 和 CSS 。可以说这是 Chrome 扩展的灵魂。当指定 content_scri

    2024年02月04日
    浏览(44)
  • chrome 扩展 popup 弹窗的使用

    popup介绍 popup 是点击 browser_action 或者 page_action 图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。 popup配置 V3版本中(V2版本是在 browser_action 中 ),可以通过配置文件( manifest.json )中 action 里面的 default_popup 字段来指定 popup 页面,也

    2024年02月05日
    浏览(39)
  • Chrome扩展V2到V3的变化

    Chrome扩展manifest V3变化、升级迁移指南_chrome_ZK645945-华为云开发者联盟 (csdn.net) browser_action 改 为 action。

    2024年02月07日
    浏览(39)
  • Chrome扩展程序是如何进行消息传递的

    大家好,我是 dom 哥。这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星。 一个复杂的 Chrome 扩展程序通常由 content_scripts , background , action popup , side panel , options page , devtools 等部分组成,这些部分所负责的功能各不相同,所处的运行环境各不相同,所能

    2024年02月04日
    浏览(47)
  • #Chrome扩展程序开发教程--01:基本概念介绍

            本系列博客旨在带来最新的Chrome扩展程序开发入门教程。         通过向Chrome浏览器添加自定义特性和功能来提升网上冲浪体验,比如: 生产力工具 丰富网页网页内容 信息聚合         扩展程序本质上也是一个Web应用,开发扩展程序需要使用和Web应用一

    2023年04月22日
    浏览(43)
  • selenium.chrome怎么写扩展拦截或转发请求?

    Selenium WebDriver 是一组开源 API,用于自动测试 Web 应用程序,利用它可以通过代码来控制chrome浏览器! 有时候我们需要mock接口的返回,或者拦截和转发请求,今天就来实现这个功能。 代码已开源: https://github.com/yuzd/OpenQA.Selenium.Chrome.Fiddler nuget OpenQA.Selenium.Chrome.Fiddler 开始co

    2024年02月09日
    浏览(40)
  • 测试人员必用的10个Chrome扩展插件

    背景 :谷歌Chrome浏览器是全球所有测试人员最受欢迎和必备的浏览器之一,Chrome浏览器为我们提供了许多扩展的选择,可以让我们高效和省时地完成工作。以下为作者观点: 1. Testsigma Recorder Testsigma Recorder用于记录与网络应用程序的端到端交互,并将动作存储为纯英文句子,

    2024年02月11日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包