使用plasmo开发浏览器插件在网页指定位置添加自定义UI

使用plasmo开发浏览器插件的时候,有时候需要在指定网站的指定页面添加自定义的UI内容,如果通过content.js内容脚本去通过js创建的话,可就太麻烦了,要写不少的js代码。不过plasmo已经帮我们实现了这个功能,就是Content Scripts UI,官方地址:Content Scripts UI – Plasmo

创建内容UI脚本

在contents里面创建文件:plasmo.tsx

可以单独匹配对应的网站,可以初始化监听更新UI位置,可以获取渲染位置的UI:

import type {PlasmoCSConfig,PlasmoGetOverlayAnchor,PlasmoWatchOverlayAnchor,
} from 'plasmo'export const config: PlasmoCSConfig = {matches: ['https://www.plasmo.com/*'],
}// watch page ui change,then reset ui position
export const watchOverlayAnchor: PlasmoWatchOverlayAnchor = (updatePosition
) => {const interval = setInterval(() => {updatePosition()}, 420)return () => clearInterval(interval)
}// get ui render position
export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>document.querySelector(`header > div > a[href="/"]`)// ui components
const PlasmoPricingExtra = () => (<spanstyle={{borderRadius: 4,background: 'violet',padding: 4,position: 'absolute',top: 44,width: 100,}}>自定义UI组件,显示在Plasmo网站的LOGO下面</span>
)export default PlasmoPricingExtra

生命周期和配置UI说明

生命周期:

可选配置浮动显示在顶层

1.可以配置只在某个元素附近显示UI:使用getOverlayAnchor

import type { PlasmoGetOverlayAnchor } from "plasmo"// 声明我要挂在到哪个元素上 
export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>document.querySelector("#pricing")

显示效果: 

2.也可以配置在所有查询到的元素附近显示UI: 

import type { PlasmoGetOverlayAnchorList } from "plasmo"// 将ui挂载到查询到的所有元素上
export const getOverlayAnchorList: PlasmoGetOverlayAnchorList = async () =>document.querySelectorAll("a")

显示效果:

3.初始化更新UI显示的位置

如果不初始化更新这个UI的位置,会导致UI显示位置不准确:这个位置明显靠下

加上初始化监听更新UI位置配置:

// watch page ui change,then reset ui position
export const watchOverlayAnchor: PlasmoWatchOverlayAnchor = (updatePosition
) => {const interval = setInterval(() => {updatePosition()}, 420)return () => clearInterval(interval)
}

然后再刷新页面: 

Inline显示插入在页面DOM中

使用getInlineAnchor和PlasmoInline组件,就可以让UI元素插入到页面DOM上:

import type { PlasmoCSConfig, PlasmoGetInlineAnchor } from 'plasmo'
import cssText from 'data-text:~/contents/index.css'export const config: PlasmoCSConfig = {matches: ['https://www.plasmo.com/*'],
}// load style file
export const getStyle = () => {const style = document.createElement('style')style.textContent = cssTextreturn style
}// insert into page dom
export const getInlineAnchor: PlasmoGetInlineAnchor = () =>document.querySelector(`[href="/#pricing"]`)// Use this to optimize unmount lookups
export const getShadowHostId = () => 'plasmo-inline-example-unique-id'const PlasmoInline = () => {return (<divclassName="csui"style={{borderRadius: 4,padding: 4,background: 'pink',}}>CSUI INLINE</div>)
}export default PlasmoInline

显示效果:插入到页面DOM元素中

 

像使用React一样创建UI

给元素绑定点击事件,或者添加自定义样式等:

比如我这里创建了一个index.css文件,是自定义样式内容。

就需要通过引入到当前内容脚本里面:

import cssText from 'data-text:~/contents/index.css'export const config: PlasmoCSConfig = {matches: ['https://www.plasmo.com/*'],
}export const getStyle = () => {const style = document.createElement('style')style.textContent = cssTextreturn style
}

绑定点击事件什么的:

import type {PlasmoCSConfig,PlasmoGetOverlayAnchor,PlasmoWatchOverlayAnchor,
} from 'plasmo'
import cssText from 'data-text:~/contents/index.css'export const config: PlasmoCSConfig = {matches: ['https://www.plasmo.com/*'],
}export const getStyle = () => {const style = document.createElement('style')style.textContent = cssTextreturn style
}// watch page ui change,then reset ui position
export const watchOverlayAnchor: PlasmoWatchOverlayAnchor = (updatePosition
) => {const interval = setInterval(() => {updatePosition()}, 420)return () => clearInterval(interval)
}// get ui render position
export const getOverlayAnchor: PlasmoGetOverlayAnchor = async () =>document.querySelector(`header > div > a[href="/"]`)// ui components
const PlasmoPricingExtra = () => {const handleClick = () => {console.log('click custom ui span')}return (<spanonClick={handleClick}className="customUi"style={{borderRadius: 4,background: 'violet',padding: 4,position: 'absolute',top: 44,width: 100,}}>自定义UI组件,显示在Plasmo网站的LOGO下面</span>)
}export default PlasmoPricingExtra

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

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

