From 0b75fdb12dfb62cc987b9c316595e6a09d8eef58 Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Wed, 18 Jul 2018 18:33:05 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../03-event-delegation/1-hide-message-delegate/task.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md b/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md index 62c0a8ab00..a6b06614f8 100644 --- a/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md +++ b/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md @@ -2,12 +2,12 @@ importance: 5 --- -# Hide messages with delegation +# 使用委托隐藏消息 -There's a list of messages with removal buttons `[x]`. Make the buttons work. +有一张带有移除按钮 `[x]` 的消息列表。让按钮可以工作。 -Like this: +就像这样: [iframe src="solution" height=420] -P.S. Should be only one event listener on the container, use event delegation. +P.S. 应该只是容器上的一个事件侦听者,使用事件委托。 From 055fbab284e906321a5039bbed77189dba808d74 Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Wed, 18 Jul 2018 23:05:52 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2-events/03-event-delegation/2-sliding-tree/solution.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md b/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md index 09c14a08c1..d533eaed15 100644 --- a/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md +++ b/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md @@ -1,4 +1,4 @@ -The solution has two parts. +解决方案有两部分。 -1. Wrap every tree node title into ``. Then we can CSS-style them on `:hover` and handle clicks exactly on text, because `` width is exactly the text width (unlike without it). -2. Set a handler to the `tree` root node and handle clicks on that `` titles. +1. 将每个树节点标题包装为 ``。然后我们可以在 `:hover` 上使用 CSS 样式,并准确地处理文本上的单击,因为 `` 宽度正好是文本宽度(与没有它不同)。 +2. 将处理器设置为 `tree` 根节点,并处理对该 `` 标题的单击。 From 80ce820b791ff151c2dfd6bf7c3bbf71e56e528e Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Wed, 18 Jul 2018 23:07:18 +0800 Subject: [PATCH 03/14] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2-ui/2-events/03-event-delegation/article.md | 130 +++++++++---------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/article.md b/2-ui/2-events/03-event-delegation/article.md index 16d9dc71a0..c2e2d664b9 100644 --- a/2-ui/2-events/03-event-delegation/article.md +++ b/2-ui/2-events/03-event-delegation/article.md @@ -1,19 +1,19 @@ -# Event delegation +# 事件委托 -Capturing and bubbling allow to implement one of most powerful event handling patterns called *event delegation*. +捕获和冒泡允许实现一种称为**事件委托**的强大处理模式。 -The idea is that if we have a lot of elements handled in a similar way, then instead of assigning a handler to each of them -- we put a single handler on their common ancestor. +我们的想法是,如果我们有许多元素是以类似的方式处理的,那么我们就不需要给每个元素分配一个处理程序 —— 而是在它们共同的祖先上面添加一个处理器。 -In the handler we get `event.target`, see where the event actually happened and handle it. +在处理器中,我们得到了 `event.target`,查看事件实际发生的位置并处理它。 -Let's see an example -- the [Ba-Gua diagram](http://en.wikipedia.org/wiki/Ba_gua) reflecting the ancient Chinese philosophy. +我们看一个示例 —— 反映中国古代哲学的[八卦图](http://en.wikipedia.org/wiki/Ba_gua)。 -Here it is: +就是这个: [iframe height=350 src="bagua" edit link] -The HTML is like this: +HTML 如下所示: ```html @@ -30,22 +30,22 @@ The HTML is like this:
``` -The table has 9 cells, but there could be 99 or 9999, doesn't matter. +该表有 9 个单元,但可能有 99 个或者 9999 个单元,这些都不重要。 -**Our task is to highlight a cell `` on click.** +**我们的任务是在单击时高亮显示一个 `` 单元格。** Instead of assign an `onclick` handler to each `` (can be many) -- we'll setup the "catch-all" handler on `` element. -It will use `event.target` to get the clicked element and highlight it. +它使用 `event.target` 来获取单击的元素并高亮显示它。 -The code: +代码: ```js let selectedTd; *!* table.onclick = function(event) { - let target = event.target; // where was the click? + let target = event.target; // 在哪里单击的? if (target.tagName != 'TD') return; // not on TD? Then we're not interested @@ -62,13 +62,13 @@ function highlight(td) { } ``` -Such a code doesn't care how many cells there are in the table. We can add/remove `
` dynamically at any time and the highlighting will still work. +这样的代码不会关心在表中有多少单元格。随时可以动态添加/移除 ``,高亮显示仍然有效。 -Still, there's a drawback. +尽管如此,还是存在缺点。 -The click may occur not on the ``, but inside it. +单击可能不是发生在 `` 上,而是发生在其内部。 -In our case if we take a look inside the HTML, we can see nested tags inside ``, like ``: +在我们的例子中,如果我们查看 HTML 内部,我们可以看到 `` 内的嵌套标记,比如 ``: ```html @@ -79,13 +79,13 @@ In our case if we take a look inside the HTML, we can see nested tags inside ` ``` -Naturally, if a click happens on that `` then it becomes the value of `event.target`. +当然,如果单击该 ``,那么它将成为 `event.target` 的值。 ![](bagua-bubble.png) -In the handler `table.onclick` we should take such `event.target` and find out whether the click was inside `` or not. +在处理器 `table.onclick` 中,我们应该接受这样的 `event.target`,并确定单击是否在 `` 内。 -Here's the improved code: +以下是改善的代码: ```js table.onclick = function(event) { @@ -99,27 +99,27 @@ table.onclick = function(event) { }; ``` -Explanations: -1. The method `elem.closest(selector)` returns the nearest ancestor that matches the selector. In our case we look for `` on the way up from the source element. -2. If `event.target` is not inside any ``, then the call returns `null`, and we don't have to do anything. -3. In case of nested tables, `event.target` may be a `` lying outside of the current table. So we check if that's actually *our table's* ``. -4. And, if it's so, then highlight it. +解释: +1. `elem.closest(selector)` 方法返回与选择器匹配的最近的祖先。在我们的例子中,我们从源元素上升的路上查找 ``。 +2. 如果 `event.target` 不在任何 `` 中,那么调用将返回 `null`,我们不需要做任何事情。 +3. 在嵌套表的情况下,`event.target` 可能是位于当前表之外的 ``。因此我们检查这是否是**我们的表**的 ``。 +4. 如果是的话,就高亮显示它。 -## Delegation example: actions in markup +## 委托示例:标记中的操作 -The event delegation may be used to optimize event handling. We use a single handler for similar actions on many elements. Like we did it for highlighting ``. +事件委托可用于优化事件处理。我们使用单个处理器来对许多元素进行相似的操作。就像我们用于高亮显示 `` 一样。 -But we can also use a single handler as an entry point for many different things. +但我们仍然可以使用单个处理器作为许多不同事情的入口点。 -For instance, we want to make a menu with buttons "Save", "Load", "Search" and so on. And there's an object with methods `save`, `load`, `search`.... +例如,我们想要制作一个有“保存”、“加载”、“搜索”等功能的菜单。有一个拥有 `save`、`load`、`search` 等方法的对象。 -The first idea may be to assign a separate handler to each button. But there's a more elegant solution. We can add a handler for the whole menu and `data-action` attributes for buttons that has the method to call: +第一个想法可能是为每个按钮分配一个单独的处理器。但有一个更优雅的解决方案。我们可以为整个菜单添加一个处理器,并为有方法调用的按钮添加 `data-action`属性: ```html ``` -The handler reads the attribute and executes the method. Take a look at the working example: +处理器读取属性并执行方法。查看下述运行示例: ```html autorun height=60 run ` elements should sort it by corresponding column. +对表进行排序:单击 `` 元素应该按照相应的列对其排序。 -Each `` has the type in the attribute, like this: +每个 `` 都有属性中的类型,如下所示: ```html @@ -32,12 +32,12 @@ Each `
` has the type in the attribute, like this:
``` -In the example above the first column has numbers, and the second one -- strings. The sorting function should handle sort according to the type. +在上面的例子中,第一列有数字,第二列有字符串。排序函数应根据类型处理排序。 -Only `"string"` and `"number"` types should be supported. +只有 `"string"` 和 `"number"` 类型应该被支持。 -The working example: +运行示例: [iframe border=1 src="solution" height=190] -P.S. The table can be big, with any number of rows and columns. +P.S. 表可以很大,有任意数量的行和列。 From aa5fbd436ba9f7369e6e5f4b87bdfd6794c8661d Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Wed, 18 Jul 2018 23:34:14 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4-behavior-tooltip/task.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md b/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md index fc2462289c..62c70830e4 100644 --- a/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md +++ b/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md @@ -2,35 +2,35 @@ importance: 5 --- -# Tooltip behavior +# 工具提示行为 -Create JS-code for the tooltip behavior. +为工具提示行为编写 JavaScript 代码。 -When a mouse comes over an element with `data-tooltip`, the tooltip should appear over it, and when it's gone then hide. +当鼠标移入带有 `data-tooltip` 的元素时,工具提示应该出现在它上面,当它移出时,就隐藏起来。 -An example of annotated HTML: +带有注释的 HTML 示例: ```html ``` -Should work like this: +应该像这样运行: [iframe src="solution" height=200 border=1] -In this task we assume that all elements with `data-tooltip` have only text inside. No nested tags. +在这个任务中,我们假设所有具有 `data-tooltip` 的元素中只有文本。没有嵌套标签。 -Details: +详细资料: -- The tooltip should not cross window edges. Normally it should be above the element, but if the element is at the page top and there's no space for the tooltip, then below it. -- The tooltip is given in the `data-tooltip` attribute. It can be arbitrary HTML. +- 工具提示不应跨窗口边缘。通常,它应该在元素的上方,但是如果元素位于页面顶部,并且没有工具提示的空间,那么在它下面。 +- 工具提示在 `data-tooltip` 属性中给定。它可以是任意 HTML。 -You'll need two events here: -- `mouseover` triggers when a pointer comes over an element. -- `mouseout` triggers when a pointer leaves an element. +你需要两个时间: +- `mouseover` 当指针出现在元素上时触发。 +- `mouseout` 当指针移出元素时触发。 -Please use event delegation: set up two handlers on `document` to track all "overs" and "outs" from elements with `data-tooltip` and manage tooltips from there. +请使用事件委托:在 `document` 上设置两个处理器,以跟踪带有 `data-tooltip` 的元素中所有的 “over” 和 “out”,并从那里管理工具提示。 -After the behavior is implemented, even people unfamiliar with JavaScript can add annotated elements. +在实现了该行为后,即使是不熟悉 JavaScript 的人也可以添加带注释的元素。 -P.S. To keep things natural and simple: only one tooltip may show up at a time. +P.S. 为了保持自然和简单:一次只能出现一个工具提示。 From c914ca5867160a1b443666c0fd8246f26a76c4dd Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Sat, 13 Oct 2018 13:28:07 +0800 Subject: [PATCH 07/14] The First Modification --- .../2-events/03-event-delegation/2-sliding-tree/solution.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md b/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md index d533eaed15..d3424fd77f 100644 --- a/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md +++ b/2-ui/2-events/03-event-delegation/2-sliding-tree/solution.md @@ -1,4 +1,4 @@ -解决方案有两部分。 +解决方案分为两步。 -1. 将每个树节点标题包装为 ``。然后我们可以在 `:hover` 上使用 CSS 样式,并准确地处理文本上的单击,因为 `` 宽度正好是文本宽度(与没有它不同)。 -2. 将处理器设置为 `tree` 根节点,并处理对该 `` 标题的单击。 +1. 将每个树节点的标题用 `` 包裹起来。然后我们可以在 `:hover` 上使用 CSS 样式,并准确地处理文本上的单击事件,因为 `` 宽度正好是文本宽度(与没有它不同)。 +2. 为 `tree` 的根节点设置处理器来处理 `` 中标题的单击事件。 From 1e464e0077ccb44dcfda5cdb58b5b53106edd334 Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Sat, 13 Oct 2018 13:31:37 +0800 Subject: [PATCH 08/14] The First Modification --- 2-ui/2-events/03-event-delegation/2-sliding-tree/task.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md b/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md index 1e97784f0f..3173e7417e 100644 --- a/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md +++ b/2-ui/2-events/03-event-delegation/2-sliding-tree/task.md @@ -2,13 +2,13 @@ importance: 5 --- -# 树目录 +# 树形菜单 -创建显示/隐藏节点子节点的树,单击: +创建一个单击可以显示/隐藏子节点的树形菜单: [iframe border=1 src="solution"] -请求: +要求: - 只有一个事件处理器(使用委托) -- 在节点标题外单击(在空格上)不应该做任何事情。 +- 单击节点标题以外的地方(空白区域)不做任何处理。 From 32bfb275c90c4fd55552bfd4e42623c888b2ea76 Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Sat, 13 Oct 2018 13:35:48 +0800 Subject: [PATCH 09/14] The First Modification --- .../03-event-delegation/3-sortable-table/task.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/3-sortable-table/task.md b/2-ui/2-events/03-event-delegation/3-sortable-table/task.md index f84af06951..92b25e9cfb 100644 --- a/2-ui/2-events/03-event-delegation/3-sortable-table/task.md +++ b/2-ui/2-events/03-event-delegation/3-sortable-table/task.md @@ -2,11 +2,11 @@ importance: 4 --- -# 可排序表 +# 可排序表格 -对表进行排序:单击 `
` 元素应该按照相应的列对其排序。 +让表格可以排序:单击 `` 元素让对应的列自动排序。 -每个 `` 都有属性中的类型,如下所示: +每个 `` 都有类型属性,如下所示: ```html @@ -32,9 +32,9 @@ importance: 4
``` -在上面的例子中,第一列有数字,第二列有字符串。排序函数应根据类型处理排序。 +在上面的例子中,第一列为数字,第二列为 —— 字符串。排序函数应根据类型进行排序。 -只有 `"string"` 和 `"number"` 类型应该被支持。 +应该只支持 `"string"` 和 `"number"` 类型。 运行示例: From 7432a70f84f3c25d20ab43ec9a2264882df4ad18 Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Sat, 13 Oct 2018 13:39:08 +0800 Subject: [PATCH 10/14] The First Modification --- .../4-behavior-tooltip/task.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md b/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md index 62c70830e4..76dbeddd0f 100644 --- a/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md +++ b/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md @@ -2,11 +2,11 @@ importance: 5 --- -# 工具提示行为 +# 提示工具行为 -为工具提示行为编写 JavaScript 代码。 +为提示工具行为编写 JavaScript 代码。 -当鼠标移入带有 `data-tooltip` 的元素时,工具提示应该出现在它上面,当它移出时,就隐藏起来。 +当鼠标移入带有 `data-tooltip` 的元素时,提示工具应该出现在它上面,移出时则隐藏起来 带有注释的 HTML 示例: ```html @@ -14,7 +14,7 @@ importance: 5 ``` -应该像这样运行: +运行结果如下: [iframe src="solution" height=200 border=1] @@ -22,15 +22,15 @@ importance: 5 详细资料: -- 工具提示不应跨窗口边缘。通常,它应该在元素的上方,但是如果元素位于页面顶部,并且没有工具提示的空间,那么在它下面。 -- 工具提示在 `data-tooltip` 属性中给定。它可以是任意 HTML。 +- 提示工具不应超出窗口边缘。通常,它应该在元素的上方,但是如果元素位于页面顶部,并且没有提示工具的空间,则在其下面. +- 提示工具由 `data-tooltip` 属性中指定。它可以是任意 HTML。 -你需要两个时间: +你需要两个事件: - `mouseover` 当指针出现在元素上时触发。 - `mouseout` 当指针移出元素时触发。 -请使用事件委托:在 `document` 上设置两个处理器,以跟踪带有 `data-tooltip` 的元素中所有的 “over” 和 “out”,并从那里管理工具提示。 +请使用事件委托:在 `document` 上设置两个处理器,以跟踪带有 `data-tooltip` 的元素中所有的 “over” 和 “out”,并从那里管理提示工具。 在实现了该行为后,即使是不熟悉 JavaScript 的人也可以添加带注释的元素。 -P.S. 为了保持自然和简单:一次只能出现一个工具提示。 +P.S. 为了保持自然和简单:一次只能出现一个提示工具。 From 2e61e618cea20a34d2ddb3bfb793e45310b53608 Mon Sep 17 00:00:00 2001 From: Starrier <1342878298@qq.com> Date: Sun, 14 Oct 2018 00:41:59 +0800 Subject: [PATCH 11/14] The First Modification --- 2-ui/2-events/03-event-delegation/article.md | 66 ++++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/article.md b/2-ui/2-events/03-event-delegation/article.md index c2e2d664b9..579763e8ba 100644 --- a/2-ui/2-events/03-event-delegation/article.md +++ b/2-ui/2-events/03-event-delegation/article.md @@ -1,11 +1,11 @@ # 事件委托 -捕获和冒泡允许实现一种称为**事件委托**的强大处理模式。 +捕获和冒泡允许实现一种称为**事件委托**的强大的事件处理模式。 -我们的想法是,如果我们有许多元素是以类似的方式处理的,那么我们就不需要给每个元素分配一个处理程序 —— 而是在它们共同的祖先上面添加一个处理器。 +我们的想法是,如果我们有许多元素是以类似的方式处理的,那么我们就不需要给每个元素分配一个处理器 —— 而是在它们共同的祖先上面添加一个处理器。 -在处理器中,我们得到了 `event.target`,查看事件实际发生的位置并处理它。 +在处理器中,我们可以得到 `event.target`,查看事件实际发生的位置并处理它。 我们看一个示例 —— 反映中国古代哲学的[八卦图](http://en.wikipedia.org/wiki/Ba_gua)。 @@ -30,13 +30,13 @@ HTML 如下所示:
``` -该表有 9 个单元,但可能有 99 个或者 9999 个单元,这些都不重要。 +该表有 9 个单元格,但可能有 99 个或者 9999 个单元,这些都不重要。 **我们的任务是在单击时高亮显示一个 `` 单元格。** -Instead of assign an `onclick` handler to each `` (can be many) -- we'll setup the "catch-all" handler on `` element. +相比为每个 `
` (可能有很多) 分配一个 `onclick` 处理器 —— 我们可以为 `` 元素设置一个 “catch-all” 处理器。 -它使用 `event.target` 来获取单击的元素并高亮显示它。 +它会使用 `event.target` 来获取单击的元素并高亮显示它。 代码: @@ -47,28 +47,28 @@ let selectedTd; table.onclick = function(event) { let target = event.target; // 在哪里单击的? - if (target.tagName != 'TD') return; // not on TD? Then we're not interested + if (target.tagName != 'TD') return; // 不在 TD 上?那么我们就不会在意 - highlight(target); // highlight it + highlight(target); // 高亮显示 }; */!* function highlight(td) { - if (selectedTd) { // remove the existing highlight if any + if (selectedTd) { // 移除任何已存在的高亮显示内容 selectedTd.classList.remove('highlight'); } selectedTd = td; - selectedTd.classList.add('highlight'); // highlight the new td + selectedTd.classList.add('highlight'); // 高亮新的 td } ``` -这样的代码不会关心在表中有多少单元格。随时可以动态添加/移除 `
`,高亮显示仍然有效。 +代码不会关心在表中有多少单元格。随时可以动态添加/移除 ``,高亮显示仍然有效。 尽管如此,还是存在缺点。 单击可能不是发生在 `` 上,而是发生在其内部。 -在我们的例子中,如果我们查看 HTML 内部,我们可以看到 `` 内的嵌套标记,比如 ``: +在我们的例子中,如果我们查看 HTML 内部,我们可以看到 `` 内的嵌套标签,比如 ``: ```html @@ -85,7 +85,7 @@ function highlight(td) { 在处理器 `table.onclick` 中,我们应该接受这样的 `event.target`,并确定单击是否在 `` 内。 -以下是改善的代码: +以下是改进后的代码: ```js table.onclick = function(event) { @@ -100,16 +100,16 @@ table.onclick = function(event) { ``` 解释: -1. `elem.closest(selector)` 方法返回与选择器匹配的最近的祖先。在我们的例子中,我们从源元素上升的路上查找 ``。 +1. `elem.closest(selector)` 方法返回与选择器匹配的最近的祖先。在我们的例子中,我们从源元素向上查找 ``。 2. 如果 `event.target` 不在任何 `` 中,那么调用将返回 `null`,我们不需要做任何事情。 -3. 在嵌套表的情况下,`event.target` 可能是位于当前表之外的 ``。因此我们检查这是否是**我们的表**的 ``。 +3. 在嵌套表的情况下,`event.target` 可能是位于当前表格之外的 ``。因此我们需要检查这是否是**我们的表格**的 ``。 4. 如果是的话,就高亮显示它。 ## 委托示例:标记中的操作 -事件委托可用于优化事件处理。我们使用单个处理器来对许多元素进行相似的操作。就像我们用于高亮显示 `` 一样。 +事件委托可优化事件处理。我们使用单个处理器来对许多元素进行相似的操作。就像我们用于高亮显示 `` 一样。 -但我们仍然可以使用单个处理器作为许多不同事情的入口点。 +但我们仍然可以使用单个处理器作为许多不同事件的入口点。 例如,我们想要制作一个有“保存”、“加载”、“搜索”等功能的菜单。有一个拥有 `save`、`load`、`search` 等方法的对象。 @@ -161,7 +161,7 @@ table.onclick = function(event) { ``` -请注意,`this.onClick` 在 `(*)` 中绑定到 `this`。这很重要,否则内部 `this` 将引用 DOM 元素(`elem`),而不是菜单对象,`this[action]` 不是我们所需要的。 +请注意,`this.onClick` 在 `(*)` 中绑定到了 `this`。这很重要,否则内部 `this` 将引用 DOM 元素(`elem`),而不是菜单对象,`this[action]` 不是我们所需要的。 那么,这里的委托给我们带来了什么? @@ -172,17 +172,17 @@ table.onclick = function(event) { 我们也可以使用 `.action-save`、`.action-load`,但 `data-action` 属性在语义上更好。我们也可以在 CSS 规则中使用它。 -## "behavior" 模式 +## “行为型”模式 -我们还可以使用事件委托将元素 **declaratively** 添加到具有特定属性和类的元素 "behaviors" 中。 +我们还可以使用事件委托**声明式**地通过特定属性和类为元素添加“行为”。 -模式有两部分: +模式分为两步: 1. 我们向元素添加一个特殊属性。 -2. 文档范围内的处理器跟踪事件,如果事件发生在元素属性上,则执行该操作。 +2. 用文档范围级的处理器追踪事件,如果事件发生在具有特定属性的元素上 —— 则执行该操作。 ### 计数 -例如,这里的 `data-counter` 属性添加了一个行为:给按钮添加了 “点击就会增加”" 的行为。 +例如,这里的 `data-counter` 属性给按钮添加了一个“点击增加”的行为。 ```html run autorun height=60 Counter: @@ -199,17 +199,17 @@ One more counter: ``` -如果我们点击按钮 —— 它的值就会增加。不仅仅是按钮,但一般的方法在这里却很重要。 +如果我们点击按钮 —— 它的值就会增加。但不仅仅是按钮,一般的方法在这里也很重要。 -我们想要的 `data-counter` 属性可以有很多。我们可以在任何时候向 HTML 添加新的。使用时间委托,我们可以 "extended" HTML,添加一个描述新行为的属性。 +我们可以有很多像 `data-counter` 一样的属性。我们可以在任何时候向 HTML 添加新的属性。使用事件委托,我们可以“扩展” HTML,添加一个描述新行为的属性。 -```warn header="For document-level handlers -- always `addEventListener`" +```warn header="对于文档级的处理器 —— 始终是 `addEventListener`" 当我们将事件处理器分配给 `document` 对象,我们应该始终使用 `addEventListener`,而不是 `document.onclick`,因为后者会导致冲突:新的处理器会重写旧的。 对于实际项目来说。代码的不同部分设置的 `document` 上有许多处理器是正常的。 ``` -### Toggler +### 切换器 再举一个例子,单击一个具有 `data-toggle-id` 属性的元素将显示/隐藏具有给定 `id` 的元素: @@ -242,18 +242,18 @@ One more counter: 我们也可以结合单个元素上的多个行为。 -"behavior" 模式可以替代 JavaScript 的小片段。 +“行为型”模式可以替代 JavaScript 的小片段。 ## 总结 -shijianweituoEvent 委托真的很酷!这是 DOM 事件最有用的模式之一。 +事件委托真的很酷!这是 DOM 事件最有用的模式之一。 它通常用于为许多相似的元素添加相同的处理,但不仅仅只是这样。 算法: -1. 在容器上放置一个处理程序。 -2. 在 handler 上 —— 检查源元素 `event.target`。 +1. 在容器上设置一个处理器。 +2. 在处理器中 —— 检查源元素的 `event.target`。 3. 如果事件发生在我们感兴趣的元素中,那么处理该事件。 好处: @@ -267,6 +267,6 @@ shijianweituoEvent 委托真的很酷!这是 DOM 事件最有用的模式之 委托处理方式也有局限性: ```compare -- 首先,事件必须冒泡。而有些事件不会冒泡。此外,低级别的处理程序不应该使用 `event.stopPropagation()`。 -- 其次,委托会增加 CPU 负载,因为容器等级的处理器对容器中任何位置的事件做出反应,不管他们是否会引起我们的兴趣。但是通常负载是可以忽略不计的,所以我们不考虑它。 +- 首先,事件必须冒泡。而有些事件不会冒泡。此外,低级别的处理器不应该使用 `event.stopPropagation()`。 +- 其次,委托会增加 CPU 负载,因为容器等级的处理器对容器中任何位置的事件做出反应,不管它们是否会引起我们的兴趣。但是通常负载是可以忽略不计的,所以我们不考虑它。 ``` From 16f07501729fbc044a5090bb7be5c3c714afd16d Mon Sep 17 00:00:00 2001 From: LeviDing Date: Sun, 14 Oct 2018 14:36:25 +0800 Subject: [PATCH 12/14] Update task.md --- .../03-event-delegation/1-hide-message-delegate/task.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md b/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md index a6b06614f8..f284b3ff40 100644 --- a/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md +++ b/2-ui/2-events/03-event-delegation/1-hide-message-delegate/task.md @@ -10,4 +10,4 @@ importance: 5 [iframe src="solution" height=420] -P.S. 应该只是容器上的一个事件侦听者,使用事件委托。 +P.S. 在容器上应该只有一个监听器,即使用事件委托。 From f5d3a0b7ac8a0077ac12e42a8dff8d00cbcd5689 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Sun, 14 Oct 2018 14:37:48 +0800 Subject: [PATCH 13/14] Update task.md --- 2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md b/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md index 76dbeddd0f..6f72f372f5 100644 --- a/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md +++ b/2-ui/2-events/03-event-delegation/4-behavior-tooltip/task.md @@ -22,14 +22,14 @@ importance: 5 详细资料: -- 提示工具不应超出窗口边缘。通常,它应该在元素的上方,但是如果元素位于页面顶部,并且没有提示工具的空间,则在其下面. +- 提示工具不应超出窗口边缘。通常,它应该在元素的上方,但是如果元素位于页面顶部,并且没有提示工具的空间,则在其下面。 - 提示工具由 `data-tooltip` 属性中指定。它可以是任意 HTML。 你需要两个事件: - `mouseover` 当指针出现在元素上时触发。 - `mouseout` 当指针移出元素时触发。 -请使用事件委托:在 `document` 上设置两个处理器,以跟踪带有 `data-tooltip` 的元素中所有的 “over” 和 “out”,并从那里管理提示工具。 +请使用事件委托:在 `document` 上设置两个处理器,以跟踪带有 `data-tooltip` 的元素中所有的 "over" 和 "out",并从那里管理提示工具。 在实现了该行为后,即使是不熟悉 JavaScript 的人也可以添加带注释的元素。 From addd57db8ad590b94983b85b409290ee5a50f168 Mon Sep 17 00:00:00 2001 From: LeviDing Date: Sun, 14 Oct 2018 14:41:39 +0800 Subject: [PATCH 14/14] Update article.md --- 2-ui/2-events/03-event-delegation/article.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2-ui/2-events/03-event-delegation/article.md b/2-ui/2-events/03-event-delegation/article.md index 579763e8ba..efd818cc8f 100644 --- a/2-ui/2-events/03-event-delegation/article.md +++ b/2-ui/2-events/03-event-delegation/article.md @@ -34,7 +34,7 @@ HTML 如下所示: **我们的任务是在单击时高亮显示一个 `` 单元格。** -相比为每个 `` (可能有很多) 分配一个 `onclick` 处理器 —— 我们可以为 `` 元素设置一个 “catch-all” 处理器。 +相比为每个 `
`(可能有很多)分配一个 `onclick` 处理器 —— 我们可以为 `` 元素设置一个 "catch-all" 处理器。 它会使用 `event.target` 来获取单击的元素并高亮显示它。 @@ -111,9 +111,9 @@ table.onclick = function(event) { 但我们仍然可以使用单个处理器作为许多不同事件的入口点。 -例如,我们想要制作一个有“保存”、“加载”、“搜索”等功能的菜单。有一个拥有 `save`、`load`、`search` 等方法的对象。 +例如,我们想要制作一个有“保存”、“加载”和“搜索”等功能的菜单。有一个拥有 `save`、`load` 和 `search` 等方法的对象。 -第一个想法可能是为每个按钮分配一个单独的处理器。但有一个更优雅的解决方案。我们可以为整个菜单添加一个处理器,并为有方法调用的按钮添加 `data-action`属性: +第一个想法可能是为每个按钮分配一个单独的处理器。但有一个更优雅的解决方案。我们可以为整个菜单添加一个处理器,并为有方法调用的按钮添加 `data-action` 属性: ```html @@ -253,7 +253,7 @@ One more counter: 算法: 1. 在容器上设置一个处理器。 -2. 在处理器中 —— 检查源元素的 `event.target`。 +2. 在处理器中 —— 检查源元素的 `event.target`。 3. 如果事件发生在我们感兴趣的元素中,那么处理该事件。 好处: