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

news2024/11/28 20:42:37

使用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 = () => (
    <span
        style={{
            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 = cssText
    return 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 (
        <div
            className="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 = cssText
    return 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 = cssText
    return 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 (
        <span
            onClick={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.coloradmin.cn/o/1562370.html

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

相关文章

安全防御产品—锐安盾重磅上线,助力更安全、更流畅的业务体验

在互联网时代&#xff0c;互联网技术蓬勃发展&#xff0c;然而&#xff0c;随之而来的网络安全问题也备受关注。诸如DDoS攻击、CC攻击、常见Web攻击等攻击手段突如其来&#xff0c;导致企业业务中断&#xff0c;严重影响企业业务正常运行。对此&#xff0c;锐成云重磅推出安全防…

分布式全闪占比剧增 152%,2023 年企业存储市场报告发布

近日&#xff0c;IDC 发布了 2023 年度的中国存储市场报告。根据该报告&#xff0c;在 2023 年软件定义存储的市场占比进一步扩大&#xff0c;分布式全闪的增长尤其亮眼&#xff0c;其市场份额从 2022 年的 7% 剧增到 2023 年的 17.7%&#xff0c;增长了 152%。 01 中国企业存…

提升LLM效果的几种简单方法

其实这个文章想写很久了&#xff0c;最近一直在做大模型相关的产品&#xff0c;经过和团队成员一段时间的摸索&#xff0c;对大模型知识库做一下相关的认知和总结。希望最终形成一个系列。 对于知识库问答&#xff0c;现在有两种方案&#xff0c;一种基于llamaindex&#xff0…

绝地求生:[更新周报] 4/3 不停机更新:无上新、众多物品和活动即将下架!

大家好&#xff0c;我闲游盒&#xff1b;本周三4月3号&#xff0c;绝地求生不会有停机时间&#xff0c;大家可以随便玩~ ▲本周可选地图池 亚服/东南亚服&#xff1a;艾伦格、荣都、萨诺、米拉玛、帕拉莫&#xff1b; 日服/韩服KAKAO服&#xff1a;艾伦格、泰戈、萨诺、荣都、…

​港中文提出CLongEval中文基准测试集,准确评估大模型长上下文能力

论文题目&#xff1a; ClongEval: A Chinese Benchmark for Evaluating Long-Context Large Language Models 论文地址&#xff1a; https://arxiv.org/abs/2403.03514 代码地址&#xff1a; https://github.com/zexuanqiu/CLongEval 研究背景和贡献 为了使 LLM 能够支持更复杂…

STM32学习笔记(9_2)- USART串口外设

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 在STM3…

ES-7.12-官网阅读-ILM-自定义内置ILM策略

官网地址&#xff1a;Tutorial: Customize built-in ILM policies | Elasticsearch Guide [7.12] | Elastic 教程&#xff1a;自定义内置ILM策略&#xff08;Customize built-in ILM policies&#xff09; Elasticsearch包含如下内建ILM 策略&#xff1a; logs&#xff08;日…

【项目技术介绍篇】若依项目代码文件结构介绍

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

数据可视化高级技术(Echarts)

目录 &#xff08;一&#xff09;数据可视化概念及Echarts基础知识 数据可视化的好处&#xff1a; 数据可视化的目标 数据可视化的基本流程 &#xff08;二&#xff09;数据图表 类别比较图表&#xff1a; 数据关系图表&#xff1a; 数据分布图表&#xff1a; 时间序列…

增加网站搜索引擎排名的6个准则

怎样提高网站排名首页 在竞争激烈的网络世界中&#xff0c;网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页&#xff0c;意味着更多的曝光和点击率。以下是一些方法&#xff0c;可以帮助您提高网站在搜索引擎中的排名&#xff0c;让其跻身首页&#xf…

基于STC12C5A60S2系列1T 8051单片机的数码管显示IIC总线器件AT24C02记录单片机上电次数应用

基于STC12C5A60S2系列1T 8051单片机的数码管显示IIC总线器件AT24C02记录单片机上电次数应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍…

Vmware虚拟机远程SSH连接失效解决方法及分析过程

问题描述 系统为CentOS7 64位 一向能够正常连接 在某次使用FinalShell进行远程SSH连接时 突然无法连接 对问题原因猜测及尝试 1.dns解析失效 发现显示DNS无法解析,可以得知是使用了主机名登录,而主机名无法登录. 遂查看host文件.host文件因不知名原因被清空,重新恢复后该问…

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?

汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…

学习transformer模型-broadcast广播的简明介绍

broadcast的定义和目的&#xff1a; 广播发生在将较小的张量“拉伸”以具有与较大张量兼容的形状&#xff0c;以便执行操作时。 广播是一种有效执行张量操作而不创建重复数据的方式。 广播的处理过程&#xff1a; 1&#xff0c; 确定最右边的维度是否兼容 每…

视觉信息处理与FPGA实现第八次作业——verilog实现对比度调节

一、查看灰度图的数据格式 1.1 安装HxD HxD下载链接&#xff1a;https://download.csdn.net/download/weixin_44357071/89045331 解压直接打开exe就能使用。 将需要查看二进制数据的图片拖到软件框里就能读取 1.2 找到bmp图像的图片点阵数据起始地址&#xff0c;原理和例子…

【数据结构】非线性结构---二叉树

1、树 1.1 树的相关概念 节点的度&#xff1a;一个节点含有的子树的个数称为该节点的度&#xff1b; 如上图&#xff1a;A的为6 叶节点或终端节点&#xff1a;度为0的节点称为叶节点&#xff1b; 如上图&#xff1a;B、C、H、I...等节点为叶节点 非终端节点或分支节点&#…

中断服务程序模板

通常定时器初始化过程如下: ①对 TMOD赋值,以确定TO和T1的工作方式。 ②计算初值,并将初值写入THO、TLO或TH1、TL1。 ③中断方式时&#xff0c;则对IE赋值&#xff0c;开放中断。 ④使TRO或TR1置位&#xff0c;启动定时器/计数器定时或计数。 代码 利用定时器0工作方式1&…

数据结构(六)——图的应用

6.4 图的应用 6.4.1 最小生成树 对于⼀个带权连通⽆向图G (V, E)&#xff0c;⽣成树不同&#xff0c;每棵树的权&#xff08;即树中所有边上的权值之和&#xff09;也可能不同。设R为G的所有⽣成树的集合&#xff0c;若T为R中边的权值之和最小的生成树&#xff0c;则T称为G的…

算法打卡day23

今日任务&#xff1a; 1&#xff09;39. 组合总和 2&#xff09;40.组合总和II 3&#xff09;131.分割回文串 39. 组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 给定一个无重复元素的数组 candidates 和一个目标数 target &#xff0c;…

人工智能之深度学习笔记——每天五分钟快速掌握深度学习理论

本专栏会对深度学习以及深度学习搭建技巧做一个详尽的介绍&#xff0c;相信大家阅读完本专栏之后&#xff0c;深度学习已经不是一个遥不可及的名词&#xff0c;我们会知道它究竟是什么&#xff0c;本专栏尽可能地简单详细地介绍每一个深度学习知识&#xff0c;帮助每天只用很少…