使用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 = () => (
    <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

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

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

相关文章

「51媒体网」媒体邀约现场采访的优势有哪些?

传媒如春雨&#xff0c;润物细无声的&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约现场采访的优势主要表现在以下几个方面&#xff1a; 实时报道与传播&#xff1a;现场采访能够让媒体了解活动的真实性&#xff0c;此外&#xff0c;到场报道媒体可以实时迅速将…

谷粒商城实战(009 缓存-分布式锁)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第158p-第p165的内容 分布式锁 原理和使用 使用下shell对产生的命令进行发送 查看 -> 撰写 -> 撰写栏 idea 选中的代码提取成方法 加锁…

go优雅读取zip压缩包-进阶2

【前言】 看到这里就晓得了&#xff0c;之前那一一篇文章go优雅读取zip压缩包&#xff0c;依旧还是有些问题&#xff0c;接下来&#xff0c;我就开始描述下本文章讲述的内容&#xff1a; 面对需要多次读取多个zip压缩包里的指定文件内容&#xff0c;如何提升读取的速度&#x…

smart link实验配置

相关知识点&#xff1a;stp生成树协议&#xff0c;收敛时间慢会导致丢帧&#xff0c;所以利用samrt link配置 1.分主从端口&#xff0c;正常情况下主端口工作&#xff0c;从端口阻塞&#xff0c;防止回路&#xff0c;主端口出问题&#xff0c;切换从端口&#xff0c;并通过flu…

寒冬已逝,“量子春天”正来

最近&#xff0c;全球对量子技术领域的私人投资有所下降&#xff0c;引发了一些观点认为这个领域可能正逐渐衰退。 政治家、资助者和投资者并不总是以科学为关注焦点。然而&#xff0c;某些科技领域偶尔会成为热点&#xff0c;正如20世纪50年代核能技术的兴起&#xff0c;那时人…

分月饼 java题解

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in); int m sc.nextInt(); // 读取员工数量mint n sc.nextInt(); // 读取月饼数量n// 调用distribute方法并打印返回的分配方法总数//先默认每人分一个…

​慧天[HTWATER]可以与与SWMM模型之间实现转换吗?

​慧天[HTWATER]软件简介 针对城市排水系统基础设施数据管理的需求&#xff0c;以及水文、水力及水质模拟对数据的需求&#xff0c;实现了以数据库方式对相应数据的存储。可以对分流制排水系统及合流制排水系统进行地表水文、管网水力、水质过程的模拟计算。可以对城市低影响开…

echarts仪表盘特殊样式

const drawChartOption function (value, max) {const colorConfig {name: 测试,colorList: {text: #fff,line2: {type: linear,x: 0, // 右y: 0, // 下x2: 1, // 左y2: 0, // 上colorStops: [// {// offset: 0,// color: transparent// },{offset: 0.1,color: #031e…

TikTok防关联引流系统:全球多账号运营的终极解决方案

tiktok防关联引流系统介绍&#xff0c;tiktok防关联系统是基于tiktok生态研发的效率工具&#xff0c;帮你快速实现tiktok全球多账号运营&#xff0c;系统配备了性能强劲的安卓&#xff0c;防关联智能终端&#xff0c;可一建创建全球多国手机环境&#xff0c;完美满足各类app软件…

CX3324A是德科技CX3324A器件电流波形分析仪

181/2461/8938产品概述&#xff1a; 器件电流波形分析仪&#xff0c;1 GSa/s&#xff0c;14/16 位&#xff0c;4 通道 主机功能特性 为电流和差分传感器以及无源探头接口适配器提供 4 个模拟通道带宽选件&#xff1a;50 MHz、100 MHz、200 MHz存储器深度选件&#xff1a;4 M…

eclipse操作

1. 屏蔽不用的代码或文件夹 右键需要屏蔽的文件夹或文件&#xff0c;选择properties&#xff0c;选择c/c build &#xff0c;在Exclude resource from build 前面勾选&#xff0c;然后点击apply应用&#xff0c;就屏蔽了这个文件夹或者文件了&#xff0c;编译时就会忽略。 设置…

浅聊什么是Redis?

需求&#xff1a;MySQL面临大量的查询&#xff0c;即读写操作&#xff0c;因此类比CPU&#xff0c;给数据加缓存&#xff0c;Redis诞生。应用程序从MySQL查询的数据&#xff0c;在Redis设置缓存&#xff08;记录在内存中&#xff0c;无需IO操作&#xff09;&#xff0c;后再需要…

Linux(CentOS)安装Redis教程_简单快捷

一、安装依赖 因为redis是用C语言开发的&#xff0c;所以在安装之前需要确定是否安装gcc环境&#xff08;gcc -v&#xff09;&#xff0c;如果没有安转可以执行一下命令进行安装 [rootlocalhost ~]# yum install -y gcc 二、下载安装包 1.在官网先进行下载 官网地址&#x…

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

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

从“量子”到分子:探索计算的无限可能 | 综述荐读

在2023年年末&#xff0c;两篇划时代的研究报告在《科学》&#xff08;Science&#xff09;杂志上引发了广泛关注。这两篇论文分别来自两个研究小组&#xff0c;它们共同揭示了单氟化钙分子间相互作用的研究成果&#xff0c;成功地在这些分子间创造出了分子量子比特。这一成就不…

理解二分类场景评估中的Recall和Precision

场景解释&#xff1a; 二分类场景会有两种输出。我的样本里有猫的图片和其他的图片。我的输出值是“是猫”和“非猫”。这个场景下&#xff0c;“是猫”是我的正样本(Postive)。“非猫”是我的负样本(Negative)。 Confusion matrix: 横向表示预测的结果。纵向表示真实的结果。…

生命之重-ICU门口的守望人

有人说如果没有经历过在ICU门口守候的人&#xff0c;就无法真正懂得珍惜生命。但实际情况也未必尽然&#xff0c;不过这种经历确实可以教会你懂得珍惜&#xff0c;当然希望大家都不要亲身经历。我希望能够通过讲述一个真实的故事来呈现这一观点&#xff0c;而不是令人难以接受的…

Linux部署Kafka2.8.1

安装Jdk 首先确保你的机器上安装了Jdk&#xff0c;Kafka需要Java运行环境&#xff0c;低版本的Kafka还需要Zookeeper&#xff0c;我此次要安装的Kafka版本为2.8.1&#xff0c;已经内置了一个Zookeeper环境&#xff0c;所以我们可以不部署Zookeeper直接使用。 1、解压Jdk包 t…

idea了解

1、快捷键 1.1、编辑美化相关 1.1.1、双击选中一个单词&#xff0c;三击选中一行代码 1.1.2、ctrlD&#xff1a;快速粘贴复制&#xff1b;光标所在复制 1.1.3、altinsert&#xff1a;构造方法的快速生成&#xff1b;toString方法快速生成&#xff1b;等等 1.1.4、ctrlR:快…

怎样给文件夹中的文件依次编号?选择合适的方法给文件依次编号

在日常生活和工作中&#xff0c;我们经常需要对文件夹中的文件进行编号&#xff0c;以便更好地管理和查找。编号的方式多种多样&#xff0c;可以根据不同的需求和场景来选择。下面&#xff0c;我将详细介绍如何给文件夹中的文件依次编号。 一、了解编号的目的和需求 在给文件编…