- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
谁能解释一下 JavaScript 中的事件委托(delegate)以及它有什么用处?
最佳答案
DOM 事件委托(delegate)是一种通过事件“冒泡”(也称为事件传播)的魔力,通过单个公共(public)父级而不是每个子级响应 ui 事件的机制。
当元素上触发事件时,the following occurs :
The event is dispatched to its target
EventTarget
and any event listeners found there are triggered. Bubbling events will then trigger any additional event listeners found by following theEventTarget
's parent chain upward, checking for any event listeners registered on each successive EventTarget. This upward propagation will continue up to and including theDocument
.
事件冒泡为浏览器中的事件委托(delegate)提供了基础。现在您可以将事件处理程序绑定(bind)到单个父元素,并且只要事件发生在其任何子节点上(以及它们的任何子节点),该处理程序就会被执行。 这是事件委托(delegate)。这是一个实践示例:
<ul onclick="alert(event.type + '!')">
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
在该示例中,如果您要单击任何子 <li>
节点,您将看到 "click!"
的警报,即使没有绑定(bind)到 <li>
的点击处理程序你点击了。如果我们绑定(bind) onclick="..."
给每个<li>
你会得到同样的效果。
那么有什么好处呢?
假设您现在需要动态添加新的 <li>
通过 DOM 操作将项目添加到上述列表中:
var newLi = document.createElement('li');
newLi.innerHTML = 'Four';
myUL.appendChild(newLi);
如果没有使用事件委托(delegate),您将不得不“重新绑定(bind)”"onclick"
新的 <li>
的事件处理程序元素,以便它的行为与其 sibling 相同。 使用事件委托(delegate),您不需要做任何事情。只需添加新的 <li>
到列表中,你就完成了。
这对于具有绑定(bind)到许多元素的事件处理程序的 Web 应用程序来说绝对很棒,其中新元素在 DOM 中动态创建和/或删除。通过事件委托(delegate),事件绑定(bind)的数量可以通过将它们移动到一个公共(public)的父元素来大幅减少,并且动态创建新元素的代码可以与绑定(bind)其事件处理程序的逻辑分离。
事件委托(delegate)的另一个好处是事件监听器使用的总内存占用减少了(因为事件绑定(bind)的数量减少了)。对于经常卸载的小页面(即用户经常导航到不同的页面),它可能没有太大的区别。但对于长期存在的应用程序来说,它可能很重要。当从 DOM 中删除的元素仍然占用内存(即它们泄漏)时,有一些非常难以追踪的情况,并且这种泄漏的内存通常与事件绑定(bind)相关联。使用事件委托(delegate),您可以自由地销毁子元素,而不会忘记“解除绑定(bind)”它们的事件监听器(因为监听器在祖先上)。然后可以控制这些类型的内存泄漏(如果不消除,有时很难做到。IE 我在看着你)。
下面是一些更好的事件委托(delegate)的具体代码示例:
focus
and blur
events 发现了有趣的 PPK 方法(这不会冒泡)关于javascript - 什么是 DOM 事件委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1687296/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 6 年前。 Improve
Polymer的light DOM和local DOM有什么区别?来自文档(1): The DOM that an element creates and manages is called its
当内容添加到网页时,我需要触发一个 Action 。更新可能具有不同的性质(例如 AJAX、延迟脚本、用户操作)并且不受我的控制。 我想使用 DOM 突变事件,但它们并非在所有浏览器中都可用。是否有为
我刚遇到一个有趣的情况,我有一个提交 放置在 内的 native 自定义元素的 Shadow DOM 内. Select #shadow-root ...
假设有一个滚动列表,当我插入一些新的 DOM 附加到当前 dom 时,它工作正常。上拉 但是如果我之前插入一些新的 DOM,新的 DOM 将在视口(viewport)中,而旧的 DOM 将被下推。下拉
在我的项目中实现 Shadow DOM 是否会使它们像 React 使用的虚拟 DOM 一样更快? 最佳答案 它们是不同用途的不同事物,因此比较性能没有意义。 虚拟 DOM 虚拟 DOM 旨在避免对
在我的页面内容上,我将多张卡片组织成网格 __________________ | ____ ____ | | | | | | | | | | | |
是否可以在浏览器中看到(调试)从 DOM 元素触发的自定义事件? 假设我想查看 Bootstrap Collapse 的哪个特定元素触发了 show.bs.collapse event ,我能以某种方
我正在生成用于客户端的 XPaths 服务器端,我很困惑为什么在 DOM 中找不到表路径(即 td 中的内容)。 事实证明,现代浏览器(至少是 Chrome 和 Firefox)插入了 tbody在文
是否可以检索文本节点的几何位置(即从父元素、页面等的顶部/左侧偏移量)? 最佳答案 不是直接的。 TextNode 没有用于测量视口(viewport)定位的原始 IE 偏移*(和类似的)扩展。 仅在
以下语句中的 DOM 元素的含义是什么? Statement #1 You can add multiple classes to a single DOM element. Statement #2
有没有办法让 firebug(或任何其他浏览器,或使用任何其他工具)阻止任何 dom 操作的发生?有时布局调试充满悬停事件的屏幕是不可能的,因为元素可能会消失,并且您看不到它们的复合布局。 最佳答案
我需要在html文档中搜索 text here 然后输出完整的节点路径(CSS或XPATH) 例如 html > body > div class ="something" > table > tr
这是我的一个页面的典型加载时间如何拆分为:- Domain Lookup 0 0 % Connect 134 .3% Request
我的 .on() 工作时遇到一些问题。我的网站是here . 如果你看看 www.eliteweb-creation.co.uk/dev/js/nav.js,我正在 mouseenter 和 mous
我是 Javascript 的新手,负责将我们产品的 UI 从 YUI2 迁移到 YUI3。看起来哪里都没有迁移指南,所以我现在正在浏览互联网帖子和 yui 文档。 在我的全局范围内,我临时添加了类似
我想和实习生一起测试一些 DOM 相关的东西,不需要特定的固定装置,只是一般的 DOM 东西,比如我改变了 Element.prototype。这是否需要通过本地 Selenium 服务器(或 sau
我是 HTML 和 HTML5 的初学者。 当我阅读以下内容时 link ,我找到了术语 DOM 和 DOM API。我通读了维基百科,但无法理解其背后的全部思想。 谁能给我解释一下: 文档对象模型
我有两个主要问题。 Object 之类的扩展是否算数? 什么是 DOM 包装? http://perfectionkills.com/whats-wrong-with-extending-the-do
对不起查询,原型(prototype),雅虎 YUI,道场在考虑小的时候不吸引我。我想要一个模块化的库,代码尽可能小,最多 20Kb [un compressed] 是我所期望的。应该提供 Dom 操
我是一名优秀的程序员,十分优秀!