一章中讨论过的 `event.stopPropagation()`,以及为什么停止冒泡是不好的吗?
-有时我们可以使用 `event.defaultPrevented` 来代替。
+有时我们可以使用 `event.defaultPrevented` 来代替,来通知其他事件处理程序,该事件已经被处理。
-我们来看一个实际的例子,停止冒泡看起来是必须的,但实际上没有它我们也可以做的很好。
+我们来看一个实际的例子。
-默认情况下,`contextmenu` 事件(鼠标右击)上的浏览器显示一个带有标准选项的上下文菜单。我们可以阻止它并显示我们自定义的菜单,就像这样:
+默认情况下,浏览器在 `contextmenu` 事件(单击鼠标右键)时,显示带有标准选项的上下文菜单。我们可以阻止它并显示我们自定义的菜单,就像这样:
```html autorun height=50 no-beautify run
-
+
```
-现在,假设我们用我们自己的选项实现我们自己文档范围的上下文菜单。在文档中,我们可能有其他元素和它们自己的上下文菜单:
+现在,除了该上下文菜单外,我们还想实现文档范围的上下文菜单。
+
+右键单击时,应该显示最近的上下文菜单:
```html autorun height=80 no-beautify run
Right-click here for the document context menu
@@ -135,9 +150,9 @@ menu.onclick = function(event) {
```
-问题是当我们点击 `elem` 时,我们得到两个菜单:按钮级别(事件冒泡)和文档级别的菜单。
+问题是,当我们点击 `elem` 时,我们会得到两个菜单:按钮级和文档级(事件冒泡)的菜单。
-如何修复呢?其中一个解决方案是:“在按钮处理器中,我们全部去处理(按钮级别的)事件,然后停止它。”还要使用 `event.stopPropagation()`:
+如何修复呢?其中一个解决方案是:“当我们在按钮处理程序中处理鼠标右键单击事件时,我们阻止其冒泡”,使用 `event.stopPropagation()`:
```html autorun height=80 no-beautify run
Right-click for the document menu
@@ -159,13 +174,13 @@ menu.onclick = function(event) {
```
-现在按钮级别的菜单如期工作。但是代价太大,我们会永远拒绝访问任何外部代码的右击信息,包括收集统计信息的计数器等等。这很不可取。
+现在按钮级菜单如期工作。但是代价太大,我们永远拒绝访问外部代码中的有关右键单击的信息,包括收集统计信息的计数器等。这是非常不明智的。
-另一个替代方案是,在文档级处理器中去检测默认动作是否被阻止?如果是这样的话,那么事件就被处理了,我们不需要对它做出反应。
+另一个替代方案是,检查 `document` 处理程序是否阻止了浏览器的默认行为?如果阻止了,那么该事件已经得到了处理,我们无需再对此事件做出反应。
```html autorun height=80 no-beautify run
-Right-click for the document menu (fixed with event.defaultPrevented)
+Right-click for the document menu (added a check for event.defaultPrevented)
```
-现在一切都可以正常工作了。如果我们有嵌套元素,并且每个元素都有自己的上下文菜单,那么这也是可以运行的。只需确保检查每个 `contextmenu` 处理器中的 `event.defaultPrevented`。
+现在一切都可以正常工作了。如果我们有嵌套的元素,并且每个元素都有自己的上下文菜单,那么这也是可以运行的。只需确保检查每个 `contextmenu` 处理程序中的 `event.defaultPrevented`。
```smart header="event.stopPropagation() 和 event.preventDefault()"
-正如我们所看到的那样,`event.stopPropagation()` 和 `event.preventDefault()`(也被认为是 `return false`)是两种不同的事情。它们之间毫无联系。
+正如我们所看到的,`event.stopPropagation()` 和 `event.preventDefault()`(也被认为是 `return false`)是两个不同的东西。它们之间毫无关联。
```
-```smart header="嵌套的上下文目录结构"
-还有一些实现嵌套上下文菜单的替代方法。其中一个是拥有一个特殊的全局对象,它具有处理 `document.oncontextmenu` 的方法,还允许在其中存储各种“低级”处理器方法。
+```smart header="嵌套的上下文菜单结构"
+还有其他实现嵌套上下文菜单的方式。其中之一是拥有一个具有 `document.oncontextmenu` 处理程序的全局对象,以及使我们能够在其中存储其他处理程序的方法。
-对象将捕获任何右击事件,查看存储的处理器并运行相应的处理器。
+该对象将捕获任何右键单击,浏览存储的处理程序并运行适当的处理程序。
-但每一段需要上下文菜单的代码都应该了解该对象,并使用它的帮助,而不是使用自己的 `contextmenu` 处理器。
+但是,每段需要上下文菜单的代码都应该了解该对象,并使用它的帮助,而不是使用自己的 `contextmenu` 处理程序。
```
## 总结
-有许多默认浏览器动作:
+有很多默认的浏览器行为:
- `mousedown` —— 开始选择(移动鼠标进行选择)。
-- 在 `` 上 `click` —— 检查/取消选中的 `input`。
-- `submit` —— 单击 `` 或在表单中通过单击 `key:Enter` 触发该事件,并在其后浏览器提交表单。
-- `wheel` —— 鼠标滚轮事件的滚动将作为默认动作。
-- `keydown` —— 按下按键可能会导致将字符添加到字段,或者触发其他动作。
-- `contextmenu` —— 事件发生在右击时,动作是显示浏览器上下文菜单。
-- ...还有更多...
+- 在 `` 上的 `click` —— 选中/取消选中的 `input`。
+- `submit` —— 点击 `` 或者在表单字段中按下 `key:Enter` 键会触发该事件,之后浏览器将提交表单。
+- `keydown` —— 按下一个按键可能会导致将字符添加到字段,或者触发其他行为。
+- `contextmenu` —— 事件发生在鼠标右键单击时,触发的行为是显示浏览器上下文菜单。
+- ……还有更多……
+
+如果我们只想通过 JavaScript 来处理事件,那么所有默认行为都是可以被阻止的。
-如果我们想要通过 JavaScript 来处理事件,那么所有的默认动作都可以被阻止。
+想要阻止默认行为 —— 可以使用 `event.preventDefault()` 或 `return false`。第二个方法只适用于通过 `on` 分配的处理程序。
-想要阻止默认行为 —— 可以使用 `event.preventDefault()` 或者 `return false`。第二个方法只适用于分发了 `on` 的处理器。
+`addEventListener` 的 `passive: true` 选项告诉浏览器该行为不会被阻止。这对于某些移动端的事件(像 `touchstart` 和 `touchmove`)很有用,用以告诉浏览器在滚动之前不应等待所有处理程序完成。
-如果默认动作被阻止,`event.defaultPrevented` 的值就会变成 `true`,否则会变成 `false`。
+如果默认行为被阻止,`event.defaultPrevented` 的值会变成 `true`,否则为 `false`。
-```warn header="Stay semantic, don't abuse"
-从技术上来说,通过阻止默认动作和添加 JavaScript,我们可以定制任何元素的行为。例如,我们可以使链接 `` 像按钮一样工作,而按钮 `