chrome V3 插件开发 基础

news2024/11/28 6:36:40

目录

  • 准备
  • popup
  • 通信
    • popup 发消息给 background
    • popup 发消息给 content
    • 长期连接
  • 如何页面上添加一个按钮?
    • tabs.onUpdated
    • content-script.js
    • inject.js
  • 右键菜单
    • chrome.contextMenus
    • 举个例子添加
      • 关于报错(cannot create item with duplicate id XXX)

小白学习chrome 插件开发,如果有什么不对的,请指教
注意: 用的是 chrome V3

准备

  1. 创建文件夹 myPlugin
  2. myPlugin 文件中创建 manifest.json 文件
  3. myPlugin 文件中创建 icons 文件文件夹,并且在icons 文件中准备一个图片
    在这里插入图片描述
  4. 配置 manifest.json
    更多参数配置可以查看官网:Manifest file format
{
  "name": "插件",
  "version": "1.0",
  "manifest_version": 3,
  "description": "学习chrome插件开发",
  "author": "chenss",
  "icons": {
      "16": "icons/logo.png",
      "48": "icons/logo.png", 
      "128": "icons/logo.png"
  }
}
  1. 打开 管理扩展插件,把myPlugin 添加进来就能看到了,如果图标不正确可以点击刷新,如果还不行请检查配置路径
    在这里插入图片描述
    在这里插入图片描述
    准备工作就到这里了,如果你一切顺利,我们继续吧~

popup

创建 popup.htmlpopup.js

popup.html

<!DOCTYPE html>
<head>
  <meta charset="utf-8" />
  <body>
    <div>chenss</div>
  </body>
</head>

配置 manifest.json

...
"action": {
   "default_popup": "popup.html"
}

点击插件,就能弹出一个弹框啦~~~
在这里插入图片描述

通信

在根目录新建content-script.js,配置 manifest.json

...
"action": {
  "default_popup": "popup.html"
},
"content_scripts": [
  {
      "matches": ["*://*/*","<all_urls>"],
      "js": ["content-script.js"]
  }
],
"permissions": ["tabs"]

popup 发消息给 background

popup.html 添加按钮

<div>
  <div class="box">
    <button id="backgroud">给bg发消息</button>
  </div>
  <script src="popup.js"></script>
</div>

popupbackground 分别添加如下代码

// popup.js
let sendBg = document.getElementById("backgroud");
sendBg.onclick = async function () {
  const [tab] = await chrome.tabs.query({active:true,currentWindow:true})
  console.log('p->b,tab',tab)
  const respone =await chrome.runtime.sendMessage(tab.id)
  console.log('popup-respone',respone);
}
// background.js
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
  console.log('这是background脚本onMessage', message);
  sendResponse("收到消息");
});

接下来我们看看效果:
点开这个地方
在这里插入图片描述
在这里插入图片描述
当然 你也可以使用 chrome.runtime.sendMessage 发消息

// popup.js
let sendBg = document.getElementById("backgroud");
sendBg.onclick = async function () {
  chrome.runtime.sendMessage({greeting:"hello"}, function(response) {
  console.log(response);
}

在这里插入图片描述

popup 发消息给 content

  1. 同样在 popup.html 添加按钮
  2. popupbackground 分别添加如下代码
// popup.js
let sendContent = document.getElementById("sendContent");
sendContent.onclick = async function () {
  const [tab] = await chrome.tabs.query({active:true,currentWindow:true})
  console.log('p->b,tab',tab)
  const respone =await chrome.tabs.sendMessage(tab.id, {greeting: "hihihihihi"})
  console.log('popup-respone',respone);
}
// content-script.js
chrome.runtime.onMessage.addListener(
  function (request, sender, sendResponse) {
    console.log('这是content-script脚本执行内容');
    console.log(sender.tab ?
      "from a content script:" + sender.tab.url :
      "from the extension");
  }
);

随便打开一个网站 你就能看到 输出内容
在这里插入图片描述

通信就不再这里过多描述了,可以参考这个文章:
Chrome插件:浏览器后台与页面间通信

长期连接

有的时候需要长时间通信,以上方法显然不合适。需要使用 runtime.connecttabs.connect
建立连接时,两端都将获得一个 runtime.Port 对象,用来通过建立的连接发送和接收消息。
更多详细内容可以看文档,本次只用runtime.connect举列子。

  1. 同样在 popup.html 添加按钮
  2. popupbackground 分别添加如下代码
// popup.js
// 长期链接 发消息给bg
longLink.onclick = async function () {
  var port = chrome.runtime.connect({ name: "knockknock" });
  port.postMessage({ joke: "Knock knock" });
  port.onMessage.addListener(function (msg) {
    if (msg.question === "Who's there?") port.postMessage({ answer: "Madame" });
    else if (msg.question === "Madame who?")
      port.postMessage({ answer: "Madame... Bovary" });
  });
};
// background.js
chrome.runtime.onConnect.addListener(function(port) {
  console.assert(port.name === "knockknock");
  port.onMessage.addListener(function(msg) {
    console.log('msg',msg);
    if (msg.joke === "Knock knock")
      port.postMessage({question: "Who's there?"});
    else if (msg.answer === "Madame")
      port.postMessage({question: "Madame who?"});
    else if (msg.answer === "Madame... Bovary")
      port.postMessage({question: "I don't get it."});
  });
});

在这里插入图片描述
当从 service workercontent scripts 发送建立连接请求时,若目标 tab 中存在多个 iframe ,且 content scripts 注入到了每个 iframe 中,则每个 iframe 中的 runtime.onConnect 事件都会被触发。同样的,也可能会出现多个 iframe 中的runtime.connect() 一起调用的情况。

如何页面上添加一个按钮?

tabs.onUpdated

使用 tabs.onUpdated , 再次强调一下需要配置permissions: [‘tabs’],并且需要重新加载插件,如重新加载还是无法生效,请移除插件重新导入
background.js 代码如下:

//background.js
chrome.tabs.onUpdated.addListener(async function(tabId,changeInfo,tab){
  console.log('tabs.onUpdated',tabId,changeInfo,tab);
  if (!tab.url &&changeInfo.status !=='complete') return;

  sendContent(tabId,{action:"inject"})
});

content-script.js

// content-script.js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
  var tmp = document.createElement("script");
  tmp.src = chrome.runtime.getURL("./inject.js");
  tmp.setAttribute("type", "text/javaScript");
  document.head.appendChild(tmp);  
});

inject.js

manifest.json 中配置

"web_accessible_resources": [ {
     "resources": ["inject.js"],
     "matches": [ "*://*/*" ]
 }],

“matches”:字符串数组,每个字符串都包含一个匹配模式,指定哪些站点可以访问这组资源。仅使用来源来匹配 URL。例如"matches": [ "http://*/*" ] 这样配置的话,https开头网址的页面上看不到按钮。当然可以利用正则匹配网页地址。

//inject.js
var div_child='<button id="div_child_1"   style="width:100px;height:50px;position: absolute;top: 120px;right: 50px;font-size: 24px;">按钮</button>'
var c=document.querySelector("body > div");
c.innerHTML+=div_child;

let injectBtn = document.getElementById("div_child_1");
injectBtn.onclick= function(){
	alert("点击了自定义的按钮")
}

在这里插入图片描述

右键菜单

chrome.contextMenus

chrome.contextMenus 文档地址

举个例子添加

background.js 里面添加如下代码

//background.js
chrome.runtime.onInstalled.addListener(() => {
  createMenus()
});
// 自定义右键菜单
function createMenus() {
  chrome.contextMenus.create({
      title: "菜单1", //菜单的名称
      id: '01', //一级菜单的id
      contexts: ['page'], // page表示页面右键就会有这个菜单,如果想要当选中文字时才会出现此右键菜单,用:selection
  });

  chrome.contextMenus.create({
      title: '子菜单1', //菜单的名称
      id: '0101',//二级菜单的id
      parentId: '01',//表示父菜单是“右键快捷菜单”
      contexts: ['page'],
  });

  chrome.contextMenus.create({
      title: '菜单2', //菜单的名称
      id: '02',
      contexts: ['page'],
  });

}

在这里插入图片描述
这样就添加成功了

关于报错(cannot create item with duplicate id XXX)

例如:一开始的时候在onUpdated 周期添加菜单

chrome.tabs.onUpdated.addListener(async function(tabId,changeInfo,tab){
    chrome.contextMenus.create({
    ...
    })
});

每次刷新页面的时候就会出现这个重复添加的错误:在这里插入图片描述
是因为 onUpdated 状态是loading 和 complate 的时候重复添加了,当然可以判断一下加载状态,再去创建。
如果你通过通信方式添加菜单也需要注意,也会存在这个问题。
在这里插入图片描述
关于这个文档里有说(使用此事件(onInstalled)可以设置状态或进行一次性初始化,例如上下文菜单。):
在这里插入图片描述

未完待续👻👻👻👻👻👻👻👻

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

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

相关文章

❤ VUE3 项目路由拦截器配置(二)

❤ VUE3 项目 路由拦截器进一步 配置 路由拦截抽离为单个模块permission.ts 路由配置规则 白名单&#xff08;直接进入&#xff09; PC页面和PC子页面&#xff08;直接进入&#xff09; 后台页面&#xff08;验证token &#xff09; 没有token> 后台登录页面 有token> 后…

12.Eclipse导入Javaweb项目

同事复制一份他的项目给我ekp.rar (懒得从SVN上拉取代码了)放在workspace1目录下 新建一个文件夹 workspace2,Eclipse切换到workspace2工作空间 选择Import导入 选择导入的项目(这里是放到workspace1里面) 拷贝一份到workspace2里面 例子 所有不是在自己电脑上开发的web项目…

C语言案例 球落地反弹-10

题目&#xff1a;一球从100米高度自由落下&#xff0c;每次落地后反跳回原高度的一半;再落下&#xff0c;求它在第10次落地时&#xff0c;共经过多少米第10次反弹多高&#xff1f; 程序分析 球在落地后会反弹为原高度的一半&#xff0c;若设高度为h&#xff0c;那么每次落地的…

Python(八十)字符串的常用操作——字符串的劈分

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

思维导图在职业规划中的应用:从职业选择到职业发展的思维导图

职业规划的重要性 在我们进行职业选择的时候&#xff0c;一个有效的职业规划&#xff0c;会对我们的未来有很大的帮助作用。一个好的职业规划可以帮助我们通过认识自己的兴趣、价值观、技能以及优势&#xff0c;找到适合自己的领域。并做出合理有效的职业选择。有了明确的职业目…

打靶练习:WestWild 1.1(一个简单但不失优雅的Ubuntu靶机)

主机发现和nmap信息收集 //主机发现 sudo nmap -sn 192.168.226.0/24 //扫描整个C段//端口扫描//初步扫描 sudo nmap -sT --min-rate 10000 -p- 192.168.226.131 -oA nmapscan/ports //用TCP的三次握手&#xff0c;以速率10000扫描1-65535端口&#xff0c;扫描结果以全格式…

【CSS】CSS 布局——常规流布局

<h1>基础文档流</h1><p>我是一个基本的块级元素。我的相邻块级元素在我的下方另起一行。</p><p>默认情况下&#xff0c;我们会占据父元素 100%的宽度&#xff0c;并且我们的高度与我们的子元素内容一样高。我们的总宽度和高度是我们的内容 内边距…

制造业企业数字化转型之设备数据采集

导 读 ( 文/ 1894 ) 随着信息技术的快速发展和制造业的转型升级&#xff0c;企业数字化转型已成为保持竞争力和实现可持续发展的关键。在数字化转型过程中&#xff0c;设备数据采集作为重要的一环&#xff0c;发挥着关键的作用。设备数据采集通过收集、分析和利用设备所产生的数…

企业中商业智能BI,常见的工具和技术

商业智能&#xff08;Business Intelligence&#xff0c;简称BI&#xff09;数据可视化是通过使用图表、图形和其他可视化工具来呈现和解释商业数据的过程。它旨在帮助组织更好地理解和分析他们的数据&#xff0c;从而做出更明智的商业决策。 常见的商业智能数据可视化工具和技…

