类上的Javascript事件处理程序-它们的效率如何?

类上的Javascript事件处理程序-它们的效率如何?,javascript,class,event-handling,Javascript,Class,Event Handling,在AJAX创建给定类时,我常常为该类的每个元素分配一个单独的事件处理程序,如下所示: $('#newId')。在('click',函数(e){… 我已更改为类有一个适用于所有元素的处理程序,如下所示: $('#container')。在('click','.myClass',函数(e){… 我一直在想,当处理程序被触发时,它到底是如何工作的,以及性能影响可能是什么 元素到底是如何找到类处理程序的?这比每个元素有一个处理程序慢吗?类是否真的只有一个事件处理程序,或者类中的每个元素都会以某种方式重新

在AJAX创建给定类时,我常常为该类的每个元素分配一个单独的事件处理程序,如下所示:

$('#newId')。在('click',函数(e){…

我已更改为类有一个适用于所有元素的处理程序,如下所示:

$('#container')。在('click','.myClass',函数(e){…

我一直在想,当处理程序被触发时,它到底是如何工作的,以及性能影响可能是什么


元素到底是如何找到类处理程序的?这比每个元素有一个处理程序慢吗?类是否真的只有一个事件处理程序,或者类中的每个元素都会以某种方式重新生成事件处理程序?

如注释中所述,每种方法都有优点和缺点

当容器中有子元素时,事件委派通常是很好的。想象一下一个带有编辑/删除按钮的大型无序列表。单击删除按钮时,您很可能会删除它的父li。如果没有事件委派,您将负责解除绑定在这些元素上的任何事件处理程序的绑定

事件委派使用DOM的事件冒泡属性。当在#容器的子容器上触发click事件时,该事件将在节点树上冒泡,搜索事件的处理程序。然后测试事件目标以查看它是否匹配选择器。如果匹配,则调用绑定的click处理程序。如果没有jQuery,则他的脸看起来像

function myclass_click_handler() {
    // an element with myClass has been called
}

document.getElementById('container').addEventListener('click', function(e) {
    if (e.target.className.indexOf('myClass') > -1) {
        myclass_click_handler();
    }
});
事件委派的缺点之一是它不适用于所有事件。从性能角度来看,它实际上可以提高性能,因为内存泄漏的可能性较小

将回调直接分配给基于类的元素时,每个元素都将获得对回调函数的引用。如果需要删除任意数量的元素,则需要解除这些元素的事件处理程序的绑定。当您使用remove()方法删除绑定的事件处理程序时,jQuery会提供帮助


希望这有帮助!

正如评论中提到的,每种方法都有优点和缺点

当容器中有子元素时,事件委派通常是很好的。想象一下一个带有编辑/删除按钮的大型无序列表。单击删除按钮时,您很可能会删除它的父li。如果没有事件委派,您将负责解除绑定在这些元素上的任何事件处理程序的绑定

事件委派使用DOM的事件冒泡属性。当在#容器的子容器上触发click事件时,该事件将在节点树上冒泡,搜索事件的处理程序。然后测试事件目标以查看它是否匹配选择器。如果匹配,则调用绑定的click处理程序。如果没有jQuery,则他的脸看起来像

function myclass_click_handler() {
    // an element with myClass has been called
}

document.getElementById('container').addEventListener('click', function(e) {
    if (e.target.className.indexOf('myClass') > -1) {
        myclass_click_handler();
    }
});
事件委派的缺点之一是它不适用于所有事件。从性能角度来看,它实际上可以提高性能,因为内存泄漏的可能性较小

将回调直接分配给基于类的元素时,每个元素都将获得对回调函数的引用。如果需要删除任意数量的元素,则需要解除这些元素的事件处理程序的绑定。当您使用remove()方法删除绑定的事件处理程序时,jQuery会提供帮助


希望这能有所帮助!

每种方法都有优点和缺点。大多数都是次要的。要理解第二个版本,请对事件委派进行一些研究。这是一个需要理解的重要概念。好的,我同意:)谢谢。如果您需要性能基准,可以在JSPerf上试用。每种方法都有优点和缺点。大多数都是次要的。要了解第二个版本,请研究一下事件委派。这是一个需要了解的重要概念。好的,我正在研究:)谢谢。如果您需要性能基准,可以在JSPerf上试用。谢谢,Chris。非常有用:)谢谢,Chris。非常有用:)