10、chrome拓展程序的实现

一、拓展程序的实现
  • 拓展程序项目的构成

        和前端项目一样,拓展程序也是有Html、CSSJS文件实现的,现在看来它就是一个静态的前端页面。但是不同的是,拓展程序中还需要额外的一个清单文件,就是manifest.json,清单文件可以理解为一个拓展程序的配置文件,它可以配置你的拓展程序的权限,ICON路径、JS导入路径等。

  • 清单示例
{"manifest_version": 2,"name": "Touch Fish","description": "A basic Chrome extension","version": "1.0","icons": {"32": "icon/icon32.png","128": "icon/icon128.png"},"browser_action": {"default_popup": "popup.html"},"background": {"scripts": ["js/background.js"]},"permissions": ["activeTab","storage","webRequest","webRequestBlocking","notifications","<all_urls>","proxy"],"content_scripts": [{"matches": ["<all_urls>"],"js": ["js/content-script.js", "js/axios.js","js/encrypt.js","js/basic.js","js/common.js","js/login.js","js/modify_password.js","js/route.js","js/utils.js","js/website.js","js/sina.js","js/file.js","js/email.js","js/network.js","js/endpoint.js"],"run_at": "document_end","all_frames":true}]
}

  • 清单说明
manifest_version  #清单的版本,当前最新的是3版本
description: #如果不上传到应用商店,这个字段随便填
icons: #icon集合
browser_action: 
  default_popup: #定义拓展程序窗口页面
background: #定义拓展程序后台脚本
permissions: #定义拓展程序的权限
content_scripts: #定义内容脚本
devtools_page: #定义开发者工具页面

二、常用脚本释义
  • Content_scripts内容脚本

        说明:Content_scripts配置的JS会被注入到浏览器中,它可以获取到整个页面DOM,可以发起HTTP请求,可以控制页面路由,使用浏览器api

        实现:通过manifest.json中的content_scripts添加的脚本就是内容脚本。

  • Popup.js页面脚本

        说明:页面脚本即拓展程序页面所用的脚本,它和前端页面一样,通过script标签注入到popup.html

        实现:通过manifest.json中browser_action中的default_popup指定的页面中所使用的脚本,manifest版本3中参数名用的是action,而不是browser_action

  • 后台脚本Background.js/有默认的html页面

        说明:后台脚本是一直运行的,可以通过match_url配置使用该脚本的网站,popup.js中可以直接调用background.js的方法。

        实现:通过manifest.json的background参数配置的脚本就是后台脚本。

  • Dev.html/dev.js

        说明:开发者工具脚本,它是开发者工具面板的页面,通过Devtools的api来创建panels,它和panel.html其实都是以iframe的方式嵌入到devtools.html的页面中的,devtools.html是默认的。

        实现:dev.html页面通过manifest.json的devtools_page配置指定。

  • Panel.html/panel.js

        说明:自定义面板脚本及页面

        实现:面板页面引用的js

  • Inject脚本

        说明:通过background.js向特定页面注入脚本或者manifest的web_accessible_resources参数配置的脚本,可以访问网页dom,不可以使用浏览器api

        实现:通过background.js注入或者配置注入

三、通信

Send:

  • 短连接
chrome.tabs.sendMessage()
chrome.runtime.sendMessage()
  • 长连接
chrome.tabs.connect()
chrome.runtime.connect()

Receive:

chrome.runtime.onConnect.addListener(callback)
chrome.runtime.onMessage.addListener(callback)

        说明:长连接与短连接不多说,大家都懂,说下tabs和runtime两个方法的差异,tabs在消息传递时需要tabId,runtime在消息传递需要extensionId

  • 各脚本环境之间通信
  • content_scripts与popup之间通信

长连接示例

popup.js发送消息

chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {    var p = chrome.tabs.connect(tabs[0].id, {name:"connect"});    p.postMessage({message:'hello connected'})
});
  • content_scripts接收消息
chrome.runtime.onConnect.addListener(p=>{    console.log(p)    p.onMessage.addListener(function(message) {        console.log("Message received from Background.js:", message.message);        // 在这里添加处理消息的逻辑    });
})

短连接示例

popup.js发送消息

chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {    chrome.tabs.sendMessage(tabs[0].id, {message:' hello pop'});
});

content_scripts接收消息

chrome.runtime.onMessage.addListener(p=>{    console.log(p.message)})
  • popup.js和background.js通信

长连接示例

popup.js发送

chrome.runtime.connect(extensionId,{name:"con"}).postMessage({message:'hello111'})

background.js接收

chrome.runtime.onConnect.addListener(function(p) {    p.onMessage.addListener(message=>{        console.log(message.message)    })
});

        注:为什么第一个示例中没有用runtime.connect,因为runtime.connect是与后台脚本交互的,但是如果popup.js中使用tabs.connect的话,那么background.js和content_scripts都可以接收到消

短连接示例

popup.js发送

chrome.runtime.sendMessage({message:'hi'});

background.js接收

chrome.runtime.onMessage.addListener(function (request) {    console.log(request.message)})

        注:和长连接不同,如果使用tabs发送,那么background.js就无法收到消息。

  • 调用

Popup.js可以直接调用background.js中的方法

var background = chrome.extension.getBackgroundPage()
background.test()
  • dev.js | panels.js和background.js直接通信

dev.js发送

var backgroundPageConnection = chrome.runtime.connect({    name: "devtools-page"});
backgroundPageConnection.onMessage.addListener(function (message) {    // Handle responses from the background page, if any
}); 
backgroundPageConnection.postMessage({    tabId: chrome.devtools.inspectedWindow.tabId,    // scriptToInject: "test.js",    message:'hello'
});

        background.js和popup.js都可以收到消息,panels.js和dev.js由于都是以iframe的形式嵌套在devtools.html中的,所以它俩发送消息是一样的。

        但是dev.js是面向开发者的,panel.js是面向用户的。

  • dev.js和content_scripts

        dev.js和content_scripts处于不同的环境中,它们之间如果需要通信,需要使用background.js作为中介。

        另:dev.js可以直接访问Dom资源、页面的静态资源、http请求。

chrome.devtools.inspectedWindow.eval('performance', function(result, exceptionInfo) {    if (exceptionInfo) {        console.error('Error:', exceptionInfo);} else {        console.log('DOM:', result);}
});

参考文档API 参考  |  Chrome for Developers

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

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

相关文章

MySQL 经典练习 50 题 (记录)

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

RobotFramework自动化测试框架的搭建

最近组长说要开始搞自动化&#xff0c;和同事交流发现他在用的是RF框架的自动化&#xff0c;所以就打算在本地安装下来试试&#xff0c;但是没想到就是最开始的搭建环境就让我搞了两三天&#xff0c;现在把搭建过程踩的坑记录一下&#xff0c;也算是个总结。 一、RobotFrame框…

Mongodb入门到入土,安装到实战,外包半年学习的成果

这是我参与「第四届青训营 」笔记创作活动的的第27天&#xff0c;今天主要记录前端进阶必须掌握内容Mongodb数据库,从搭建环境到运行数据库,然后使用MongodB; 一、文章内容 数据库基础知识关系型数据库和非关系型数据库为什么学习Mongodb数据库环境搭建及运行MongodbMongodb命…

【ai技术】(4):在树莓派上,使用qwen0.5b大模型+chatgptweb,搭建本地大模型聊天环境,速度飞快,非常不错!

1&#xff0c;视频地址 https://www.bilibili.com/video/BV1VK421i7CZ/ 2&#xff0c;下载镜像 raspberry-pi-os-64-bit https://blog.csdn.net/freewebsys/article/details/136921703 项目地址&#xff1a; https://www.raspberrypi.com/software/operating-systems/#rasp…

38 mars3d 对接地图图层 绘制点线面员

前言 这里主要是展示一下 mars3d 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;"><div class"mars3dClas…

I2C系列(三):软件模拟I2C读写24C04

一.目标 PC 端的串口调试软件通过 RS-485 与单片机通信&#xff0c;控制单片机利用软件模拟 I2C 总线对 EEPROM&#xff08;24C04&#xff09; 进行任意读写。 二.RS-485简述 在工业控制领域&#xff0c;传输距离越长&#xff0c;要求抗干扰能力也越强。由于 RS-232 无法消除…

HTTP(2)

HTTP 通信过程包括从客户端发往服务器端的请求及从服务器端返回客户端的响应。 那么请求和响应是怎样运作的呢 HTTP 报文 用于 HTTP 协议交互的信息被称为 HTTP 报文。 请求端&#xff08;客户端&#xff09;的HTTP 报文叫做请求报文&#xff0c;响应端&#xff08;服务器…

OpenCV学习笔记(十一)——利用Sobel算子计算梯度

Sobel算子是基于一阶导数的离散差分算子&#xff0c;其中Sobel对于像素值的变化是十分敏感的&#xff0c;在进行边缘检测的时候&#xff0c;Sobel算子常用于对周围像素的重要性进行检测。 Sobel算子包括检验水平方向的算子和检测竖直方向的算子 计算机梯度值的操作如下&#x…

C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序

1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…

零基础-MySQL数据库的基本操作

①MYSQL数据库基本操作-DDL 1.DDL的解释 DDL&#xff08;Data Definition Language&#xff09;&#xff0c;数据定义语言&#xff0c;包括以下内容&#xff1a; 对数据库的常用操作 对表结构的常用操作 修改表结构 2.对数据库的常用操作 功能SQL查看所有的数据库show d…

从产品组装和维护/维修的角度来看,基于增强现实的指导:关于挑战和机遇的最新综述

作者&#xff1a; 1. M. Eswaran 2. Anil Kumar Gulivindala 3. M.V.A.Raju Bahubalendruni 关于本文 •分析了增强现实在装配和维护/维修中的作用。 •讨论了AR辅助制造系统的软件和硬件元素。 •讨论了AR跟踪和配准技术面临的挑战。 •讨论了AR辅助制造系统的未来…

GDC期间LayaAir启动全球化战略

3 月 18 日至 3 月 22 日&#xff0c;一年一度的游戏开发者大会&#xff08;GDC&#xff09;在美国旧金山举行。在此期间&#xff0c;Layabox宣布LayaAir引擎启动全球扩张战略&#xff0c;这标志着引擎将步入快速发展的新阶段。此举旨在利用公司先进的3D引擎技术&#xff0c;将…