相关文章

Linux系统开发静态库制作

这篇博客记录静态库的制作过程 目录 操作步骤&#xff1a; 1、先准备2个文件 2、编译add.c和sub.c&#xff0c;但是不链接 3、使用ar工具和ranlib工具创建静态库&#xff0c;静态库文件是.a格式结尾 4、在业务代码里面使用自定义方法 5、编译test.c文件并连接库文件 6、…

如何在多个地理位置的企业中部署SD-WAN?

企业业务的全球化和分布式办公模式的普及&#xff0c;跨地域的网络连接变得至关重要。SD-WAN&#xff08;软件定义广域网&#xff09;技术为企业提供了一种灵活、高效、安全的网络解决方案。本文将介绍如何在多个地理位置的企业中部署SD-WAN&#xff0c;以提高网络性能和管理效…

剑指offer--数组中重复的数字

一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求&#xff0c;要在每天凌晨5点的时候执行一个任务&#xff0c;获取一系列的PDF文件并解析。 后端是Django框架&#xff0c;定时任务用Celery来实现的。 本地跑没什么问题&#xff0c;但是一放到服务器上跑就会宕机&#xff0c;而且是毫无征兆的宕机&#xff0c;…

redis对象list

Redis List是一组连接起来的字符串集合。 写操作&#xff1a; LPUSH 语法:LPUSH key value [value …] 功能:从头部增加元素,返回值为List中元素的总数。 RPUSH 语法:RPUSH key value [value …] 功能:从尾部增加元素,返回值为List中元素的总数。 LPOP 语法:LPOP key 功能…

使用Leaflet.rotatedMaker进行航班飞行航向模拟的实践

目录 前言 一、Leaflet的不足 1、方向插件 2、方向控制脚本说明 二、实时航向可视化实现 1、创建主体框架 2、飞机展示 3、位置和方位模拟 三、成果及分析 1、成果展示 2、方向绑定解读 总结 前言 众所周知&#xff0c;物体在空间中的运动&#xff08;比如飞行、跑步…

基于51单片机甲醛浓度检测设计

基于51单片机甲醛浓度检测设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.甲醛浓度数据经过单片机处理&#xff0c;由LCD1602实时显示。 2.可通过按键设置甲醛报警阈值&#xff…

幂函数计算指令(CODESYS ST语言)

非线性传感器的测量往往需要幂函数计算指令,PLC里往往并没有现成的幂函数指令,需要我们自己构造 1、非线性传感器测量 模拟量采集非线性函数(真空度计算)_plc三菱對真空計算法-CSDN博客文章浏览阅读876次,点赞2次,收藏8次。工业现场大部分传感器都是线性变换关系,关于…

CVE-2023-4427:Out-of-bounds access in ReduceJSLoadPropertyWithEnumeratedKey

文章目录 前言环境搭建for-in && enum cache漏洞分析漏洞利用总结参考 前言 之前分析调试漏洞时&#xff0c;几乎都是对着别人的 poc/exp 调试&#xff0c;感觉对自己的提升不是很大&#xff0c;所以后面分析漏洞时尽可能全面分析&#xff0c;从漏洞产生原理、如何稳定…

HTML 点击图片后悬浮放大图片

引入插件 1.viewer.js 2.引入viewer.css 3.引入jquery-viewer.min.js 4.添加图片点击事件function click(){ $(<img>, {src: 图片url }).viewer(show); } 效果图&#xff1a; 可网上自行下载对应插件&#xff0c;或新建相关命名文件后&#xff0c;把我下文的js代码…

10个热门的AI工具和官网地址(值得收藏)

人工智能 (AI) 发展迅猛&#xff0c;各种AI工具如雨后春笋般涌现&#xff0c;改变着我们的工作和生活方式。从文本生成到图像创作&#xff0c;从视频制作到语音合成&#xff0c;AI工具正在渗透到各个领域&#xff0c;为我们带来前所未有的效率和可能性。准备好迎接AI浪潮了吗&a…

【C++】新的类功能和可变参数模板

目录 一、新的类功能1.1 默认成员函数1.1.1 移动构造函数1.1.2 移动赋值运算符重载 1.2 关键字default1.3 关键字delete 二、可变参数模板2.1 可变参数的函数模板2.2 递归方式展开函数2.3 empalce 一、新的类功能 1.1 默认成员函数 在之前的学习过程中&#xff0c;我们已经知…