介绍开发歌词标注编辑器过程中用到的一些知识
可以获取现有选中内容,选择/取消全部或部分选中内容,
从文档中删除所选部分,或将其包装到一个标签(如 span)中等。
Range 是什么?
本质上是一对“边界点”:范围起点和范围终点
考虑以下 HTML 片段:
<p id="p">Example: <i>italic</i> and <b>bold</b>
让我们来选择 Example: <i>italic</i>,它是 <p> 的前两个子节点
我们先来创建一个 Range
let range = new Range();
让我们选择部分文本,像这样:
Example: italic and bold
<script>
let range = new Range();
range.setStart(p.firstChild, 2);
range.setEnd(p.querySelector('b').firstChild, 3);
alert(range); // ample: italic and bol
// 使用此范围进行选择
window.getSelection().addRange(range);
</script>
range 对象具有以下属性:
设置范围的起点:
设置范围的终点:
node 既可以是文本节点,也可以是元素节点
对于文本节点,offset 偏移的是字符数
对于元素节点则是子节点数
其他:
操纵范围内的内容:
Range 是用于管理选择范围的对象
他们在视觉上不会选择任何内容
在视觉上选择文档需要用到 Selection 对象
通过 window.getSelection() 来获取
理论上,一个选择可以包括零个或多个范围
实际上,只有 Firefox 允许在文档中选择多个范围
Selection 的起点称为 anchor,终点称为 focus
在文档中,Selection 的终点可能在起点之前
如果用户使用鼠标从 “Example” 开始选择到 “italic”
称此选择具有 “forward” 方向:
如果是从 “italic” 的末尾开始选择到 “Example”
则所选内容将被定向为 “backward”
Selection 对象主要属性:
有一些事件可以跟踪选择:
添加/移除范围的方法:
还有一些方法可以直接操作选择范围,而无需使用 Range:
如果选择已存在,则首先使用 removeAllRanges() 将其清空,
然后添加范围,否则除 Firefox 外的所有浏览器都将忽略新范围
某些选择方法例外,它们会替换现有的选择,例如 setBaseAndExtent
今天主要介绍了 Selection 和 Range 对象,常用的方案是:
let selection = document.getSelection();
let cloned = /* 要将所选的节点克隆到的元素 */;
// 然后将 Range 方法应用于 selection.getRangeAt(0)
// 或者,像这样,用于所有范围,以支持多选
for (let i = 0; i < selection.rangeCount; i++) {
cloned.append(selection.getRangeAt(i).cloneContents());
}
let selection = document.getSelection();
// 直接:
selection.setBaseAndExtent(...from...to...);
// 或者我们可以创建一个范围并:
selection.removeAllRanges();
selection.addRange(range);
谢谢!
参考资料: