plasmo开发浏览器插件MAIN模式的content脚本和普通模式content脚本通讯方案

news2025/1/8 11:22:38

plasmo是一个很棒的开发浏览器插件的框架,可以使用react和vue等语言开发,也是目前github上star数量最多的开发浏览器插件的框架。

github仓库地址:GitHub - PlasmoHQ/plasmo: 🧩 The Browser Extension Framework

官网地址:Supercharge your browser extension development – Plasmo

我这里开发的时候,遇到一个问题,就是需要在内容脚本里面使用MAIN模式,因为我要使用原生网页里面的富文本编辑组建,使用这个组件的编辑函数,像里面插入内容。不是MAIN模式的content脚本是无法使用这个dom组件的编辑函数的:

const contnetDiv: any = document.querySelector('.CodeMirror')

// 普通的内容脚本无法获取到setValue这个函数
contnetDiv.CodeMirror.setValue(content)

问题描述

但是使用了MAIN模式的内容脚本,就会完全注入到网页的JS运行环境中,这个时候,就无法使用插件的Storage来存储和获取插件里面的数据了,只能获取到网页的localStorage里面的数据。

但是我通过插件获取到了一个文本内容,存储在插件的storage里面,然后想通过MAIN的内容脚本将这些内容插入到富文本编辑器里面,这个时候就出现问题了:MAIN的内容脚本拿不到插件的storage里面的数据啊!尴尬了

解决办法

第一个方式:在background脚本里面动态插入这个内容脚本

通过查找官网,也没有说明该怎么操作,但是在github上发现一种方式,就是使用动态插件内容脚本的方式,将这个js脚本文件插入进入,好像是可以使用storage里面的数据,有待验证。

第二个方式:编写一个中间件内容脚本,在这个中间件内容脚本里面获取到插件的数据,然后将数据通过document.body.appendChild方法插入到网页的DOM里面,然后在MAIN的内容脚本里面通过监听DOM变化,就可以拿到中间件插入的数据了

输入插入DOM的代码:

        // 将文章追加到html中,间接给sender发文章数据
        console.log('articles one is :', one, articles)
        const titleDiv = document.createElement('div')
        titleDiv.id = 'titleDiv'
        titleDiv.style.display = 'none'
        titleDiv.innerText = one.title
        document.body.appendChild(titleDiv)
        const contentDiv = document.createElement('div')
        contentDiv.id = 'contentDiv'
        contentDiv.style.display = 'none'
        contentDiv.innerText = one.content
        document.body.appendChild(contentDiv)

 

在MAIN的内容脚本里面监听DOM变化: 

监听DOM变化的代码:

// 监听dom变化
const listenDom = () => {
    //选择一个需要观察的节点
    var targetNode = document.body
    // 设置observer的配置选项
    var configMutation = { attributes: true, childList: true, subtree: true }
    // 当节点发生变化时的需要执行的函数
    var callback = function (mutationsList, observer) {
        // 监听到文章内容后,就不再监听页面变化了
        if (editModul === null) {
            for (var mutation of mutationsList) {
                // 检测并获取titleDiv和contentDiv
                const titleDiv = document.getElementById('titleDiv')
                const contentDiv = document.getElementById('contentDiv')
                if (
                    mutation.type == 'childList' &&
                    editModul === null &&
                    titleDiv &&
                    contentDiv
                ) {
                    console.log('sender listen 元素节点变化')
                    title = titleDiv.innerText
                    sendArt = contentDiv.innerText
                    // 找到所有的图片链接
                    findImg(sendArt)
                    // 给编辑器赋值
                    juejin(title, sendArt)
                } else {
                    // console.log('sender listen 样式属性变化')
                }
            }
        }
    }
    // 创建一个observer示例与回调函数相关联
    var observer = new MutationObserver(callback)
    //使用配置文件对目标节点进行观测
    observer.observe(targetNode, configMutation)
}

 

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

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

相关文章

idea找不到或无法加载主类

前言 今天在运行项目的时候突然出了这样一个错误:IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都 遇到过它吧,但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧!咋整呢?听我给你吹~ 瞧我这张嘴~ 问题报错 找不…

高精度电子秤资料教程分享

高精度电子秤资料教程分享 资料下载地址: 高精度电子秤资料教程: https://url83.ctfile.com/d/45573183-60459202-c325be?p7526 (访问密码: 7526)

小白学视觉 | 超详细!Python中 pip 常用命令

本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。 原文链接:超详细!Python中 pip 常用命令 相信对于大多数熟悉Python的人来说,一定都听说并且使用过pip这个工具,但是对它的了…

