哪个更快,.on()或.click()?
如果我有一个表格,其中包含删除记录的链接,这是连接点击事件的最佳方式? 引擎盖下的这些评估相同吗?
$("#table").on("click", ".delete", function(){ //do stuff });
要么
$("#table .delete").click(function(){ //do stuff });
不,他们没有。
在你使用它们的方式……
.on()
你使用它(委托)的方式 ,将节省你在附件和内存的周期,因为它实际上并没有在那一刻附加事件,因为它提供了一个应用事件的动态元素未来的元素。
.click()
将在执行时保存周期,因为它在那个时刻明确地将事件附加到每个匹配的元素,但实际上,这将是我寻找瓶颈的最后一个地方。
在这里阅读一些事件授权测试……
附加事件处理程序的性能测试……
这就像在C#
询问更快的int
或string
。 每种类型都有它的用途……
这不是关于哪个更快,而是关于什么时候使用。
允许您将事件附加到动态添加的元素,而click
则不允许。
如果您没有“动态添加元素”,请单击,否则使用on
。
click
更快,因为它直接将事件附加到元素上,其中on
将事件附加到#table
并查找.delete
元素以触发事件,因此在触发click
事件之前涉及一些代码执行。
虽然你不会看到任何差异,但差异可以忽略不计。
如果你只使用一个事件处理程序就足以处理.delete
的任何数量的.delete
元素,因为click
将附加到每个.delete
元素,以便on
内存利用率方面更好。
在这种特殊情况下, .click(...)
将(可能)较慢,因为它需要遍历每一行和每个与选择器匹配的单元格,并将处理函数附加到每一个。 在这种特殊情况下, on(...)
可能更快,因为它将处理程序附加到表,而不是附加到具有.delete
类的每个元素。
话虽这么说,在这两者之间进行选择时需要考虑一些事项:
- 你的选择器有多复杂? 如果你正在做
$('#rootItem').on('click', '.foo .bar.baz .bum', function() { /* do stuff*/ })
,这本身就会慢于$('#rootItem').on('click', '.foo', function() { /* do stuff*/ })
因为选择器在前一种情况下更复杂。 在这种情况下,为附件付出代价可能更有意义,并使用click(...)
来节省评估#rootItem
每次点击的运行时成本,看它是否与选择器'.foo .bar.baz .bum'
匹配'.foo .bar.baz .bum'
。 像你这样的简单单一类选择器('.delete'
)会表现得很好。 - 内容会动态变化吗? 如果是这样,您将负责在每个动态添加的项目上调用
click(...)
。 只要你的“外部”选择器(在这种情况下为'#table'
)不指向将动态添加的元素,on(...)
函数就可以更好地处理这个问题。 将'#table'
替换为'.table'
,并动态添加一个带有类table
的新table
,新添加的表将从初始调用on(...)
时不会附加事件处理程序。