chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯

2024-03-07 04:36

本文主要是介绍chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

popup

在用户点击扩展程序图标时(下图中的下载图标),都可以设置弹出一个popup页面。而这个页面中自然是可以包含运行的js脚本的(比如就叫popup.js)。它会在每次点击插件图标——popup页面弹出时,重新载入。

content_scripts脚本

content_script 是植入型的,它会被植入到符合匹配的网站页面上。在页面加载完成后执行。content_script 最有用的地方是操作网站页面上的DOM。一切平时做前端的一些操作它都可以做,像什么添加、修改、删除 DOM,获取 DOM 值,监听事件等等,都可以很容易的做到。所以,如果想获取人家的登录帐户和密码,就是件非常容易的事,只需要添加content_script,监听帐户和密码的文本框,获得值后将数据发送到自己的服务器就可以了。因此,特别说明,别乱装扩展,特别是不从官方扩展库里下载的扩展。配置如下:

 "content_scripts": [{"matches": [ "http://*/*", "https://*/*" ],"js": ["content_scripts.js"]}],

这样,在页面加载完成后,就会加载 content.js,在 content.js 里,就可以控制页面元素。可在浏览器进行调试,位置如图,调试的方法就是浏览器调试js的方法,加断点,执行: 

background_script脚本

插件存在则存在, 随着浏览器的打开而打开,随着浏览器的关闭而关闭, 通常把需要一直运行的、启动就运行的、全局的代码放在background里面。它没办法控制页面元素,但可以通过 content_script 告诉它。ajax同理,如果要在页面打开时向别的服务器请求数据,这时就可以告诉 background_script,让它去请求,然后把返回的数据发送给 content_script。这样就不会受到浏览器的安全限制影响。

background的权限非常高,几乎可以调用所有的Chrome扩展API(除了devtools),而且它可以无限制跨域,也就是可以跨域访问任何网站而无需要求对方设置CORS。

使用 background_script
要使用 background_script,需要在 manifest.json 中配置,如下:

    "background": {"scripts": ["background.js"],"persistent": false},

如果要调试,可以打开插件一个tab页或者popup页的检查,或者点击背景图:

消息传递

在网页实际运行过程中,原始web+注入的的content_scripts+background.js=新的web页面,当打开多个页面时,就会存在多个新的web页面。因为每个页面都注入content_scripts。那么在通信的时候,后台脚本或则popup页面,怎么确定是与那个页面进行消息交互呢,通过tabID。

tab是什么呢?

上图就有三个tab标签,也就是在浏览器中打开的网页对应着一个tab,图中第二个和第三个虽然url相同,但tabid不一样。三个主要部分消息交互机制如下图:

background 和 content_scripts 的通信

接收消息:chrome.runtime.onMessage.addListener

发送消息:chrome.runtime.sendMessage 

content_scripts发送和接收消息:

let btn = document.querySelector('button');  // 页面DOM
btn.onclick = function () {sendMsg()
};// 发送消息
function sendMsg() {chrome.runtime.sendMessage({ origin: 'pageJs' }, function (data) {// 接受返回信息console.log("🔷: content_scripts.js  send");console.log("🔷: content_scripts.js  sendBack", data);console.log('.....................');});
}// 接受信息
function receiveMsg() {chrome.runtime.onMessage.addListener(function (data, sender, sendResponse) {console.log("👀: content_scripts.js  receive", data);console.log("👀: content_scripts.js  receiveFn");sendResponse(data);console.log('.....................');});
};
receiveMsg();

background发送和接收消息:

// 接收到信息
function receiveMsg() {// data数据  sender发送方  sendResponse回调chrome.runtime.onMessage.addListener(function (data, sender, sendResponse) {console.log("😝: background.js  receive", data);console.log("😝: background.js  receiveFn");sendResponse(data)console.log('.....................');tabs();});
};
receiveMsg();// 监测到新的tab
async function tabs() {const tabId = await getCurrentTabId();// 在背景页面发送消息,需要当前 tabIDchrome.tabs.sendMessage(tabId, { name: 'bJs' }, function (data) {console.log("📌: background.js  send");console.log("📌: background.js  sendBack", data);console.log('.....................');});
};// 获取当前 tab ID
function getCurrentTabId() {return new Promise((resolve, reject) => {chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {resolve(tabs.length ? tabs[0].id : null)});})
};

所有通信之前,发送方和接收方必须都存在,否则报错。

background 和 popup的通信

收消息:在background中: chrome.extension.getViews() 获取当前插件内每个运行页面的窗口数组([window, window])

发送消息:在右上角弹出框中:chrome.extension.getBackgroundPage() 获取背景页面的窗口对象(window)

background.js在原来基础上增加一个通信函数:

/*** 通信函数*/
function backFun(...arg) {const allViews = chrome.extension.getViews()console.log(arg);console.log('chrome.extension.getViews():', allViews)
}

popup.js页面增加: 

let btn = document.getElementById('submit');// 可以获取到background.js中设置的函数,
const background = chrome.extension.getBackgroundPage();// 点击按钮
btn.onclick = function (e) {var name = document.getElementById('name').value;var password = document.getElementById('password').value;// sendMsg(name, password);background.backFun(name, password)
}

content_scripts 和 popup的通信

content_scripts.js里面:

let btn = document.getElementById('submit');// 点击按钮
btn.onclick = function (e) {var name = document.getElementById('name').value;var password = document.getElementById('password').value;tabs(name, password);
}// 去链接,对应的tab标签页面
async function tabs(...arg) {const tabId = await getCurrentTabId();const connect = chrome.tabs.connect(tabId, { name: 'popup' }); // 和指定tabID建立链接,并设置信号名字// 发送信息connect.postMessage(arg);// 接受返回信息connect.onMessage.addListener(mess => {console.log(mess)})
};// 获取当前 tab ID
function getCurrentTabId() {return new Promise((resolve, reject) => {chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {resolve(tabs.length ? tabs[0].id : null)});})
};

popup.js:

// 监听链接
chrome.runtime.onConnect.addListener(res => {if (res.name == "popup") {res.onMessage.addListener(mes => {console.log('🥓: popup.js receive', mes);res.postMessage('📣: popup.js receiveBack')});}
});

弹出框只要点击插件才能弹出,而当你操作页面的时候,插件弹框又会消失…消失之后,弹框的.js等都会销毁…所以,可以向background通信,然后点击弹出之后,弹出框和background通信,或者弹出之后直接向content_scripts通信。

content_scripts 和 popup的通信也可以通过另外方式传递

content_scripts.js:

// 点击按钮
btn.onclick = function (e) {var name = document.getElementById('name').value;var password = document.getElementById('password').value;tabs(name, password);
}// 去链接,对应的tab标签页面
async function tabs(...arg) {const tabId = await getCurrentTabId();// 页面发送消息,需要当前 tabIDchrome.tabs.sendMessage(tabId, { name: 'bJs' }, function (data) {console.log("📌: background.js  send");console.log("📌: background.js  sendBack", data);console.log('.....................');});};// 获取当前 tab ID
function getCurrentTabId() {return new Promise((resolve, reject) => {chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {resolve(tabs.length ? tabs[0].id : null)});})
};

popup.js:

 chrome.runtime.onMessage.addListener(function (data, sender, sendResponse) {console.log("👀: popup.js  receive", data);console.log("👀: popup.js  receiveFn");sendResponse(data);console.log('.....................');});

这篇关于chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/782395

相关文章

电脑死机无反应怎么强制重启? 一文读懂方法及注意事项

《电脑死机无反应怎么强制重启?一文读懂方法及注意事项》在日常使用电脑的过程中,我们难免会遇到电脑无法正常启动的情况,本文将详细介绍几种常见的电脑强制开机方法,并探讨在强制开机后应注意的事项,以及如何... 在日常生活和工作中,我们经常会遇到电脑突然无反应的情况,这时候强制重启就成了解决问题的“救命稻草”。那

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点: