不常用的浏览器 API —— Selection

297 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

不常用的浏览器 API,这一届来看 Selection,相比较前面介绍过的不常用的 API,这个 API 可能知名度相对会高一些,它是用来表示用户选区的 API。

我们可以通过 window.getSelection() 来获取一个选区,之后通过控制选取的 range 来处理选中内容,可以通过 createRange 创建一个 range 插入选区中实现在选区中添加内容。

Selection 本身的玩法有很多,比如早期的富文本编辑器很多都是通过自定义 range 来实现的插入效果,这样做起来简单,但是可能出现的问题也比较多,因此富文本编辑器一直以来也被称为前端比较坑多的领域。现代的富文本编辑器大都是基于高抽象的 UI = f(data) 来实现的。

Selection 还可以实现剪切板效果,创建选区之后执行 execCommand 来实现内容的复制,当然 execCommand API本身是不推荐使用的,更专业的剪切板 API 是浏览器的 clipboard API,但是由于兼容性问题,实际上使用 Selection + execCommand 的还是比较多。

这里可以看一下相关的概念:

  • 锚点:一个选区起始位置称为一个锚点,即 用户选中前鼠标落下的位置,锚点不会随着拖动而改变。
  • 焦点:与锚点相反的概念用户松开的位置称为焦点,因此焦点是由用户拖动的最终位置决定的。
  • 范围:用户选择的区域称为一个范围,通常是一个,如果浏览器支持可能会利用 ctrl 选择多个。
  • 可编辑元素:指的是设置了contenteditable 一类属性的元素,内容可变。

Selection API 本身兼容性很好,虽然属于实验性功能,但是几乎所有的浏览器都可以很好的支持,因此这个 API 在生产环境使用率还是很高的。