0

0

JS 富文本编辑器开发 - 操作 document.execCommand 的现代替代方案

幻影之瞳

幻影之瞳

发布时间:2025-09-23 18:27:02

|

764人浏览过

|

来源于php中文网

原创

放弃 document.execCommand 后,应采用现代方案:使用 contenteditable 结合 DOM 操作与事件监听实现加粗等样式控制,通过 Range 和 Selection 管理选区,利用 JSON 状态管理支持撤销重做,构建工具栏并处理列表、链接、图片、表格等复杂格式,结合虚拟 DOM 框架优化开发,使用 polyfill 或库解决跨浏览器问题,并通过减少 DOM 操作、节流防抖、懒加载等手段提升性能。

js 富文本编辑器开发 - 操作 document.execcommand 的现代替代方案

放弃 document.execCommand 是正确的方向。它过时、兼容性差,而且在现代 Web 开发中有很多更好的选择。

解决方案

现代替代方案的核心在于直接操作 DOM,并结合内容可编辑的 diviframe。这赋予你完全的控制权,并且可以更好地适应不同的浏览器和设备。

  1. 使用 contenteditable 属性: 让一个 div 变成富文本编辑器,只需设置 contenteditable="true"

    这是一个可以编辑的段落。

  2. 监听事件: 监听键盘事件、鼠标事件等,来触发你的编辑逻辑。例如,按下 Ctrl+B 时,应用加粗样式。

  3. 操作 DOM: 使用 JavaScript 的 DOM API (例如 document.createElement, Node.appendChild, Node.removeChild, RangeSelection 对象) 来修改编辑器中的内容。

    document.getElementById('editor').addEventListener('keydown', function(event) {
      if (event.ctrlKey && event.key === 'b') {
        event.preventDefault(); // 阻止默认行为
    
        // 获取当前选区
        const selection = window.getSelection();
        if (!selection.rangeCount) return;
        const range = selection.getRangeAt(0);
    
        // 创建一个  元素
        const boldElement = document.createElement('b');
        boldElement.appendChild(range.extractContents());
        range.insertNode(boldElement);
    
        // 清除选区
        selection.removeAllRanges();
        selection.addRange(range);
      }
    });
  4. 状态管理: 维护一个内部的状态表示,例如使用 JSON 数据结构来描述编辑器的内容和样式。这可以方便地实现撤销/重做、数据持久化等功能。

  5. 工具栏: 创建一个工具栏,包含各种编辑按钮 (加粗、斜体、颜色等)。点击按钮时,执行相应的 DOM 操作。

    XPaper Ai
    XPaper Ai

    AI撰写论文、开题报告生成、AI论文生成器尽在XPaper Ai论文写作辅助指导平台

    下载

如何处理复杂的富文本格式?

富文本格式远不止加粗和斜体。处理列表、链接、图片、表格等复杂格式需要更精细的 DOM 操作和状态管理。

  • 列表: 创建
        元素,并动态添加
      1. 子元素。需要处理嵌套列表的情况。
      2. 链接: 使用 元素,并允许用户设置链接的 URL 和文本。
      3. 图片: 使用 JS 富文本编辑器开发 - 操作 document.execCommand 的现代替代方案 元素,并允许用户上传图片或指定图片 URL。需要处理图片大小和对齐方式。
      4. 表格: 创建 , ,
        等元素,并允许用户添加、删除行和列。这部分逻辑比较复杂,可能需要一个单独的表格组件。

        更进一步,可以考虑使用虚拟 DOM 技术,例如 React 或 Vue,来简化 DOM 操作和状态管理。

        如何实现撤销/重做功能?

        撤销/重做是富文本编辑器不可或缺的功能。实现方法如下:

        1. 保存历史状态: 每次编辑操作后,将编辑器的状态 (例如 DOM 结构或 JSON 数据) 保存到历史记录栈中。
        2. 撤销操作: 从历史记录栈中取出上一个状态,并将其应用到编辑器中。
        3. 重做操作: 从重做记录栈中取出下一个状态,并将其应用到编辑器中。

        需要注意的是,保存完整的 DOM 结构可能会占用大量内存。可以考虑使用差分算法,只保存状态之间的差异,以减少内存消耗。

        如何解决跨浏览器兼容性问题?

        即使你使用现代的 DOM API,仍然可能遇到跨浏览器兼容性问题。不同的浏览器可能对某些 API 的实现有所差异。

        • 使用 polyfill: polyfill 是一种代码,可以为旧的浏览器提供新的 API。例如,可以使用 RangeSelection 对象的 polyfill,以确保在所有浏览器中都能正常工作。
        • 使用库: 一些 JavaScript 库 (例如 Quill.js, Draft.js, Slate.js) 已经解决了大部分跨浏览器兼容性问题。你可以直接使用这些库,而无需自己处理兼容性细节。
        • 测试: 在不同的浏览器和设备上进行测试,以确保编辑器在所有环境中都能正常工作。

        如何优化富文本编辑器的性能?

        富文本编辑器需要处理大量的 DOM 操作,因此性能优化非常重要。

        • 减少 DOM 操作: 尽量减少 DOM 操作的次数。例如,可以使用 documentFragment 来批量添加 DOM 元素。
        • 使用虚拟 DOM: 虚拟 DOM 可以将 DOM 操作的性能提升到一个新的水平。
        • 懒加载: 对于大型文档,可以采用懒加载的方式,只加载当前可见区域的内容。
        • 节流和防抖: 对于频繁触发的事件 (例如 input 事件),可以使用节流和防抖技术来减少事件处理函数的执行次数。

        总而言之,构建一个现代富文本编辑器是一个具有挑战性的任务。你需要深入了解 DOM API、状态管理、跨浏览器兼容性以及性能优化。但通过放弃 document.execCommand 并采用现代的替代方案,你可以构建一个更强大、更灵活、更可维护的编辑器。

      热门AI工具

      更多
      DeepSeek
      DeepSeek

      幻方量化公司旗下的开源大模型平台

      豆包大模型
      豆包大模型

      字节跳动自主研发的一系列大型语言模型

      通义千问
      通义千问

      阿里巴巴推出的全能AI助手

      腾讯元宝
      腾讯元宝

      腾讯混元平台推出的AI助手

      文心一言
      文心一言

      文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

      讯飞写作
      讯飞写作

      基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

      即梦AI
      即梦AI

      一站式AI创作平台,免费AI图片和视频生成。

      ChatGPT
      ChatGPT

      最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

      相关专题

      更多
      json数据格式
      json数据格式

      JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

      419

      2023.08.07

      json是什么
      json是什么

      JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

      535

      2023.08.23

      jquery怎么操作json
      jquery怎么操作json

      操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

      311

      2023.10.13

      go语言处理json数据方法
      go语言处理json数据方法

      本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

      77

      2025.09.10

      treenode的用法
      treenode的用法

      ​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

      538

      2023.12.01

      C++ 高效算法与数据结构
      C++ 高效算法与数据结构

      本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

      17

      2025.12.22

      深入理解算法:高效算法与数据结构专题
      深入理解算法:高效算法与数据结构专题

      本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

      27

      2026.01.06

      堆和栈的区别
      堆和栈的区别

      堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

      397

      2023.07.18

      Golang 网络安全与加密实战
      Golang 网络安全与加密实战

      本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

      2

      2026.01.29

      热门下载

      更多
      网站特效
      /
      网站源码
      /
      网站素材
      /
      前端模板

      精品课程

      更多
      相关推荐
      /
      热门推荐
      /
      最新课程
      HTML教程
      HTML教程

      共500课时 | 5.1万人学习

      【web前端】Node.js快速入门
      【web前端】Node.js快速入门

      共16课时 | 2万人学习

      php初学者入门课程
      php初学者入门课程

      共10课时 | 0.6万人学习

      关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
      php中文网:公益在线php培训,帮助PHP学习者快速成长!
      关注服务号 技术交流群
      PHP中文网订阅号
      每天精选资源文章推送

      Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号