Skip to content

Commit ce665e1

Browse files
committed
feat: update translation
1 parent 947f476 commit ce665e1

File tree

7 files changed

+44
-35
lines changed

7 files changed

+44
-35
lines changed

2-ui/3-event-details/7-keyboard-events/article.md

+14-7
Original file line numberDiff line numberDiff line change
@@ -149,31 +149,38 @@ function checkPhoneKey(key) {
149149

150150
我们都知道,像上面那样,从事件处理程序返回 `false` 会阻止事件的默认行为,所以如果按下的按键未通过按键检查,那么 `<input>` 中什么都不会出现(从事件处理程序返回 `true` 不会对任何行为产生影响,只有返回 `false` 会产生对应的影响)。
151151

152-
请注意,像 `key:Backspace``key:Left``key:Right``key:Ctrl+V` 这样的特殊按键在输入中无效。这是严格过滤器 `checkPhoneKey` 的副作用。
153-
154-
让我们将过滤条件放松一下:
152+
请注意,像 `key:Backspace``key:Left``key:Right` 这样的特殊按键在 `<input>` 中无效。这是严格过滤器 `checkPhoneKey` 的副作用。这些按键会使 `checkPhoneKey` 返回 `false`
155153

154+
让我们将过滤条件放宽一点,允许 `key:Left``key:Right``key:Delete``key:Backspace` 按键:
156155

157156
```html autorun height=60 run
158157
<script>
159158
function checkPhoneKey(key) {
160159
return (key >= '0' && key <= '9') ||
161-
['+','(',')','-','ArrowLeft','ArrowRight','Delete','Backspace'].includes(key);
160+
['+','(',')','-',*!*'ArrowLeft','ArrowRight','Delete','Backspace'*/!*].includes(key);
162161
}
163162
</script>
164163
<input onkeydown="return checkPhoneKey(event.key)" placeholder="Phone, please" type="tel">
165164
```
166165

167166
现在方向键和删除键都能正常使用了。
168167

169-
……但我们仍然可以使用鼠标右键单击 + 粘贴来输入任何内容。因此,这个过滤器并不是 100% 可靠。我们可以让它就这样吧,因为大多数情况下它是有效的。或者,另一种方式是跟踪 `input` 事件 —— 在任何修改后触发。这样我们就可以检查新值,并在其无效时高亮/修改它。
168+
……即使我们对按键进行了过滤,但仍然可以使用鼠标右键单击 + 粘贴来输入任何内容。移动端设备提供了其他输入内容的方式。因此,这个过滤器并不是 100% 可靠。
169+
170+
另一种方式是跟踪 `oninput` 事件 —— 在任何修改后都会触发此事件。这样我们就可以检查新的 `input.value`,并在其无效时修改它/高亮显示 `<input>`。或者我们可以同时使用这两个事件处理程序。
170171

171-
## 遗存
172+
## 历史遗留
172173

173-
过去曾经有一个 `keypress` 事件,还有事件对象的 `keyCode``charCode``which` 属性。
174+
过去有一个 `keypress` 事件,还有事件对象的 `keyCode``charCode``which` 属性。
174175

175176
大多数浏览器对它们都存在兼容性问题,以致使该规范的开发者不得不弃用它们并创建新的现代的事件(本文上面所讲的这些事件),除此之外别无选择。旧的代码仍然有效,因为浏览器还在支持它们,但现在完全没必要再使用它们。
176177

178+
## 移动端键盘
179+
180+
当使用虚拟/移动端键盘时,更正式一点的名字叫做 IME(Input-Method Editor),W3C 标准规定 KeyboardEvent 的 [`e.keyCode` 应该为 `229`](https://www.w3.org/TR/uievents/#determine-keydown-keyup-keyCode),并且 [`e.key` 应该为 `"Unidentified"`](https://www.w3.org/TR/uievents-key/#key-attr-values)
181+
182+
当按下某些按键(例如箭头或退格键)时,虽然其中一些键盘可能仍然使用正确的值来表示 `e.key``e.code``e.keyCode`...,但并不能保证所有情况下都能对应正确的值。所以你的键盘逻辑可能并不能保证适用于移动设备。
183+
177184
## 总结
178185

179186
按一个按键总是会产生一个键盘事件,无论是符号键,还是例如 `key:Shift``key:Ctrl` 等特殊按键。唯一的例外是有时会出现在笔记本电脑的键盘上的 `key:Fn` 键。它没有键盘事件,因为它通常是被在比 OS 更低的级别上实现的。

2-ui/3-event-details/7-keyboard-events/keyboard-dump.view/script.js

+2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ let lastTime = Date.now();
55
function handle(e) {
66
if (form.elements[e.type + 'Ignore'].checked) return;
77

8+
area.scrollTop = 1e6;
9+
810
let text = e.type +
911
' key=' + e.key +
1012
' code=' + e.code +

2-ui/4-forms-controls/1-form-elements/article.md

+24-25
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
文档中的表单是特殊集合 `document.forms` 的成员。
1010

11-
这就是所谓的“命名的集合”:既是被命名了的,也是有序的。我们既可以使用名字,也可以使用在文档中的编号来获取表单。
11+
这就是所谓的**“命名的集合”**:既是被命名了的,也是有序的。我们既可以使用名字,也可以使用在文档中的编号来获取表单。
1212

1313
```js no-beautify
14-
document.forms.my - name="my" 的表单
15-
document.forms[0] - 文档中的第一个表单
14+
document.forms.my; // name="my" 的表单
15+
document.forms[0]; // 文档中的第一个表单
1616
```
1717

1818
当我们有了一个表单时,其中的任何元素都可以通过命名的集合 `form.elements` 来获取到。
@@ -38,7 +38,7 @@ document.forms[0] - 文档中的第一个表单
3838

3939
可能会有多个名字相同的元素,这种情况经常在处理单选按钮中出现。
4040

41-
在这种情况下,`form.elements[name]` 将会是一个集合,例如:
41+
在这种情况下,`form.elements[name]` 将会是一个**集合**例如:
4242

4343
```html run height=40
4444
<form>
@@ -177,18 +177,16 @@ input.checked = true; // 对于复选框(checkbox)或单选按钮(radio bu
177177
一个 `<select>` 元素有 3 个重要的属性:
178178
179179
1. `select.options` —— `<option>` 的子元素的集合,
180-
2. `select.value` —— 当前所选择的 `<option>` 的 `value`
181-
3. `select.selectedIndex` —— 当前所选择的 `<option>` 的编号
180+
2. `select.value` —— 当前所选择的 `<option>` 的 **value**
181+
3. `select.selectedIndex` —— 当前所选择的 `<option>` 的**编号**
182182
183183
它们提供了三种为 `<select>` 设置 `value` 的不同方式:
184184
185-
1. 找到对应的 `<option>` 元素,并将 `option.selected` 设置为 `true`。
186-
2. 将 `select.value` 设置为对应的 `value`
187-
3. 将 `select.selectedIndex` 设置为对应 `<option>` 的编号。
185+
1. 找到对应的 `<option>` 元素(例如在 `select.options` 中),并将其 `option.selected` 设置为 `true`。
186+
2. 如果我们知道新的值:将 `select.value` 设置为对应的新的值
187+
3. 如果我们知道新的选项的索引:将 `select.selectedIndex` 设置为对应 `<option>` 的编号。
188188
189-
第一个方式最明显,但是 `(2)` 和 `(3)` 通常来说会更方便。
190-
191-
下面是一个例子:
189+
下面是这三种方式的示例:
192190
193191
```html run
194192
<select id="select">
@@ -198,18 +196,19 @@ input.checked = true; // 对于复选框(checkbox)或单选按钮(radio bu
198196
</select>
199197
200198
<script>
201-
// 所有这三行做的是同一件事
199+
// 下面这三行做的都是同一件事
202200
select.options[2].selected = true;
203201
select.selectedIndex = 2;
204202
select.value = 'banana';
203+
// 请注意:选项编号是从零开始的,所以编号 2 表示的是第三项
205204
</script>
206205
```
207206
208-
和大多数其它控件不同,如果 `<select>` 具有 `multiple` 特性(attribute),则允许多选。尽管这种功能可用,但很少被使用
207+
和大多数其它控件不同,如果 `<select>` 具有 `multiple` 特性(attribute),则允许多选。尽管这个特性(attribute)很少被用到
209208
210-
如果必须使用的话,请使用第一种方式:在子元素 `<option>` 中添加/移除 `selected` 属性。
209+
对于多选的值,使用第一种设置值的方式:在 `<option>` 子元素中添加/移除 `selected` 属性。
211210
212-
我们可以通过 `select.options` 来获取它们的集合,例如
211+
这是一个如何从多选的 `<select>` 中获取选择的值的示例
213212
214213
```html run
215214
<select id="select" *!*multiple*/!*>
@@ -232,31 +231,31 @@ input.checked = true; // 对于复选框(checkbox)或单选按钮(radio bu
232231
233232
### new Option
234233
235-
这很少单独使用。但它仍然是一个有趣的东西。
236-
237-
在 [规范](https://html.spec.whatwg.org/multipage/forms.html#the-option-element) 中,有一个很好的简短语法可以创建 `<option>` 元素:
234+
在 [规范](https://html.spec.whatwg.org/multipage/forms.html#the-option-element) 中,有一个很好的简短语法可以创建一个 `<option>` 元素:
238235
239236
```js
240237
option = new Option(text, value, defaultSelected, selected);
241238
```
242239
243-
参数
240+
此语法是可选的。我们可以使用 `document.createElement('option')` 并手动设置特性(attribute)。不过,这种语法写起来可能会更短,其参数如下
244241
245242
- `text` —— `<option>` 中的文本,
246243
- `value` —— `<option>` 的 `value`,
247244
- `defaultSelected` —— 如果为 `true`,那么 `selected` HTML-特性(attribute)就会被创建,
248245
- `selected` —— 如果为 `true`,那么这个 `<option>` 就会被选中。
249246
250-
你可能会对 `defaultSelected` 和 `selected` 有一些疑惑。这很简单:`defaultSelected` 设置的是 HTML-特性(attribute),我们可以使用 `option.getAttribute('selected')` 来获得。而 `selected` —— 无论这个 `option` 是否被选择,它都很重要。通常,这两个值都设置为 `true`,或者都不设置(与设置为 `false` 是一样的)
247+
`defaultSelected` 和 `selected` 的区别是,`defaultSelected` 设置的是 HTML-特性(attribute),我们可以使用 `option.getAttribute('selected')` 来获得。而 `selected` 设置的是选项是否被选中
251248
252-
例如:
249+
在实际使用中,通常应该将**同时**将这两个值设置为 `true` 或 `false`。(或者,直接省略它们;两者都默认为 `false`。)
250+
251+
例如,下面是一个新的**未被选中的**选项:
253252
254253
```js
255254
let option = new Option("Text", "value");
256255
// 创建 <option value="value">Text</option>
257256
```
258257
259-
选择相同的元素
258+
相同的选项,但被选中了
260259
261260
```js
262261
let option = new Option("Text", "value", true, true);
@@ -290,9 +289,9 @@ let option = new Option("Text", "value", true, true);
290289
`element.form`
291290
: 元素通过 `form` 属性来引用它们所属的表单。
292291
293-
`value` 可以被通过 `input.value`,`textarea.value`,`select.value` 等来获取到,对于单选按钮和复选框来说可以使用 `input.checked`。
292+
`value` 可以被通过 `input.value`,`textarea.value`,`select.value` 等来获取到。(对于单选按钮(radio button)和复选框(checkbox),可以使用 `input.checked` 来确定是否选择了一个值
294293
295-
对于 `<select>` 元素,们可以通过索引 `select.selectedIndex` 来获取它的 `value`,也可以通过 `<option>` 集合 `select.options`。
294+
对于 `<select>`,我们可以通过索引 `select.selectedIndex` 来获取它的 `value`,也可以通过 `<option>` 集合 `select.options` 来获取它的 `value`。
296295
297296
这些是开始使用表单的基础。我们将在本教程中进一步介绍更多示例。
298297

2-ui/4-forms-controls/2-focus-blur/5-keyboard-mouse/task.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ importance: 4
99
[demo src="solution"]
1010

1111
P.S. 除了 `#mouse` 元素外,不要在任何地方放置事件处理程序。
12+
1213
P.P.S. 不要修改 HTML/CSS,这个方法应该是通用的,可以用于任何元素。

2-ui/4-forms-controls/2-focus-blur/article.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ Your email please: <input type="email" id="input">
118118

119119
切换顺序为:从 `1` 开始的具有 `tabindex` 的元素排在前面(按 `tabindex` 顺序),然后是不具有 `tabindex` 的元素(例如常规的 `<input>`)。
120120

121-
具有 `tabindex` 的元素按文档源顺序(默认顺序)切换。
121+
不具有 `tabindex` 的元素按文档源顺序(默认顺序)切换。
122122

123123
这里有两个特殊的值:
124124

2-ui/4-forms-controls/3-events-change-input/1-deposit-calculator/solution.view/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
let years = form.months.value / 12;
9797
if (!years) return;
9898

99-
let result = Math.round(initial * (1 + interest * years));
99+
let result = Math.round(initial * (1 + interest) ** years);
100100

101101
let height = result / form.money.value * 100 + 'px';
102102
document.getElementById('height-after').style.height = height;

2-ui/4-forms-controls/3-events-change-input/1-deposit-calculator/task.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ importance: 5
1717
// initial: 总存款的初始值
1818
// interest: 例如 0.05 意味着每年涨幅 5%
1919
// years: 要等待多少年
20-
let result = Math.round(initial * (1 + interest * years));
20+
let result = Math.round(initial * (1 + interest) ** years);
2121
```

0 commit comments

Comments
 (0)