From c9d903e847c2df446c515e190311ed601f449aa4 Mon Sep 17 00:00:00 2001
From: LeviDing
Date: Fri, 3 Apr 2020 19:06:56 +0800
Subject: [PATCH 01/10] Update article.md
---
2-ui/99-ui-misc/02-selection-range/article.md | 160 +++++++++---------
1 file changed, 80 insertions(+), 80 deletions(-)
diff --git a/2-ui/99-ui-misc/02-selection-range/article.md b/2-ui/99-ui-misc/02-selection-range/article.md
index 35f2f7fb50..6d9ee196ac 100644
--- a/2-ui/99-ui-misc/02-selection-range/article.md
+++ b/2-ui/99-ui-misc/02-selection-range/article.md
@@ -4,17 +4,17 @@ libs:
---
-# 选区(Selection)和范围(Range)
+# 选择(Selection)和范围(Range)
-在本章中,我们将介绍文档中的选区以及表单字段(如 ``)中的选区。
+在本章中,我们将介绍文档中的选择以及在表单字段(如 ``)中的选择。
-JavaScript 可以获取现有选区,全部或部分选择/取消选择,从文档中删除所选择的部分,将其包到一个标记(tag)中,等等。
+JavaScript 可以获取现有选择,选择/取消全部或部分选择,从文档中删除所选部分,将其包装到一个标签(tag)中,等。
-最后,您可以在文末的"总结"部分中找到使用方法。但是,如果您阅读整章内容,将会获得更多。基本的 `Range` 和 `Selection` 对象很容易掌握,因此不需要任何诀窍便可实现你想要的操作。
+你可以在本文最后的“总结”部分中找到使用方法。但是,如果你阅读整篇内容,将会有更多收获。基本的 `Range` 和 `Selection` 对象很容易掌握,因此,你不需要任何诀窍便可以使用它们做你想要做的事儿。
## 范围
-选区的基本概念是 [Range](https://dom.spec.whatwg.org/#ranges):本质上是一对“边界点”:范围起点和范围终点。
+选择的基本概念是 [Range](https://dom.spec.whatwg.org/#ranges):本质上是一对“边界点”:范围起点和范围终点。
每个点都表示为一个父 DOM 节点,从起点偏移一段距离。如果父节点是元素节点,则偏移量是子节点个数,对于文本节点而言,则是文本中的位置。下面举例来说。
@@ -26,7 +26,7 @@ JavaScript 可以获取现有选区,全部或部分选择/取消选择,从
let range = new Range();
```
-然后,我们可以使用 `range.setStart(node, offset)` 和 `range.setEnd(node, offset)` 来设置选区边界。
+然后,我们可以使用 `range.setStart(node, offset)` 和 `range.setEnd(node, offset)` 来设置选择边界。
例如,考虑以下 HTML 片段:
@@ -90,7 +90,7 @@ drawHtmlTree(selectPDomtree, 'div.select-p-domtree', 690, 320);
// 范围的 toString 以文本形式返回其内容(不带标签)
alert(range); // Example: italic
- // 将此范围应用于文档选区(稍后解释)
+ // 将此范围应用于文档选择(稍后解释)
document.getSelection().addRange(range);
```
@@ -114,7 +114,7 @@ From – To – To – To Select me: italic and bold
@@ -334,13 +334,13 @@ From – To
```
-### 选区获取示例代码
+### 选择获取示例代码
-如要获取整个选区:
+如要获取整个选择:
- 作为文本:只需调用 `document.getSelection().toString()`。
-- 作为 DOM 节点:获取底层的范围并调用其 `cloneContents()` 方法(如果我们不支持 Firefox 多选区的话,则仅取第一个范围)。
+- 作为 DOM 节点:获取底层的范围并调用其 `cloneContents()` 方法(如果我们不支持 Firefox 多选择的话,则仅取第一个范围)。
-下面是将选区选作为文本和 DOM 节点的示例代码:
+下面是将选择选作为文本和 DOM 节点的示例代码:
```html run height=100
Select me: italic and bold
@@ -366,27 +366,27 @@ As text:
```
-## 选区方法
+## 选择方法
-添加/删除范围的选区方法:
+添加/删除范围的选择方法:
- `getRangeAt(i)` - 获取从 `0` 开始的第 i 个范围。在除 Firefox 之外的所有浏览器中,仅使用 `0`。
-- `addRange(range)` - 将 `range` 添加到选区中。如果选区已有关联的范围,则除 Firefox 外的所有浏览器都将忽略该调用。
-- `removeRange(range)` - 从选区中删除 `range`。
+- `addRange(range)` - 将 `range` 添加到选择中。如果选择已有关联的范围,则除 Firefox 外的所有浏览器都将忽略该调用。
+- `removeRange(range)` - 从选择中删除 `range`。
- `removeAllRanges()` - 删除所有范围。
- `empty()` - `removeAllRanges` 的别名。
-另外,还有一些方便的方法可以直接操作选区范围,而无需使用 `Range`:
+另外,还有一些方便的方法可以直接操作选择范围,而无需使用 `Range`:
- `collapse(node, offset)` - 用一个新的范围替换选定的范围,该新范围从给定的 `node` 处开始,到偏移 `offset` 处结束。
- `setPosition(node, offset)` - `collapse` 的别名。
-- `collapseToStart()` - 折叠(以空范围替换)到选区起点,
-- `collapseToEnd()` - 折叠到选区终点,
-- `extend(node, offset)` - 将选区的焦点移到给定的 `node`,位置偏移 `oofset`,
-- `setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)` - 用给定的起点 `anchorNode/anchorOffset` 和 终点 `focusNode/focusOffset` 来替换选区范围。选中它们之间的所有内容。
+- `collapseToStart()` - 折叠(以空范围替换)到选择起点,
+- `collapseToEnd()` - 折叠到选择终点,
+- `extend(node, offset)` - 将选择的焦点移到给定的 `node`,位置偏移 `oofset`,
+- `setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)` - 用给定的起点 `anchorNode/anchorOffset` 和 终点 `focusNode/focusOffset` 来替换选择范围。选中它们之间的所有内容。
- `selectAllChildren(node)` - 选择 `node` 的所有子节点。
- `deleteFromDocument()` - 从文档中删除所选内容。
-- `containsNode(node, allowPartialContainment = false)` - 检查选区中是否包含 `node`(特别是如果第二个参数是 `true` 的话)
+- `containsNode(node, allowPartialContainment = false)` - 检查选择中是否包含 `node`(特别是如果第二个参数是 `true` 的话)
因此,对于许多任务,我们可以调用 `Selection` 方法,而无需访问底层的 `Range` 对象。
@@ -410,25 +410,25 @@ As text:
let range = new Range();
range.selectNodeContents(p); // 或用 selectNode(p) 也选择 标记
- document.getSelection().removeAllRanges(); // 清除现有选区(如果有的话)
+ document.getSelection().removeAllRanges(); // 清除现有选择(如果有的话)
document.getSelection().addRange(range);
```
-```smart header="如要选择,先删除现有的选区"
-如果选区已存在,则先用 `removeAllRanges()` 删除之。然后添加范围。否则,除 Firefox 外的所有浏览器都将忽略新范围。
+```smart header="如要选择,先删除现有的选择"
+如果选择已存在,则先用 `removeAllRanges()` 删除之。然后添加范围。否则,除 Firefox 外的所有浏览器都将忽略新范围。
-某些选区方法是一个例外,它们会替换现有的选区,例如 `setBaseAndExtent`。
+某些选择方法是一个例外,它们会替换现有的选择,例如 `setBaseAndExtent`。
```
-## 表单控件中的选区
+## 表单控件中的选择
-表单元素如 `input` 和 `textarea` 提供 [选区专用 API](https://html.spec.whatwg.org/#textFieldSelection),没有 `Selection` 或 `Range` 对象。由于输入值是纯文本而不是 HTML,因此不需要此类对象,一切都变得更加简单。
+表单元素如 `input` 和 `textarea` 提供 [选择专用 API](https://html.spec.whatwg.org/#textFieldSelection),没有 `Selection` 或 `Range` 对象。由于输入值是纯文本而不是 HTML,因此不需要此类对象,一切都变得更加简单。
属性:
-- `input.selectionStart` - 选区的起始位置(可写),
-- `input.selectionEnd` - 选区的结束位置(可写),
-- `input.selectionDirection` - 选区方向,可以是:"forward", "backward" 或 "none"(如通过双击选区),
+- `input.selectionStart` - 选择的起始位置(可写),
+- `input.selectionEnd` - 选择的结束位置(可写),
+- `input.selectionDirection` - 选择方向,可以是:"forward", "backward" 或 "none"(如通过双击选择),
事件:
- `input.onselect` - 选择某项时触发。
@@ -439,20 +439,20 @@ As text:
- `input.setSelectionRange(start, end, [direction])` - 在给定方向上(可选),从 `start` 一直选择到 `end`。
- `input.setRangeText(replacement, [start], [end], [selectionMode])` - 用新文本替换文本范围。
- 可选参数 `start` 和 `end`,如果提供的话,则设置范围的起点和终点,否则使用用户选区。
+ 可选参数 `start` 和 `end`,如果提供的话,则设置范围的起点和终点,否则使用用户选择。
- 最后一个参数 `selectionMode` 决定替换文本后如何设置选区。可能的值为:
+ 最后一个参数 `selectionMode` 决定替换文本后如何设置选择。可能的值为:
- `"select"` - 将选择新插入的文本。
- - `"start"` - 选区范围在插入的文本之前折叠(光标将在其之前)。
- - `"end"` - 选区范围在插入的文本之后折叠(光标将在其后)。
- - `"preserve"` - 尝试保留选区。这是默认值。
+ - `"start"` - 选择范围在插入的文本之前折叠(光标将在其之前)。
+ - `"end"` - 选择范围在插入的文本之后折叠(光标将在其后)。
+ - `"preserve"` - 尝试保留选择。这是默认值。
现在,让我们看看这些方法的实际使用。
-### 示例:跟踪选区
+### 示例:跟踪选择
-例如,此段代码使用 `onselect` 事件来跟踪选区:
+例如,此段代码使用 `onselect` 事件来跟踪选择:
```html run autorun
@@ -334,13 +334,13 @@ From – To
```
-### 选择获取示例代码
+### 选择获取演示
-如要获取整个选择:
+要获取整个选择:
- 作为文本:只需调用 `document.getSelection().toString()`。
-- 作为 DOM 节点:获取底层的范围并调用其 `cloneContents()` 方法(如果我们不支持 Firefox 多选择的话,则仅取第一个范围)。
+- 作为 DOM 节点:获取基础的(underlying)范围,并调用它们的 `cloneContents()` 方法(如果我们不支持 Firefox 多选的话,则仅取第一个范围)。
-下面是将选择选作为文本和 DOM 节点的示例代码:
+下面是将选择内容获取为文本和 DOM 节点的演示:
```html run height=100
Select me: italic and bold
@@ -360,7 +360,7 @@ As text:
cloned.append(selection.getRangeAt(i).cloneContents());
}
- // 以文本形式获取
+ // 获取为文本形式
astext.innerHTML += selection;
};
@@ -368,7 +368,7 @@ As text:
## 选择方法
-添加/删除范围的选择方法:
+添加/移除范围的选择方法:
- `getRangeAt(i)` - 获取从 `0` 开始的第 i 个范围。在除 Firefox 之外的所有浏览器中,仅使用 `0`。
- `addRange(range)` - 将 `range` 添加到选择中。如果选择已有关联的范围,则除 Firefox 外的所有浏览器都将忽略该调用。
From 408b9a741284f4f5a26cbc4ab22abd0ff519a360 Mon Sep 17 00:00:00 2001
From: LeviDing
Date: Sat, 4 Apr 2020 14:51:16 +0800
Subject: [PATCH 09/10] Update article.md
---
2-ui/99-ui-misc/02-selection-range/article.md | 42 +++++++++----------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/2-ui/99-ui-misc/02-selection-range/article.md b/2-ui/99-ui-misc/02-selection-range/article.md
index c4839195b8..2c354b5afe 100644
--- a/2-ui/99-ui-misc/02-selection-range/article.md
+++ b/2-ui/99-ui-misc/02-selection-range/article.md
@@ -10,7 +10,7 @@ libs:
JavaScript 可以获取现有选择,选择/取消全部或部分选择,从文档中删除所选部分,将其包装到一个标签(tag)中,等。
-你可以在本文最后的“总结”部分中找到使用方法。但是,如果你阅读整篇内容,将会有更多收获。基本的(underlying)`Range` 和 `Selection` 对象很容易掌握,因此,你不需要任何诀窍便可以使用它们做你想要做的事儿。
+你可以在本文最后的“总结”部分中找到使用方法。但是,如果你阅读整篇内容,将会有更多收获。底层的(underlying)`Range` 和 `Selection` 对象很容易掌握,因此,你不需要任何诀窍便可以使用它们做你想要做的事儿。
## 范围
@@ -338,7 +338,7 @@ From – To
要获取整个选择:
- 作为文本:只需调用 `document.getSelection().toString()`。
-- 作为 DOM 节点:获取基础的(underlying)范围,并调用它们的 `cloneContents()` 方法(如果我们不支持 Firefox 多选的话,则仅取第一个范围)。
+- 作为 DOM 节点:获取底层的(underlying)范围,并调用它们的 `cloneContents()` 方法(如果我们不支持 Firefox 多选的话,则仅取第一个范围)。
下面是将选择内容获取为文本和 DOM 节点的演示:
@@ -370,25 +370,25 @@ As text:
添加/移除范围的选择方法:
-- `getRangeAt(i)` - 获取从 `0` 开始的第 i 个范围。在除 Firefox 之外的所有浏览器中,仅使用 `0`。
-- `addRange(range)` - 将 `range` 添加到选择中。如果选择已有关联的范围,则除 Firefox 外的所有浏览器都将忽略该调用。
-- `removeRange(range)` - 从选择中删除 `range`。
-- `removeAllRanges()` - 删除所有范围。
-- `empty()` - `removeAllRanges` 的别名。
+- `getRangeAt(i)` —— 获取从 `0` 开始的第 i 个范围。在除 Firefox 之外的所有浏览器中,仅使用 `0`。
+- `addRange(range)` —— 将 `range` 添加到选择中。如果选择已有关联的范围,则除 Firefox 外的所有浏览器都将忽略该调用。
+- `removeRange(range)` —— 从选择中删除 `range`。
+- `removeAllRanges()` —— 删除所有范围。
+- `empty()` —— `removeAllRanges` 的别名。
另外,还有一些方便的方法可以直接操作选择范围,而无需使用 `Range`:
-- `collapse(node, offset)` - 用一个新的范围替换选定的范围,该新范围从给定的 `node` 处开始,到偏移 `offset` 处结束。
-- `setPosition(node, offset)` - `collapse` 的别名。
-- `collapseToStart()` - 折叠(以空范围替换)到选择起点,
-- `collapseToEnd()` - 折叠到选择终点,
-- `extend(node, offset)` - 将选择的焦点移到给定的 `node`,位置偏移 `oofset`,
-- `setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)` - 用给定的起点 `anchorNode/anchorOffset` 和 终点 `focusNode/focusOffset` 来替换选择范围。选中它们之间的所有内容。
-- `selectAllChildren(node)` - 选择 `node` 的所有子节点。
-- `deleteFromDocument()` - 从文档中删除所选内容。
-- `containsNode(node, allowPartialContainment = false)` - 检查选择中是否包含 `node`(特别是如果第二个参数是 `true` 的话)
+- `collapse(node, offset)` —— 用一个新的范围替换选定的范围,该新范围从给定的 `node` 处开始,到偏移 `offset` 处结束。
+- `setPosition(node, offset)` —— `collapse` 的别名。
+- `collapseToStart()` —— 折叠(替换为空范围)到选择起点,
+- `collapseToEnd()` —— 折叠到选择终点,
+- `extend(node, offset)` —— 将选择的焦点移到给定的 `node`,位置偏移 `oofset`,
+- `setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)` —— 用给定的起点 `anchorNode/anchorOffset` 和终点 `focusNode/focusOffset` 来替换选择范围。选中它们之间的所有内容。
+- `selectAllChildren(node)` —— 选择 `node` 的所有子节点。
+- `deleteFromDocument()` —— 从文档中删除所选择的内容。
+- `containsNode(node, allowPartialContainment = false)` —— 检查选择中是否包含 `node`(特别是如果第二个参数是 `true` 的话)
-因此,对于许多任务,我们可以调用 `Selection` 方法,而无需访问底层的 `Range` 对象。
+因此,对于许多任务,我们可以调用 `Selection` 方法,而无需访问底层的(underlying)`Range` 对象。
例如,选择段落 `` 的全部内容:
@@ -396,26 +396,26 @@ As text:
Select me: italic and bold
```
-同样用范围来做:
+使用范围来完成同一个操作:
```html run
Select me: italic and bold
```
-```smart header="如要选择,先删除现有的选择"
+```smart header="如要选择,请先移除现有的选择"
如果选择已存在,则先用 `removeAllRanges()` 删除之。然后添加范围。否则,除 Firefox 外的所有浏览器都将忽略新范围。
某些选择方法是一个例外,它们会替换现有的选择,例如 `setBaseAndExtent`。
From f7f8efb6329a0d804de4ad4fe098bda1b522a582 Mon Sep 17 00:00:00 2001
From: LeviDing
Date: Sat, 4 Apr 2020 16:39:33 +0800
Subject: [PATCH 10/10] Update article.md
---
2-ui/99-ui-misc/02-selection-range/article.md | 86 +++++++++----------
1 file changed, 43 insertions(+), 43 deletions(-)
diff --git a/2-ui/99-ui-misc/02-selection-range/article.md b/2-ui/99-ui-misc/02-selection-range/article.md
index 2c354b5afe..a1caa72e78 100644
--- a/2-ui/99-ui-misc/02-selection-range/article.md
+++ b/2-ui/99-ui-misc/02-selection-range/article.md
@@ -382,7 +382,7 @@ As text:
- `setPosition(node, offset)` —— `collapse` 的别名。
- `collapseToStart()` —— 折叠(替换为空范围)到选择起点,
- `collapseToEnd()` —— 折叠到选择终点,
-- `extend(node, offset)` —— 将选择的焦点移到给定的 `node`,位置偏移 `oofset`,
+- `extend(node, offset)` —— 将选择的焦点(focus)移到给定的 `node`,位置偏移 `oofset`,
- `setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset)` —— 用给定的起点 `anchorNode/anchorOffset` 和终点 `focusNode/focusOffset` 来替换选择范围。选中它们之间的所有内容。
- `selectAllChildren(node)` —— 选择 `node` 的所有子节点。
- `deleteFromDocument()` —— 从文档中删除所选择的内容。
@@ -416,37 +416,37 @@ As text:
```
```smart header="如要选择,请先移除现有的选择"
-如果选择已存在,则先用 `removeAllRanges()` 删除之。然后添加范围。否则,除 Firefox 外的所有浏览器都将忽略新范围。
+如果选择已存在,则首先使用 `removeAllRanges()` 将其清空。然后添加范围。否则,除 Firefox 外的所有浏览器都将忽略新范围。
-某些选择方法是一个例外,它们会替换现有的选择,例如 `setBaseAndExtent`。
+某些选择方法例外,它们会替换现有的选择,例如 `setBaseAndExtent`。
```
## 表单控件中的选择
-表单元素如 `input` 和 `textarea` 提供 [选择专用 API](https://html.spec.whatwg.org/#textFieldSelection),没有 `Selection` 或 `Range` 对象。由于输入值是纯文本而不是 HTML,因此不需要此类对象,一切都变得更加简单。
+诸如 `input` 和 `textarea` 等表单元素提供了 [专用的选择 API](https://html.spec.whatwg.org/#textFieldSelection),没有 `Selection` 或 `Range` 对象。由于输入值是纯文本而不是 HTML,因此不需要此类对象,一切都变得更加简单。
属性:
-- `input.selectionStart` - 选择的起始位置(可写),
-- `input.selectionEnd` - 选择的结束位置(可写),
-- `input.selectionDirection` - 选择方向,可以是:"forward", "backward" 或 "none"(如通过双击选择),
+- `input.selectionStart` —— 选择的起始位置(可写),
+- `input.selectionEnd` —— 选择的结束位置(可写),
+- `input.selectionDirection` —— 选择方向,其中之一:"forward","backward" 或 "none"(例如使用鼠标双击进行的选择),
事件:
-- `input.onselect` - 选择某项时触发。
+- `input.onselect` —— 当某个东西被选择时触发。
方法:
-- `input.select()` - 选择文本控件中的所有内容(可以是 `textarea` 而不是 `input`),
-- `input.setSelectionRange(start, end, [direction])` - 在给定方向上(可选),从 `start` 一直选择到 `end`。
-- `input.setRangeText(replacement, [start], [end], [selectionMode])` - 用新文本替换文本范围。
+- `input.select()` —— 选择文本控件中的所有内容(可以是 `textarea` 而不是 `input`),
+- `input.setSelectionRange(start, end, [direction])` —— 在给定方向上(可选),从 `start` 一直选择到 `end`。
+- `input.setRangeText(replacement, [start], [end], [selectionMode])` —— 用新文本替换范围中的文本。
- 可选参数 `start` 和 `end`,如果提供的话,则设置范围的起点和终点,否则使用用户选择。
+ 可选参数 `start` 和 `end`,如果提供的话,则设置范围的起点和终点,否则使用用户的选择。
最后一个参数 `selectionMode` 决定替换文本后如何设置选择。可能的值为:
- - `"select"` - 将选择新插入的文本。
- - `"start"` - 选择范围在插入的文本之前折叠(光标将在其之前)。
- - `"end"` - 选择范围在插入的文本之后折叠(光标将在其后)。
- - `"preserve"` - 尝试保留选择。这是默认值。
+ - `"select"` —— 将选择新插入的文本。
+ - `"start"` —— 选择范围将在插入的文本之前折叠(光标将在其之前)。
+ - `"end"` —— 选择范围将在插入的文本之后折叠(光标将紧随其后)。
+ - `"preserve"` —— 尝试保留选择。这是默认值。
现在,让我们看看这些方法的实际使用。
@@ -470,17 +470,17 @@ From – To
```
请注意:
-- `onselect` 是在选定某项时触发,而不是在删除选定项时触发。
-- 根据 [规范手册](https://w3c.github.io/selection-api/#dfn-selectionchange),`document.onselectionchange` 事件不应触发表单控件内的选择,因为它与 `document` 选择和范围不相关。一些浏览器会生成它,但我们不应该依赖它。
+- `onselect` 是在某项被选择时触发,而在选择被删除时不触发。
+- 根据 [规范](https://w3c.github.io/selection-api/#dfn-selectionchange),发表单控件内的选择不应该触发 `document.onselectionchange` 事件,因为它与 `document` 选择和范围不相关。一些浏览器会生成它,但我们不应该依赖它。
### 示例:移动光标
我们可以更改 `selectionStart` 和 `selectionEnd`,二者设定了选择。
-一个重要的边界情况是 `selectionStart` 和 `selectionEnd` 彼此相等。那就正是光标位置。或者,换句话说,当未选择任何内容时,选择会在光标位置折叠。
+一个重要的边界情况是 `selectionStart` 和 `selectionEnd` 彼此相等。那正是光标位置。或者,换句话说,当未选择任何内容时,选择会折叠在光标位置。
-因此,通过设置 `selectionStart` 和 `selectionEnd` 为相同的值,我们可以移动光标。
+因此,通过将 `selectionStart` 和 `selectionEnd` 设置为相同的值,我们可以移动光标。
例如:
@@ -491,10 +491,10 @@ Focus on me, the cursor will be at position 10.
```
-利用更多参数,我们可以设置范围 `start` 和 `end`。
+使用更多参数,我们可以设置范围 `start` 和 `end`。
-在本示例中,我们在输入文本中找到 `"THIS"`,替换它并保持被选中的状态:
+在下面这个示例中,我们在输入文本中找到 `"THIS"`,将其替换,并保持替换文本的选中状态:
```html run autorun
@@ -538,7 +538,7 @@ button.onclick = () => {
let pos = input.value.indexOf("THIS");
if (pos >= 0) {
input.setRangeText("*THIS*", pos, pos + 4, "select");
- input.focus(); // 选中它,使选择可见
+ input.focus(); // 聚焦(focus),以使选择可见
}
};
@@ -546,11 +546,11 @@ button.onclick = () => {
### 示例:在光标处插入
-如果未选择任何内容,或者在 `setRangeText` 中使用相同的 `start` 和 `end`,则仅插入新文本,不会删除任何内容。
+如果未选择任何内容,或者我们在 `setRangeText` 中使用了相同的 `start` 和 `end`,则仅插入新文本,不会删除任何内容。
我们也可以使用 `setRangeText` 在“光标处”插入一些东西。
-这是一个按钮,按下后会在光标位置插入 `"HELLO"`,然后光标紧随其后。如果选择不为空,则将其替换(我们可以通过比较`selectionStart!=selectionEnd` 来进行检测,否则如为空则做点别的事):
+这是一个按钮,按下后会在光标位置插入 `"HELLO"`,然后光标紧随其后。如果选择不为空,则将其替换(我们可以通过比较 `selectionStart!=selectionEnd` 来进行检测,为空则执行其他操作):
```html run autorun
@@ -580,12 +580,12 @@ button.onclick = () => {
Selectable
Unselectable
Selectable
```
- 这样不允许选择从 `elem` 开始。但是用户可以在其他地方开始选择,并将 `elem`包含在内。
+ 这样不允许选择从 `elem` 开始。但是用户可以在其他地方开始选择,并将 `elem` 包含在内。
- 然后 `elem` 便成为 `document.getSelection()` 的一部分,因此选择是有了,但其内容通常在复制粘贴中被忽略。
+ 然后 `elem` 将成为 `document.getSelection()` 的一部分,因此选择实际发生了,但是在复制粘贴中,其内容通常会被忽略。
-2. 防止在 `onselectstart` 或 `mousedown` 事件中执行默认操作。
+2. 防止 `onselectstart` 或 `mousedown` 事件中的默认行为。
```html run
Selectable
Unselectable
Selectable
@@ -597,36 +597,36 @@ button.onclick = () => {
这样可以防止在 `elem` 上开始选择,但是访问者可以在另一个元素上开始选择,然后扩展到 `elem`。
- 当同一操作上有另一个事件处理程序该触发选择时(例如 `mousedown`),这便会很方便。因此我们禁用选择以避免冲突,仍然允许复制 `elem` 内容。
+ 当同一行为上有另一个事件处理程序触发选择时(例如 `mousedown`),这会很方便。因此我们禁用选择以避免冲突,仍然允许复制 `elem` 内容。
-3. 我们也可以使用 `document.getSelection().empty()` 来清除选择。这很少使用,因为会在选择选中和消失时导致不必要的闪烁。
+3. 我们还可以使用 `document.getSelection().empty()` 来在选择发生后清除选择。很少使用这种方法,因为这会在选择项消失时导致不必要的闪烁。
## 参考
-- [DOM 规范: 范围(Range)](https://dom.spec.whatwg.org/#ranges)
+- [DOM 规范:范围(Range)](https://dom.spec.whatwg.org/#ranges)
- [选择(Selection)API](https://www.w3.org/TR/selection-api/#dom-globaleventhandlers-onselectstart)
-- [HTML 规范: 用于文本控件选中的 APIs](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#textFieldSelection)
+- [HTML 规范:用于文本控件选择的 API](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#textFieldSelection)
## 总结
-我们介绍了选择的两种不同的 API:
+我们介绍了用于选择的两种不同的 API:
1. 对于文档:`Selection` 和 `Range` 对象。
-2. 对于 `input`、`textarea`:其他方法和属性。
+2. 对于 `input`,`textarea`:其他方法和属性。
第二个 API 非常简单,因为它处理的是文本。
-最常用的方法可能是:
+最常用的方案一般是:
1. 获取选择:
```js run
let selection = document.getSelection();
- let cloned = /* 要将选中的节点复制到其内的元素 */;
+ let cloned = /* 要将所选的节点克隆到的元素 */;
- // 然后将 Range 方法用于 selection.getRangeAt(0)
- // 或如此处一样,用于所有范围,以支持多选
+ // 然后将 Range 方法应用于 selection.getRangeAt(0)
+ // 或者,像这样,用于所有范围,以支持多选
for (let i = 0; i < selection.rangeCount; i++) {
cloned.append(selection.getRangeAt(i).cloneContents());
}
@@ -638,9 +638,9 @@ button.onclick = () => {
// 直接:
selection.setBaseAndExtent(...from...to...);
- // 或我们可以创建范围并:
+ // 或者我们可以创建一个范围并:
selection.removeAllRanges();
selection.addRange(range);
```
-最后,关于光标。在可编辑元素如 `