浏览器插件官方demo学习(一):基本代码、页面渲染、书签、cookie、Omnibox等

news/2024/5/19 18:02:12/文章来源:https://blog.csdn.net/weixin_41897680/article/details/127345582

前言

参考:https://github.com/GoogleChrome/chrome-extensions-samples

官方目前只提供了几个基于v3版本的例子,其他例子都是基于v2版本的(可能是官方比较忙,没空写例子吧)。先从v3版本的例子开始学习,后面再学习v2版本的例子。

关于基础知识不会怎么介绍,比较自己也是刚开始学习。对插件一点都不熟悉的可以看一下我的其他文章。

Hello World

background.js

//添加一个插件被安装的监听
chrome.runtime.onInstalled.addListener(async () => {//获取插件运行时popup.html的路径let url = chrome.runtime.getURL("popup.html");//创建一个tab页let tab = await chrome.tabs.create({ url });//打印当前tab页的idconsole.log(`Created tab ${tab.id}`);
}
);

当插件第一次安装后(或者重新加载时),插件会自动创建一个tab标签页,内容就是插件的主页面

在这里插入图片描述

Page Redder

页面更新

background.js

function reddenPage() {document.body.style.backgroundColor = 'red';
}chrome.action.onClicked.addListener((tab) => {if(!tab.url.includes("chrome://")) {chrome.scripting.executeScript({target: { tabId: tab.id },function: reddenPage});}
});

当点击扩展按钮后,如果当前页面是正常的页面,那么通过脚本注入的方式,将页面的背景颜色变成红色。

遇到的问题:
1、必须在manifest.json 中添加响应的权限

"permissions": ["activeTab","scripting"
],

