
Back to basics是一系列的小帖子,我在其中解释了我在项目中一直使用的基本的、无依赖的web技术。这些都不是什么启示,但是这些年来帮助我建立了牢固的,容易维护的项目。
在构建web接口时,我最喜欢的一个技巧是事件委托
事件不仅仅发生在应用它们的元素上。相反,它们沿着DOM树一直到事件,然后再返回。事件生命周期的这些阶段称为事件冒泡和事件捕获。
这样做的实际结果是,您不需要对文档中的每个元素应用事件处理程序。相反,通常父元素上的一个处理程序就足够了。在很久以前,这是非常重要的,因为老的浏览器经常有与事件处理有关的内存泄漏。
假设你有一个链接列表,而不是遵循这些链接,你想做一些代码时,用户点击他们:
这是可行的,但有两个问题:
1. 当列表的内容发生更改时,您需要重新索引该列表(如再次调用assignhandlers())
2. 您只对被单击的链接作出反应,如果您还想在单击列表项时执行某些操作,则需要分配更多的处理程序。
你可以试着在这个例子中点击“切换更多的狗”按钮。它向列表中添加更多项目,当您单击它们时,什么也不会发生。
您可以尝试这里的事件委托示例,代码可以在GitHub (event- delegate .html)上找到。如果你现在点击“切换更多的狗”按钮,并点击任何小狗的链接,你会看到它仍然工作。
您可以做一些事情来确定单击事件发生在哪个元素上。这里最重要的部分是“let t = e.target;”行,它存储了当前由事件捕获/冒泡循环报告的元素。如果我想对一个链接做出反应,我将检查目标上是否存在一个“href”。如果我想对列表项做出反应,我将' nodeName '与' LI '进行比较。注意,如果进行这种检查,节点名总是大写的。
我真的很喜欢事件委托,因为它给了我更多的灵活性,而且我不必担心内容的变化。处理者只是躺在那里等待,直到需要它。
