使用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.mzph.cn/news/787441.shtml

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

相关文章

WRF vortex-following 设置

WRF&#xff08;Weather Research and Forecasting&#xff09;是一种用于天气和气候模拟的开源模型。在WRF中选择使用vortex-following方法进行模拟时&#xff0c;主要是为了更准确地捕捉气旋&#xff08;vortex&#xff09;的演变和特征。以下是详细的流程描述以及相关的name…

abc-347

title: abc 347 date: 2024-04-01 01:57:25 tags: 比赛 categories: 赛后思考与总结 A 思路 能够被整除的就输出 代码 void solve() {int n,k;cin >> n >> k;vector<int> vec;for(int i 1; i < n ; i ){int x; cin >> x;if(x % k 0) vec.push_…

【CAD建模号】学习笔记(一)

一、概述 CAD建模号是一款用于在智能手机及平板电脑等移动设备上进行三维建模的app&#xff0c;最初发布于2019年。 二、基本操作 手指直接点按&#xff0c;拖动来粗略创建和操作对象&#xff1b;双指缩放视图&#xff0c;双指移动视图。手指长按屏幕&#xff0c;出现红色小…

css-盒子阴影

1.box-shadow: 10px 20px 10px 10px blue; 参数对应顺序&#xff1a;上下&#xff0c;左右 &#xff0c;模糊程度&#xff0c;颜色 &#xff0c;阴影大小 2.box-shadow: 10px 20px 10px 20px blue,-10px -20px 10px 50px red; 负号就是相反方向 支持多个阴影 在后面加逗号 3…

汽车充电桩主板购买渠道汇总

随着充电桩设施的迅速普及&#xff0c;充电桩作为其中关键组件之一&#xff0c;市场需求不断增长。在互联网科技飞速发展的背景下&#xff0c;充电桩主板的采购渠道更加多元化&#xff0c;下面我们来探讨消费者、充电桩运营商和生产商可以从何处购买充电桩主板。 直接联系制造商…

elementUI 输入框按回车刷新页面问题

分析原因&#xff1a; 当 el-form 表单内只有一个 el-input 输入框时&#xff0c;且type为text类型时&#xff0c;在输入框内按回车就会触发表单的提交事件。 而当 el-form 表单内有多个 el-input 输入框时&#xff0c;按回车不会执行任何操作。 使用.prevent修饰符来阻止默…

Python读取PDF文字 去掉页眉页脚

使用PyMuPDF&#xff08;即fitz&#xff09;读取PDF中的text时&#xff0c;会把页码也读进来。所以&#xff0c;有时候就需要让程序忽略页眉和页脚&#xff0c;或者直接删除页眉和页脚。 根据fitz的文档&#xff1a;Page - PyMuPDF 1.24.0 documentation get_text的clip参数可…

10-代码随想35搜索插入位置

35.搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 示例 1: 输入: [1,3,5,6], 5 输出: 2 示例 2: 输入: [1,3,5…

vue 父组件怎么获取子组件里面的data数据

在Vue中&#xff0c;父组件可以通过ref引用子组件&#xff0c;并通过$refs属性来访问子组件的数据。以下是实现步骤&#xff1a; 1. 在子组件中设置data&#xff1a;** 首先&#xff0c;在子组件中设置需要获取的数据&#xff0c;例如&#xff1a; // 子组件中 export defa…

AWS迁移教程,Redis迁移到Elasticache

当企业不断出海拓展业务&#xff0c;面临的挑战之一就是如何高效迁移应用程序及数据库至云端。为解决这一问题&#xff0c;AWS云专门提供多种简单且高效的迁移方式&#xff0c;进行帮助企业实现应用程序的平稳迁移&#xff0c;从而降低迁移过程中的风险和成本。下面九河云将为大…

小程序地理位置接口wx.getLocation申请审核解决方法(详细说明及避坑)

本人申请了三次才最终通过&#xff0c;简单说一下坑 前几天想实现定位功能改了一天代码手机上也不行。 晚上登上小程序管理界面才发现那个功能要申请。。。那就申请呗 1. 申请路径 小程序页面-开发-开发管理-接口设置-地理位置 之后就提交申请&#xff0c;两次都不过就不理解了…

67、yolov8目标检测和旋转目标检测算法batchsize=1/6部署Atlas 200I DK A2开发板上

基本思想:需求部署yolov8目标检测和旋转目标检测算法部署atlas 200dk 开发板上 一、转换模型 链接: https://pan.baidu.com/s/1hJPX2QvybI4AGgeJKO6QgQ?pwd=q2s5 提取码: q2s5 from ultralytics import YOLO# Load a model model = YOLO("yolov8s.yaml") # buil…

云智慧:拥抱AI算法驱动的智能运维服务创新引擎

随着信息化、数字化、智能化的加码&#xff0c;企业对人工智能、大数据等技术应用呈现出明显兴趣&#xff0c;海笔研究对国内中型规模企业调研表明&#xff0c;在2020年&#xff0c;54.1%的企业选择购买人工智能类应用&#xff0c;41.9%的企业选择购买大数据及BI类应用&#xf…

标准库不带操作系统移植FreeModbus到STM32

添加FreeModbus代码 首先准备一个空白的标准库项目。 下载FreeModbus源码。 将源码中的modbus文件夹复制到项目路径下&#xff0c;并把demo->BARE->port文件夹的内容也添加进来。 新建一个文件port.c备用。然后打开项目&#xff0c;将上述文件添加至项目&#xff0c;…

简述双亲委派机制

双亲委派机制是Java虚拟机&#xff08;JVM&#xff09;在加载类时遵循的一种类加载器层次结构与协作规则。它定义了当一个类加载器接收到类加载请求时&#xff0c;首先将加载任务委托给其父类加载器&#xff0c;直至请求到达最顶级的类加载器。只有当父类加载器无法完成加载时&…

php phar反序列化POC编写笔记

具体结构不细究&#xff0c;主要方便写poc代码&#xff0c;比如有如下文件内容&#xff1a; 文件内容如下&#xff1a; file base64.b64decode("PD9waHAgX19IQUxUX0NPTVBJTEVSKCk7ID8DQp9AQAAAQAAABEAAAABAAAAAABHAQAATzo0MDoiSWxsdW1pbmF0ZVxCcm9hZGNhc3RpbmdcUGVuZG…

Leetcode 27. 移除元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

Kepler无代码:让应用开发0门槛,普通人秒变“大神”!

在数字化时代&#xff0c;软件开发应用已成为我们生活和工作中不可或缺的一部分。 然而&#xff0c;对于大多数人来说&#xff0c;编写代码、开发应用似乎是一个遥不可及的技能。幸运的是&#xff0c;随着无代码平台的兴起&#xff0c;普通人也能轻松成为应用开发者&#xff0…

实战篇:商品API接口在跨平台销售中的有效运用与案例解析

引言 随着电子商务的蓬勃发展&#xff0c;企业为了扩大市场覆盖面&#xff0c;经常需要在多个在线平台上展示和销售产品。然而&#xff0c;手工管理多个平台的库存、价格、商品描述等信息既耗时又容易出错。商品API接口在这一背景下显得尤为重要&#xff0c;它能够帮助企业在不…

Node.js-------初识Node.js与内置模块

能够知道什么是 Node.js能够知道 Node.js 可以做什么能够说出 Node.js 中的 JavaScript 的组成部分能够使用 fs 模块读写操作文件能够使用 path 模块处理路径能够使用 http 模块写一个基本的 web 服务器 一.初识Node.js 1.浏览器中的 JavaScript 的组成部分 2.Node.js 简介 …