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

例如:

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

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

  • 思源笔记

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

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

    22243 引用 • 88911 回帖
  • Q&A

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

    8069 引用 • 36869 回帖 • 161 关注

相关帖子

被采纳的回答
  • 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

推荐标签 标签

  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    153 引用 • 3783 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 8 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 228 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 71 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1510 回帖
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 726 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 599 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 2 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 654 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    6 引用 • 15 回帖 • 113 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 556 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 722 关注
  • jsoup

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

    6 引用 • 1 回帖 • 481 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 62 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 454 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 47 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 8 关注
  • JavaScript

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

    729 引用 • 1327 回帖 • 1 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 387 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 5 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    26 引用 • 84 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    26 引用 • 222 回帖 • 170 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 153 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 745 关注