基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的在线装修管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1 读取网站主页整个页面的 html 内容并解码为文本串(可使用urllib.request的相应方法),将其以UTF-8编码格式写入page.txt文件。 Code1 import urllib.requestwith urllib.request.urlopen(https://dblp.dagstuhl.de/db/conf/kdd/kdd202…

数据结构从入门到精通——直接选择排序

直接选择排序 前言一、选择排序的基本思想:二、直接选择排序三、直接选择排序的特性总结:四、直接选择排序的动画展示五、直接选择排序的代码展示test.c 六、直接选择排序的优化test.c 前言 直接选择排序是一种简单的排序算法。它的工作原理是每一次从未…

kafka集群介绍及搭建

介绍 kafka是一个高性能、低延迟、分布式的消息传递系统,特点在于实时处理数据。集群由多个成员节点broker组成,每个节点都可以独立处理消息传递和存储任务。 路由策略 发布消息由key、value组成,真正的消息是value,key是标识路…

Springboot+vue的船舶维保管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的船舶维保管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&#xff09…

第二证券|比特币重拾升势 新高背后风险涌动

近期价格连涨的比特币再度创出新高。金融出资报记者注意到,3月13日,在改写2021年11月69000美元纪录的基础上,比特币价格首次打破73000美元关口,创下73678.5美元的历史新高。 检查近日社交平台话题可见,“比特币站上73…

【明道云】如何自动将一笔记录拆分成多比并插入数据库

【背景】 用户录入包含开始日期和结束日期的交易数据,希望系统最终能够给出精确到日次的利润统计图表。 【分析】 颗粒度细化到日次,意味着需要在追加期间交易数据时能够自动拆分为日次颗粒度存储在用于统计的子表中。 这就涉及如何构建数据结构&…

JMeter 二次开发之环境准备

通过JMeter二次开发,可以充分发挥JMeter的潜力,定制化和扩展工具的能力以满足具体需求。无论是开发自定义插件、函数二次开发还是定制UI,深入学习和掌握JMeter的二次开发技术,将为接口功能测试/接口性能测试工作带来更多的便利和效…

win提权第二弹服务提权

阅读须知: 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失,均由使用者 本人负责,作者不为此承担任何责任,如…

2352.相等行列对

题目:给一个下标从0开始、大小为n x n的整数矩阵grid,返回满足Ri 行和 Cj 列相等的行列对(Ri,Cj)的数目。 如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。 解题思路…

信息收集:端口扫描原理,端口扫描分类,端口扫描工具,手动判断操作系统,操作系统识别工具

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「专栏简介」:此文章已录入专栏《网络安全自学教程》 端口&系统版本 一、端口扫描1、telnet2、Nmap3、Masscan4、端口扫描原…

【考研数学】《1800》如何衔接《660》/《880》?

基础题做完,不要急着强化 首先做一个复盘,1800基础的正确率如何,如果70%以下的话,从错题入手,把掌握不扎实的地方再进行巩固,否则接下来做题的话效率会很低。 接下来考虑习题衔接的问题。 关于线代复习的…

视频素材库排行榜前六名,推荐大家收藏

大家好!今天我要给大家带来的是视频素材库排行榜前十名,让你的视频创作更加别出心裁! 蛙学网在视频素材库排行榜中,蛙学网绝对是值得使用的。这里有大量的高质量视频素材,涵盖了各种风格和主题,特别是对于展…

一文读懂什么是序列 (sequence)

sequence 序列 sequence(序列)是一组有顺序的元素的集合 (严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素) 序列可以包含一个或多个元素,也可以没有任何元素。 我们之前所说的基本数据类型,都…

Vue3:标签的ref属性用法

一、情景说明 我们在写前端页面的时候,肯定会遇到获取DOM内容的情况。 以往,我们是用原生的js方法去获取,如document.getXxxx 但是,这中方法会有个问题,如果父组件和子组件的id相同,则会出错。 在Vue3中&…

【Flutter 面试题】讲一讲 Dart 的一些重要概念?

【Flutter 面试题】讲一讲 Dart 的一些重要概念? 文章目录 写在前面口述回答补充说明完整代码运行结果详细说明 写在前面 🙋 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主&#…

04.组件的组成和组件间通信

一、scoped解决样式冲突 1.默认情况: 写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 全局样式: 默认组件中的样式会作用到全局,任何一个组件中都会受到此样式的影响 局部样式: 可以给组件加上scoped 属性,可以让样式只…