编辑器实现越来越"卷"

编辑器据说是前端中的一个深坑,我们看看有多深。

第一代编辑器,起初编辑器的实现方式是由 contenteditable 和 document.execCommand 这两个东西实现的。contenteditable 用来标记一个HTML 元素可以编辑,document.execCommand 可以对编辑的内容进行格式化,比如对某段文字进行加粗。

这一代编辑器基于传统的模式,把DOM作为数据源。

但是 document.execCommand 这个 API 目前已经废弃了。

b76a77ffec675fea0fe98450ea54f0eb.png

第二代编辑器使用的还是 contenteditable,只是不再使用  document.execCommand,完全自己实现,编辑器会提供一系列 API,对文本内容进行格式化,比如:

// 加粗
editor.format('bold', true);
// 设置字号 20
editor.format('size', 20);
// 设置字体颜色
editor.format('color', 'red');

这些 API 被称为「命令系统」,有了这些API的支持,那么编辑器可以完全与 toolbar 进行脱钩,UI长什么样编辑器完全不管。没错这就是我说的 toolbar:

6177624af13e093650344b6d1b8253fc.png

我试着用 contenteditable 实现了一个简单的编辑器:

4a1ac2f39511ec8d191ecb00710b6702.png

这个实现效果完全出乎我的意料。比如你可以编辑表格、删除内容、撤销、重做、无序列表、有序列表等都支持的不错。

剩下的需要添加一个 toolbar,这样可以对输入的内容进行格式化,比如修改文字颜色,字体大小等。

那么,如果想给选中的内容进行加粗,该如何做?比如我选中了下面这些内容,包含文字与图片:

6b574a33e6d22db4461ded0bcf1ed58a.png

首先需要获取选中的节点,这就涉及到了编辑器中的一个核心知识 「选区」,可以使用浏览器提供的方法 window.getSelection() 来获取选中的 DOM 元素,进行添加样式或增加标签(这里说的比较简单,其实处理的工作不少)。

第二代浏览器还有一个显著的特点,以MVC的模式实现,通过数据驱动 UI。为啥需要个数据Model,想详细了解的可以看这篇文章:

https://medium.engineering/why-contenteditable-is-terrible-122d8a40e480

第三代编辑器,不依赖于 contenteditable,自己实现光标、选区等。典型的代表有Google Doc,office、wps。当然难度相当的高,可定制性非常高。

其实可以跳出编辑器的实现,看看编辑器实现过程用到的最原始的技术。这里大家可以想一下,编辑器实现为啥不用 textarea?编辑器实现过程中引入了数据model,那么如何把用户的输入转化成数据model?

编辑器中还有很多知识,别急,慢慢啃,我只是学了个皮毛。大家加油!!

382520ec07aac4d01bfbf4c733c3f15d.png

长按关注

素燕《前端小课》

帮助 10W 人入门并进阶前端

官网:https://lefex.gitee.io/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值