# Selection & Range
# Example Code
<p id="p">Example: <i>italic</i> and <b>bold</b></p>
# Path Interface
export interface Point {
path: Path
offset: number
[key: string]: unknown
}
2
3
4
5
# 范围 (Range)
Range 表示一个包含节点与文本节点的一部分的 文档片段。俗称拖蓝。
export interface Range {
anchor: Point
focus: Point
[key: string]: unknown
}
2
3
4
5
# 属性
Range.collapsed(opens new window) 只读返回一个表示
Range的起始位置和终止位置是否相同的布尔值(opens new window)。Range.commonAncestorContainer(opens new window) 只读返回完整包含
startContainer和endContainer的、最深一级的节点(opens new window)。Range.endContainer(opens new window) 只读返回包含
Range终点的节点(opens new window)。Range.endOffset(opens new window) 只读返回一个表示
Range终点在endContainer中的位置的数字。Range.startContainer(opens new window) 只读返回包含
Range开始的节点(opens new window)。Range.startOffset(opens new window) 只读返回一个表示
Range起点在startContainer中的位置的数字。
原生方法 详见 (opens new window), Slate 方法 详见
# 锚点 (Anchor)
anchor 指向用户开始选择的地方。
选区的 锚点 (opens new window) 是该选区的起点,当您用鼠标框选一个选区的时候,锚点是你的鼠标按下瞬间所记录的那个点。随着用户拖动鼠标,锚点的位置不会随着改变。
# 焦点 (focus)
focus 指向用户结束选择的地方。
选区的 焦点 (opens new window) 是该选区的终点,当您用鼠标框选一个选区的时候,焦点是你的鼠标松开瞬间所记录的那个点。随着用户拖动鼠标,焦点的位置会随着改变。
# 选区 (Selection)
Selection 表示当前用户选中的内容或插入符号的当前位置。
Slate@0.50+ 中 Selection 的能力是通过 Range Interface 注入的。
export interface Editor {
// ...
selection: Range | null
}
2
3
4
# 属性
返回该选区起点所在的节点(Node (opens new window))。
返回一个数字,其表示的是选区起点在 anchorNode (opens new window) 中的位置偏移量。
- 如果
anchorNode是文本节点,那么返回的就是从该文字节点的第一个字开始,直到被选中的第一个字之间的字数(如果第一个字就被选中,那么偏移量为零)。 - 如果
anchorNode是一个元素,那么返回的就是在选区第一个节点之前的同级节点总数。(这些节点都是anchorNode的子节点)
返回该选区终点所在的节点。
返回一个数字,其表示的是选区终点在 focusNode (opens new window) 中的位置偏移量。
- 如果
focusNode是文本节点,那么选区末尾未被选中的第一个字,在该文字节点中是第几个字(从0开始计),就返回它。 - 如果
focusNode是一个元素,那么返回的就是在选区末尾之后第一个节点之前的同级节点总数。
返回一个布尔值,用于判断选区的起始点和终点是否在同一个位置。
返回该选区所包含的连续范围的数量。
# 选择方向
# 向前选择(forward)
二者重叠时,即选区被折叠,用户视觉上看到的就是一个闪烁的光标。
# 向后选择(backward)
# collapse
Selection.collapse() 方法可以收起当前选区到一个点。文档不会发生改变。如果选区的内容是可编辑的并且焦点落在上面,则光标会在该处闪烁。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
function run (){
document.body.contentEditable = true
var body = document.getElementsByTagName("body")[0];
/* 将光标收起到文档body的开头 */
window.getSelection().collapse(body, 0);
}
</script>
</head>
<body>
<h1>这是一个段落</h1>
<p id="demo">这是一个段落</p>
<button type="button" onclick="run()">聚焦到body的第一个位置</button>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 参考资料
MDN - Selection (opens new window)
MDN - Range (opens new window)
Selection and Range (opens new window)
DOM 规范: 范围(Range) (opens new window)