js 代码如何实现根据输入的内容自动给其块加上属性或自定义属性

例如:

但我输入的文字符合自己设定的正则表达式的规则,则自动给当前块加上相关属性

例如当我笔记中存在成都时,自动给当前块加上“地点”:“成都”的属性

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    22926 引用 • 92174 回帖 • 1 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8404 引用 • 38297 回帖 • 156 关注

相关帖子

被采纳的回答
  • wilsons 1 1 赞同

    监听编辑器输入事件,仅供参考

    (()=>{
        // 编辑器输入事件
        onEditorInput((editor) => {
            // 获取光标所在元素
            const currEl = getCursorElement();
            console.log('当前元素', currEl);
            // 获取当前块
            const currBlock = currEl.closest('[data-type]');
            console.log('当前块', currBlock);
        });
      
        // 编辑器输入事件
        function onEditorInput(callback) {
            whenElementExist(isMobile()?'body':'.layout__center').then(async element => {
                // 等待笔记列表加载完毕
                await sleep(40);
                // 监听编辑器加载事件
                observeDomChange(element, async (mutation) => {
                    if (mutation.target.classList?.contains("protyle-wysiwyg")) {
                        console.log(mutation.target);
                       const editor = mutation.target;
                        if(editor && editor.closest){
                            // 等待编辑器加载完毕
                            const protyle = editor.closest(".protyle");
                            if(protyle.dataset.loading !== 'finished'){
                                await whenElementExist(()=>editor?.closest(".protyle") === 'finished');
                            }
                            if(!editor.getAttribute('custom-listened')){
                                editor.setAttribute('custom-listened', true);
                                //console.log('listen editor');
                                editor.addEventListener('input', ()=>{
                                    //console.log('editor inputed');
                                    callback(editor);
                                })
                            }
                        }
                    }
                });
            });
        }
        // 获取光标所在元素
        function getCursorElement() {
            const selection = window.getSelection();
            if (selection.rangeCount > 0) {
                const range = selection.getRangeAt(0);
                // 获取选择范围的起始位置所在的节点
                const startContainer = range.startContainer;
                // 如果起始位置是文本节点,返回其父元素节点
                const cursorElement = startContainer.nodeType === Node.TEXT_NODE
                    ? startContainer.parentElement
                    : startContainer;
      
                return cursorElement;
            }
            return null;
        }
        // 观察元素被添加
        function observeDomChange(selector, callback) {
            // 定义一个回调函数,当DOM发生变化时调用
            const onChange = function(mutationsList, observer) {
                for (const mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        callback(mutation);
                    }
                }
            };
            // 创建一个观察器实例,并传入回调函数
            const observer = new MutationObserver(onChange);
            // 配置观察选项:指定需要观察哪些变动
            const config = { attributes: false, childList: true, subtree: true };
            // 获取目标节点
            const targetNode = typeof selector === 'string' ? document.querySelector(selector) : selector;
            // 如果目标节点存在,则开始观察
            if (targetNode) {
                observer.observe(targetNode, config);
            }
            // 返回一个函数,用于停止观察
            return () => {
                observer.disconnect();
            };
        }
        // 是否手机端
        function isMobile() {
            return !!document.getElementById("sidebar");
        }
        // 延迟执行
        function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }
        // 等待元素渲染完成后执行
        function whenElementExist(selector) {
            return new Promise(resolve => {
                const checkForElement = () => {
                    let element = null;
                    if (typeof selector === 'function') {
                        element = selector();
                    } else {
                        element = document.querySelector(selector);
                    }
                    if (element) {
                        resolve(element);
                    } else {
                        requestAnimationFrame(checkForElement);
                    }
                };
                checkForElement();
            });
        }
    })();
    

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 监听编辑事件,符合正则时调用 api 写块属性

    1 回复
  • stevehfut
    作者

    可以提供监听思源编辑事件的代码吗

    1 回复
  • wilsons 1 1 赞同 1 评论

    监听编辑器输入事件,仅供参考

    (()=>{
        // 编辑器输入事件
        onEditorInput((editor) => {
            // 获取光标所在元素
            const currEl = getCursorElement();
            console.log('当前元素', currEl);
            // 获取当前块
            const currBlock = currEl.closest('[data-type]');
            console.log('当前块', currBlock);
        });
      
        // 编辑器输入事件
        function onEditorInput(callback) {
            whenElementExist(isMobile()?'body':'.layout__center').then(async element => {
                // 等待笔记列表加载完毕
                await sleep(40);
                // 监听编辑器加载事件
                observeDomChange(element, async (mutation) => {
                    if (mutation.target.classList?.contains("protyle-wysiwyg")) {
                        console.log(mutation.target);
                       const editor = mutation.target;
                        if(editor && editor.closest){
                            // 等待编辑器加载完毕
                            const protyle = editor.closest(".protyle");
                            if(protyle.dataset.loading !== 'finished'){
                                await whenElementExist(()=>editor?.closest(".protyle") === 'finished');
                            }
                            if(!editor.getAttribute('custom-listened')){
                                editor.setAttribute('custom-listened', true);
                                //console.log('listen editor');
                                editor.addEventListener('input', ()=>{
                                    //console.log('editor inputed');
                                    callback(editor);
                                })
                            }
                        }
                    }
                });
            });
        }
        // 获取光标所在元素
        function getCursorElement() {
            const selection = window.getSelection();
            if (selection.rangeCount > 0) {
                const range = selection.getRangeAt(0);
                // 获取选择范围的起始位置所在的节点
                const startContainer = range.startContainer;
                // 如果起始位置是文本节点,返回其父元素节点
                const cursorElement = startContainer.nodeType === Node.TEXT_NODE
                    ? startContainer.parentElement
                    : startContainer;
      
                return cursorElement;
            }
            return null;
        }
        // 观察元素被添加
        function observeDomChange(selector, callback) {
            // 定义一个回调函数,当DOM发生变化时调用
            const onChange = function(mutationsList, observer) {
                for (const mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        callback(mutation);
                    }
                }
            };
            // 创建一个观察器实例,并传入回调函数
            const observer = new MutationObserver(onChange);
            // 配置观察选项:指定需要观察哪些变动
            const config = { attributes: false, childList: true, subtree: true };
            // 获取目标节点
            const targetNode = typeof selector === 'string' ? document.querySelector(selector) : selector;
            // 如果目标节点存在,则开始观察
            if (targetNode) {
                observer.observe(targetNode, config);
            }
            // 返回一个函数,用于停止观察
            return () => {
                observer.disconnect();
            };
        }
        // 是否手机端
        function isMobile() {
            return !!document.getElementById("sidebar");
        }
        // 延迟执行
        function sleep(ms) {
            return new Promise(resolve => setTimeout(resolve, ms));
        }
        // 等待元素渲染完成后执行
        function whenElementExist(selector) {
            return new Promise(resolve => {
                const checkForElement = () => {
                    let element = null;
                    if (typeof selector === 'function') {
                        element = selector();
                    } else {
                        element = document.querySelector(selector);
                    }
                    if (element) {
                        resolve(element);
                    } else {
                        requestAnimationFrame(checkForElement);
                    }
                };
                checkForElement();
            });
        }
    })();
    
    万分感谢!!
    stevehfut

推荐标签 标签

  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 232 回帖 • 1 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1435 引用 • 10055 回帖 • 489 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖
  • 创业

    你比 99% 的人都优秀么?

    85 引用 • 1399 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1706 回帖
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 537 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 626 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    728 引用 • 1273 回帖 • 1 关注
  • OnlyOffice
    4 引用 • 4 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 23 关注
  • 996
    13 引用 • 200 回帖 • 10 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 38 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 631 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 6 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 770 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 634 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 26 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 141 关注
  • Log4j

    Log4j 是 Apache 开源的一款使用广泛的 Java 日志组件。

    20 引用 • 18 回帖 • 30 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    85 引用 • 139 回帖 • 1 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    135 引用 • 190 回帖 • 1 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 484 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 65 回帖 • 445 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 47 关注