Selection
Baseline 广泛可用 *
Selection 对象表示用户选择的文本范围或插入符号的当前位置。每个 document 都关联着一个唯一的 selection 对象,可以通过 document.getSelection() 或 window.getSelection() 获取,然后进行检查和修改。
用户可以选择从左到右(按文档顺序)或从右到左(与文档顺序相反)进行选择。锚点 (anchor) 是用户开始选择的位置,而 焦点 (focus) 是用户结束选择的位置。如果使用桌面鼠标进行选择,锚点将设置在按下鼠标按钮的位置,焦点将设置在释放鼠标按钮的位置。
注意:锚点 (anchor) 和 焦点 (focus) 不应与选择的起始和结束位置混淆。根据选择的方向,锚点可能位于焦点之前,也可能位于焦点之后。
实例属性
Selection.anchorNode只读-
返回选择开始所在的
Node。如果文档中从未存在过选择(例如,一个从未被点击过的 iframe),则可能返回null。 Selection.anchorOffset只读-
返回一个数字,表示选择锚点在
anchorNode内的偏移量。如果anchorNode是一个文本节点,则表示锚点之前anchorNode中的字符数。如果anchorNode是一个元素,则表示锚点之前anchorNode的子节点数。 Selection.direction只读-
一个描述当前选择方向的字符串。
Selection.focusNode只读-
返回选择结束所在的
Node。如果文档中从未存在过选择(例如,一个从未被点击过的 iframe),则可能返回null。 Selection.focusOffset只读-
返回一个数字,表示选择焦点在
focusNode内的偏移量。如果focusNode是一个文本节点,则表示焦点之前focusNode中的字符数。如果focusNode是一个元素,则表示焦点之前focusNode的子节点数。 Selection.isCollapsed只读-
返回一个布尔值,指示选择的起始点和结束点是否在同一位置。
Selection.rangeCount只读-
返回选择中范围的数量。
Selection.type只读-
一个描述当前选择类型的字符串。
实例方法
Selection.addRange()-
一个将被添加到选择中的
Range对象。 Selection.collapse()-
将当前选择折叠到单个点。
Selection.collapseToEnd()-
将选择折叠到选择中最后一个范围的末尾。
Selection.collapseToStart()-
将选择折叠到选择中第一个范围的开头。
Selection.containsNode()-
指示某个节点是否是选择的一部分。
Selection.deleteFromDocument()-
从文档中删除选择的内容。
Selection.empty()-
从选择中移除所有范围,将
anchorNode和focusNode属性设置为null,并且不选择任何内容。 Selection.extend()-
将选择的焦点移动到指定点。
Selection.getComposedRanges()-
返回一个
StaticRange对象数组,每个对象代表一个可能跨越 Shadow DOM 边界的选择。 Selection.getRangeAt()-
返回一个
Range对象,表示当前选择的一个范围。 Selection.modify()-
更改当前选择。
Selection.removeRange()-
从选择中移除一个范围。
Selection.removeAllRanges()-
从选择中移除所有范围。
Selection.selectAllChildren()-
将指定节点的**所有**子节点添加到选择中。
Selection.setBaseAndExtent()-
将选择设置为一个范围,该范围包含两个指定 DOM 节点的所有或部分内容,以及它们之间的任何内容。
Selection.setPosition()-
将当前选择折叠到单个点。
Selection.toString()-
返回当前由 selection 对象表示的字符串,即当前选择的文本。
注意
Selection 的字符串表示
调用 Selection.toString() 方法会返回选择中包含的文本,例如:
const selObj = window.getSelection();
window.alert(selObj);
请注意,将 selection 对象作为 window.alert 的参数会调用该对象的 toString 方法。
选择中的多个范围
selection 对象代表用户选择的 Range。通常,它只包含一个范围,访问方式如下:
const selObj = window.getSelection();
const range = selObj.getRangeAt(0);
selObj是一个 Selection 对象range是一个Range对象
正如 Selection API 规范所指出的,Selection API 最初由 Netscape 创建,并支持多个范围(例如,允许用户从 <table> 中选择一列)。然而,除了 Gecko 之外的浏览器并未实现多范围支持,并且该规范还要求 selection 始终只有一个范围。
Selection 和输入焦点
Selection 和输入焦点(由 Document.activeElement 指示)之间存在复杂的关系,具体取决于浏览器。在跨浏览器兼容的代码中,最好将它们分开处理。
Safari 和 Chrome(与 Firefox 不同)目前在以编程方式修改 selection 时会聚焦包含 selection 的元素;这未来可能会改变(请参阅 W3C bug 14383 和 WebKit bug 38696)。
Selection API 在编辑主机焦点更改方面的行为
Selection API 具有一种常见的行为(即浏览器之间共享),它规定了在调用某些方法后,编辑主机的焦点行为如何变化。
行为如下:
- 如果之前的 selection 在编辑主机之外,则编辑主机获得焦点。
- 调用 Selection API 方法,导致创建了一个新的 selection,其 selection 范围在编辑主机内部。
- 焦点然后会转移到编辑主机。
注意: Selection API 方法可能只会将焦点转移到编辑主机,而不是其他可聚焦元素(例如 <a>)。
上述行为适用于使用以下方法进行的 selection:
Selection.collapse()Selection.collapseToStart()Selection.collapseToEnd()Selection.extend()Selection.selectAllChildren()Selection.addRange()Selection.setBaseAndExtent()
以及使用以下方法修改 Range 时:
术语表
本节中使用的其他关键术语。
- anchor (锚点)
-
Selection 的锚点是选择的起点。使用鼠标进行选择时,锚点是鼠标按钮最初按下的文档位置。当用户使用鼠标或键盘更改选择时,锚点不会移动。
- editing host (编辑主机)
-
可编辑元素(例如,设置为
contenteditable的 HTML 元素,或designMode启用的文档的 HTML 子项)。 - focus of a selection (selection 的焦点)
-
Selection 的焦点是选择的终点。使用鼠标进行选择时,焦点是释放鼠标按钮的文档位置。当用户使用鼠标或键盘更改选择时,焦点是移动的选择的末尾。
注意:这与文档的焦点元素不同,后者由
document.activeElement返回。 - range
-
范围 (range) 是文档的连续部分。一个范围可以包含完整的节点,也可以包含节点的一部分(例如文本节点的一部分)。用户通常一次只选择一个范围,但用户也可以选择多个范围(例如,通过使用 Control 键)。可以通过 Selection 对象获取一个范围,作为
range对象。Range 对象也可以通过 DOM 创建,并以编程方式添加到 selection 中或从 selection 中移除。
规范
| 规范 |
|---|
| Selection API # selection-interface |
浏览器兼容性
加载中…
另见
Window.getSelection、Document.getSelection、Range- 与 Selection 相关的事件:
selectionchange和selectstart - HTML 输入提供了更简单的辅助 API 来处理 selection(请参阅
HTMLInputElement.setSelectionRange())。 Document.activeElement、HTMLElement.focus和HTMLElement.blur