0

0

JavaScript富文本编辑器_选区与命令系统

betcha

betcha

发布时间:2025-11-25 17:12:06

|

281人浏览过

|

来源于php中文网

原创

选区与命令系统是javascript富文本编辑器的核心,通过selection和range接口实现用户对内容的选择与操作。selection表示用户选中的内容,可包含一个或多个range对象,常用window.getselection()获取;range则精确描述文档中连续区域,支持跨节点操作。传统编辑器依赖document.execcommand执行加粗、插入图片等命令,但该api已被废弃,存在浏览器行为不一致、无法精细控制撤销栈等问题。现代编辑器如slate.js、prosemirror等转向禁用execcommand,转而监听事件并手动操作range,结合抽象模型(如ast)实现高可控性。典型加粗操作包括获取当前选区、创建strong元素并用surroundcontents包裹内容。为确保可靠性,需在异步前保存clonerange(),避免无焦点时修改,并正确处理光标边缘情况。现代方案虽复杂度高,但提升了一致性和维护性。

javascript富文本编辑器_选区与命令系统

在实现或使用 JavaScript 富文本编辑器时,选区(Selection)与命令系统(Command System)是核心功能模块。它们共同支撑了用户对内容的可视化操作,比如加粗、插入图片、调整对齐方式等。理解浏览器原生的选区机制和 document.execCommand(尽管已废弃)或现代替代方案,是开发富文本编辑器的基础。

选区(Selection)与范围(Range)

浏览器提供了 SelectionRange 接口来表示用户当前的选择状态和可操作的内容区域。

Selection 表示用户在页面中选中的内容,可以通过 window.getSelection() 获取。它包含一个或多个 Range 对象,大多数情况下只有一个。

Range 是一个更底层的接口,用于精确描述文档中的一段连续内容,可以跨节点,不依赖用户是否真正“选中”。

立即学习Java免费学习笔记(深入)”;

常见操作包括:
  • 获取当前选区:const sel = window.getSelection();
  • 获取选区的第一个范围:const range = sel.getRangeAt(0);
  • 保存选区:在弹窗或异步操作前保存 Range,以便恢复
  • 恢复选区:将之前保存的 Range 重新添加到 Selection 中
  • 判断是否有选区:sel.rangeCount > 0

execCommand 与命令执行系统

传统富文本编辑器广泛使用 document.execCommand 来执行格式化命令。虽然该 API 已被标记为废弃,但在许多项目中仍可见。

A1.art
A1.art

一个创新的AI艺术应用平台,旨在简化和普及艺术创作

下载

基本用法如下:

document.execCommand('bold');     // 加粗
document.execCommand('insertImage', false, 'https://example.com/img.png');
document.execCommand('justifyCenter'); // 居中对齐
特点与限制:
  • 命令作用于当前 document 的激活选区
  • 部分命令需要传参,如 insertImage 需要 URL
  • 行为在不同浏览器中可能不一致
  • 无法处理复杂结构,比如嵌套块级元素
  • 不支持撤销的精细控制

现代替代方案:ContentEditable + Range 操作

随着 Slate.js、ProseMirror、TipTap 等现代编辑器的兴起,直接操作 DOM Range 成为主流方式。

这类系统通常:

  • 禁用默认的 execCommand
  • 监听键盘和菜单事件
  • 手动解析当前选区所在的节点结构
  • 通过 Range 插入、包裹或修改 DOM 节点
  • 维护自己的模型(如 AST 或 JSON 文档树)

例如,实现加粗功能:

const selection = window.getSelection();
if (!selection.rangeCount) return;
const range = selection.getRangeAt(0);

const boldEl = document.createElement('strong');
range.surroundContents(boldEl);

选区管理的最佳实践

在复杂编辑器中,选区容易在异步操作后丢失。建议:

  • 在执行异步操作前保存 Range
  • 使用 cloneRange() 复制选区状态
  • 避免在无焦点时修改选区
  • 在光标位于空行或边缘时,正确处理块级元素的插入逻辑
  • 考虑使用 Selection.setBaseAndExtent() 精确控制光标位置

基本上就这些。掌握 Selection 与 Range 是构建可靠编辑功能的前提,而命令系统的设计决定了编辑器的灵活性与可维护性。现代编辑器趋向于脱离 execCommand,转为基于模型与 Range 的手动控制,虽然复杂度上升,但换来更高的可控性与一致性。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

455

2023.08.07

json是什么
json是什么

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

546

2023.08.23

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

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

334

2023.10.13

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

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

82

2025.09.10

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1923

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

656

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2392

2025.12.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

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

共500课时 | 6.4万人学习

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

共16课时 | 2.1万人学习

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

共10课时 | 0.7万人学习

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

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