2、如果在manifest.json中的action属性中设置了页面,那么点击图标时只会打开扩展的主页面,为了避免不生效,上面的代码也可以写在主页面对应的js文件里

  $("#runder").click((e) => {//先获取tab的idchrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {let tabId = tabs.length ? tabs[0].id : null;chrome.scripting.executeScript({target: { tabId: tabId },function: () => {document.body.style.backgroundColor = "red";},});});});

在这里插入图片描述

My Bookmarks

官方demo效果:
在这里插入图片描述
这里就简单说一下用到的api,官方用到了jq的弹窗,这里就不介绍了。

官方demo将逻辑写在了主页面的js里,这样方便后续的操作。如果写在background.js里还需要涉及到通信,有些复杂。

获取书签

$("#bookmark").click((e) => {//获取书签chrome.bookmarks.getTree(function (bookmarkTreeNodes) {$("#content").append(JSON.stringify(bookmarkTreeNodes));});
});

将返回结果转成json看了一下是标准的树形结构,可以借助一些插件来进行展示
在这里插入图片描述
创建书签

chrome.bookmarks.create({parentId: parentId, // parentId 父级id,根级是`0`title: title,  //  title书签标题或文件夹名称url: url,   // url书签的跳转链接},callback);  // callback,回调函数

在指定的 parentId 下创建书签或文件夹。如果 url 为 NULL 或缺失,它将是一个文件夹。

删除书签

删除书签或文件夹

chrome.bookmarks.remove(id: string, // idcallback?: function,  //回调函数
)

编辑书签

编辑书签或文件夹

chrome.bookmarks.update(id: string,  //要修改的标签(文件夹)对应的idchanges: {title:string, //要修改的标题url:string   //要修改的url},callback?: function,  //回调函数
)

changes里面的树形是可选的,可以只修改其中一个,也可以两个都修改

查询书签

搜索与给定查询匹配的 BookmarkTreeNodes。使用对象指定的查询会生成匹配所有指定属性的 BookmarkTreeNode。

chrome.bookmarks.search(query: string | object, // 与书签 URL 和标题匹配的一串单词和带引号的短语,或一个对象。如果是一个对象,则可以指定属性query,url, 和title,并且将生成匹配所有指定属性的书签。callback?: function,
)

其他

  • 如果要使用书签的话,需要在manifest.json中声明权限
  • 关于其他方法和事件,可以自行去官网查看

Chromium Milestones

Chromium Milestones 没太看明白这是干什么用的,看插件的描述是:

显示合并了给定代码审查的Chromium发布里程碑

这个不学习

Cookie Clearer

清除cookie,主要讲了获取当前网站的域名,清除该域名下的cookie

在这里插入图片描述
声明
需要在manifest.json 里声明权限和主机权限

"permissions": ["cookies"],
"host_permissions": ["<all_urls>"],

获取当前域名

 $("#domain").click((e) => {chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {let tabUrl = tabs.length ? tabs[0].url : null;if (tabUrl) {let hostname = new URL(tabUrl).hostname$("#content").html(`域名是:${hostname},<br />网址是:${tabUrl}`);} else {$("#content").html("域名不存在");}});});

在这里插入图片描述
chrome.cookies.getAll
从单个 cookie 存储中检索与给定信息匹配的所有 cookie。返回的 cookie 将被排序,路径最长的 cookie 排在最前面。如果多个cookies的路径长度相同,则创建时间最早的cookies优先。

chrome.cookies.getAll(details: object,callback?: function,
)

details是个对象,里面是可选参数,案例中使用的是 domain ,将网站的域名作为参数,获取该域名下存储的所有cookie

demo:

//获取cookie
$('#cookie').click(async e => {const cookies = await getCookies('www.runoob.com')  //这里直接写死域名if (cookies.length == 0) {$("#content").html("cookie不存在");} else {// let str = ''// cookies.forEach(item => {//     str += `${item} <br />`// })$('#content').html(JSON.stringify(cookies))}
})async function getCookies(domain) {try {const cookies = await chrome.cookies.getAll({ domain });if (cookies.length === 0) {return [];}return cookies} catch (error) {return `Unexpected error: ${error.message}`;}
}

在这里插入图片描述
这里遇到了挺多的问题:
问题1:忘记声cookie权限和主机权限了,这个纯属马虎
问题2:最开始一直返回空,通过debugger(可以打断点,当打开插件主页面的控制台后可以进行查看)和百度最后发现,这是个异步的,加上asyncawait 最后成功拿到数据。

chrome.cookies.remove

按名称删除 cookie。

chrome.cookies.remove({url: cookieUrl,name: cookie.name,storeId: cookie.storeId,});
const protocol = cookie.secure ? "https:" : "http:";
const cookieUrl = `${protocol}//${cookie.domain}${cookie.path}`;

这些值都能在cookie 中获取到,可以看上图

其他
其他方法和事件略,可自行查看官方文档。

Omnibox - New Tab Search

在这里插入图片描述
看源代码就是Omnibox来调用谷歌搜索来搜索信息,这里完全可以将谷歌搜索换成百度搜索。Omnibox在之前的文章中介绍过了,这里不浪费时间了。

Web Accessible Resources

用了一下官方的demo,大体功能是指定哪些网站可以访问哪些资源。感觉没啥意思,就不看了,还以为是我一直想了解的如何监听页面请求,获取到页面请求的资源呢

在这里插入图片描述

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

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

相关文章

JVM(六) —— 运行时数据区之堆的详细介绍(一)

JVM&#xff08;六&#xff09; —— 运行时数据区之虚拟机栈的详细介绍核心概述堆空间代码演示堆空间划分&#xff08;重要&#xff09;一个Java程序运行起来是一个进程&#xff0c;这个进程对应着一个JVM实例&#xff0c;一个JVM实例对应着一个运行时数据区。而一个运行时数据…

JAVA设计模式-组合模式

目录 1、例子 2、组合模式基本定义 总结&#xff1a; 1、例子 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在一个页面中展示出学校的院系 组成&#xff0c;一个学校有多个学院&#xff0c;一个学院有多个系传统解决方案&#xff1a; 分析&#xff1a;…

一起学solidity写智能合约——整型(uint和int)

前言 整型一般用的比较多&#xff0c;会在各个合约中见到整型的存在&#xff0c;那么这个类型也是学习路上不可或缺的 环境&#xff1a; remix编译器点我跳转 正文 我们在sol中遇得到很多类型为整型的数据&#xff0c;所以我们的sol提供了两种数据类型的整型&#xff1a; …

基于物联网的户外环境检测装置设计

目 录 摘 要 1 Abstract 2 第1章 绪论 4 1.2 选题背景及意义 4 1.2 研究现状 4 1.3本课题的发展趋势和研究可行性 5 1.4研究主要内容 5 第2章 基于物联网的户外环境检测装置设计概述和相关原理 6 2.1 系统的概述 6 2.1.1 总体设计方案 6 2.1.2 总体框图 6 2.2 相关理论 7 2.2.1…

算法优化 | MATLAB实现BO-RF贝叶斯优化随机森林算法

算法优化 | MATLAB实现BO-RF贝叶斯优化随机森林算法 目录 算法优化 | MATLAB实现BO-RF贝叶斯优化随机森林算法效果一览基本介绍模型结构程序设计学习总结参考资料效果一览 基本介绍 针对集成学习参数众多,缺乏高效准确的参数寻优方法的问题,提出了基于贝叶斯优化随机森林方法…

k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

RK3588+AI工业视觉检测设计方案

本文详细介绍了基于Rockchip RK3588芯片的AI边缘计算主板外形、尺寸、技术规格&#xff0c;以及详细的硬件接口设计参考说明&#xff0c;使客户可以快速将RK3588边缘计算主板应用于工业互联网、智慧城市、智慧安防、智慧交通&#xff0c;智慧医疗等人工智能领域的智能终端设备。…

自定义ClassLoader

一&#xff0c;如何自定义classLoader&#xff1f; 需要使用加载器的loadClass方法&#xff1a;ClassLoader().loadClass 查看loadClass方法源码 首先检查加载&#xff0c;调用父5加载器开始双亲委派机制&#xff0c; 如果没有加载到&#xff0c;就调用findClass方式 打开发现…

JVM加载class文件的原理机制

JVM加载class文件的原理机制 JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的&#xff1b; 当Java程序需要使用某个类时&#xff0c;JVM会确 保这个类已经被加载、连接(验证、准备和解析)和初始化。 类的加载是指把类的.class文件中的数据 读入到内存中&#xff0c…

神经网络中各个隐藏层,深度神经网络隐藏层数

1、神经网络的隐含层节点数怎么设置啊&#xff1f;比如要设置18层隐含节点数&#xff01;跪求&#xff0c;工作急用&#xff01; 隐层一般是一层或两层&#xff0c;很少会采用三层以上&#xff0c;至少隐层的节点数确定&#xff0c;一般有以下几种方法&#xff1a;1、有经验的…

【ArchSummit】通过ArchSummit 全球架构师峰会对企业数字化转型的思考

前言 &#x1f4eb; 作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &a…

生命在于学习——Socket编程(偏安全方面)

本篇文章仅用于学习记录和交流&#xff0c;不得用于其他违规用途&#xff0c;产生的不良后果&#xff0c;自己负责。 一、Socket介绍 首先socket (套接字) 是工作在应用层和传输层之间一个抽像层 , 为什么要有他呢 ? 虽然我们已经有了ipport可以和世界上任意一台计算机上的软…

chainlink 小实战 web3 “捐助我”项目合约及前端交互——关于 《Patrick web3 course Lesson 7-8 》课程代码中文详解

FundMe lesson 的 示例 本质上是一个合约上对 eth 接收和发送的演示&#xff0c;但这个演示增加了前端 ethers 的交互&#xff0c;以及对 chainlink 预言机喂价的使用。 总体来说是一些 Defi 项目上的某一块功能的缩影&#xff0c;不过总体来说还是挺简单的。 若不会 chainli…

(附源码)计算机毕业设计SSM基于JAVA人事管理系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于JAVA人事管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

Android系统10 RK3399 init进程启动(四十二) init.rc文件解析逻辑

配套系列教学视频链接&#xff1a; 安卓系列教程之ROM系统开发-百问100ask 说明 系统&#xff1a;Android10.0 设备&#xff1a; FireFly RK3399 &#xff08;ROC-RK3399-PC-PLUS&#xff09; 前言 Android init启动的时候会解析init.rc&#xff0c; 当然还有很多其他rc文…

DPR和REALM论文笔记

DPR(2020 EMNLP) 该论文的模型主要是一个双塔结构如下所示&#xff1a; 整个模型的训练数据D包含m个例子&#xff0c;其中每个例子由一个问题qiq_iqi​、一个相关段落pip_i^pi​、n个不相关段落pi,1−,⋯,pi,n−p_{i,1}^-,\cdots,p_{i,n}^-pi,1−​,⋯,pi,n−​ D{⟨qi,pi,pi,…

JUC-3.三大辅助类/阻塞队列/forkjoin

目录 一、三大辅助类 1.1 CountDownLatch 1.2 CyclicBarrier 1.3 Semaphore 二、阻塞队列 2.1 概念 2.2 常用的阻塞队列 三、forkjoin 一、三大辅助类 JUC 中提供了三种常用的辅助类&#xff0c;通过这些辅助类可以很好的解决线程数量过 多时 Lock 锁的频繁操作。…

【ASM】字节码操作 转换已有的类 Class Transformation 原理 【重要】

文章目录 1.概述2. Class-Reader/Visitor/Writer2.1建立联系2.2执行顺序2.3执行顺序的代码演示3.串联的Field/MethodVisitors4. Class TransformationJ4F5.总结1.概述 上-篇文章:【ASM】字节码操作 转换已有的类 ClassReader 删除方法 添加方法 2. Class-Reader/Visitor/Wri…

(附源码)计算机毕业设计SSM基于Java家庭财务管理系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于Java家庭财务管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

《视觉SLAM十四讲》 编译报错问题汇总 Ubuntu20.04

Ubuntu 20虚拟机环境安装 高翔原视频是ubuntu14.04&#xff0c;看了一下&#xff0c;有很多库都有兼容问题&#xff0c;所以初步按这个Ubuntu 20装&#xff1a; 这个教程是ubuntu20的,用ubuntu14会不兼容&#xff0c;比如qt5.12.12无法安装等&#xff08;需要5.12.3&#xff0…