Python+Selenium+Unittest 之selenium11--WebDriver操作方法1-常用操作

目录 1、send_keys("输入的内容") &#xff08;输入文字&#xff09; 2、clear() (清除元素内的内容) 3、click()&#xff08;点击元素&#xff09; 4、quit()关闭浏览器 5、refresh()&#xff08;刷新浏览器页面&#xff09; 6、set_window_size()和用 maxim…

计时器setTimeout()函数、setInterval()函数

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3c5;计时器setTimeout&#xff08;函数名&#xff0c;延迟时间&#xff09;结束计时器setTimeout &#x1f3c5;计时器setInterval&#xff08;函数名&#xff0c;延迟时间&a…

栈和队列经典面试题

目录 一、括号匹配问题 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目 思路 完整代码 二、用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 题目 思路 代码实现 构造一个栈 用队列实现栈的接口 第一个接口&#xff1a;创建…

yolo-nas对自定义数据集进行训练,测试详解 香烟数据集 处理损坏的图片数据 对网络摄像头,视频,图片预测

yolov5格式的香烟数据集 https://download.csdn.net/download/qq_42864343/88110620?spm1001.2014.3001.5503 创建yolo-nas的运行环境 进入Pycharm的terminal&#xff0c;输入如下命令 conda create -n yolonas python3.8pip install super-gradients使用自定义数据训练Yo…

微信小程序隐私协议模板

在 设置 中找到 用户隐私保护 进行更新&#xff0c;如下图&#xff1a; 具体协议补充可参考如下&#xff1a; 为了分辨用户&#xff0c;开发者将在获取你的明示同意后&#xff0c;收集你的微信昵称、头像 为了显示距离&#xff0c;开发者将在获取你的明示同意后&#xff0c;收…

E7—使用IBERT IP对QSFP+通信链路眼图测试2023-08-11

1.场景 通常在使用光纤接GT收发器进行通信之前&#xff0c;要测试信号质量以确认硬件链路工作正常&#xff0c;xilinx提供了IBERT&#xff08;Integrated Bit Error Ratio Tester&#xff09;进行高速串行通信接口的测试和调试&#xff0c;以KU系列QSFP光纤收发器4路GTY为例介绍…

一文详解Git

一. Git概述 1.1 什么是 Git Git 是一个免费的、开源的分布式版本控制工具&#xff0c; 主要用于管理开发过程中的源代码文件&#xff0c;在软件开发过程中被广泛使用。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为二种&#xff1a; 本地仓库&#xff1a;开发人…

命令执行漏洞

1、命令执行漏洞 1.1、简介 Django是用Python开发的一个免费开源的Web结构&#xff0c;几乎包括了Web使用方方面面&#xff0c;能够用于快速建立高性能、文雅的网站&#xff0c;Diango提供了许多网站后台开发常常用到的模块&#xff0c;使开发者可以专注于业务部分。 1.2、漏…

【博学谷学习记录】超强总结,用心分享 | 产品经理之AAARR模型和RFM模型

&#x1f525;前言 本章重点介绍电商行业常用的AARRR模型和RFM模型&#xff0c;并探讨两个模型的实操和适用范围。 &#x1f4c3;目录 &#xff08;一&#xff09;AARRR模型 1.拉新 2.转化 3.留存 4.活跃 5.传播 &#xff08;二&#xff09;RFM模型 1.三个指标的含义 2.RFM模…

【C++】C++异常

文章目录 1. C语言传统处理错误的方式2. C异常的概念3. 异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 4. C标准库的异常体系5. 自定义的异常体系6. 异常的优缺点 1. C语言传统处理错误的方式 C语言传统的错误处理机制有两个&#xff1a; 终止程…

IoTDB 小白“踩坑”心得:入门安装部署篇

小伙伴介绍&#xff01; 大家好&#xff0c;我是 zai&#xff0c;一个基本功不那么扎实、没有太多经验的大学生。我刚刚加入社区&#xff0c;接触 IoTDB&#xff0c;目前仍处于学习阶段&#xff0c;所以我会跟大家分享我学习过程中踩过的一些雷&#xff0c;以及对应的解决办法&…