当使用大量选择器时,jQuery的性能会有多大程度的下降,还是会下降?
当链接的href指向具有特定扩展名的文件时,我想对页面上的所有链接应用单击事件。适用扩展的列表大约在30个左右,将来可能会有所增长,但永远不会超过100个 我的第一个倾向是这样构造事件绑定:当使用大量选择器时,jQuery的性能会有多大程度的下降,还是会下降?,jquery,performance,css-selectors,file-extension,Jquery,Performance,Css Selectors,File Extension,当链接的href指向具有特定扩展名的文件时,我想对页面上的所有链接应用单击事件。适用扩展的列表大约在30个左右,将来可能会有所增长,但永远不会超过100个 我的第一个倾向是这样构造事件绑定: $("a[href$=avi], a[href$=ppt], a[href$=rtf], // ...snip a bunch more of these.... a[href$=pdf], a[href$=xml]").click(function() { // D
$("a[href$=avi],
a[href$=ppt],
a[href$=rtf],
// ...snip a bunch more of these....
a[href$=pdf],
a[href$=xml]").click(function() {
// Do something
});
这疯了吗?我会选择所有链接,然后在单击功能中对其进行过滤,例如:
$('a').click(function() {
var ext = /[^.]+$/.exec($(this).attr('href'));
switch(ext) {
case 'avi':
case 'ppt':
...
case 'xml':
// Do something
break;
}
});
节省了大量的遍历,而且更漂亮
这种方法的缺点是jQuery可能独立处理每个选择器,因此在完成对第一个选择器的搜索后,它会完全忘记找到的其他选择器,并再次搜索整个文档以查找下一个选择器。使用这种方法,jQuery只需搜索一次所有链接,并且在函数中使用switch case可能非常快,您不必为性能问题而烦恼。我将给您一个提示-几乎是明确的。我就这样做了,非常痛苦。我尝试了另一种方法,将每个选择器的结果存储在一个数组中,然后执行$array.click要快得多,尤其是在IE6/P3 900 mHz中
也就是说,您应该对应用程序进行基准测试并找到最快的方法。找一台使用IE6的旧电脑,或者找一台使用IE6的虚拟机,并测试其中的计时。选择器调优和查看哪些是慢的,以及如何避免调用它们,是javascript优化的第一步>我会考虑使用一个筛选函数而不是一组选择器:
$('a').filter( function() {
return $(this).attr('href').match( /(avi|ppt|...|xml)$/ ) != null;
})
.click( function() {
// do something
});
不过,这会向所有链接添加一个单击处理程序。只是它不会做任何事情,除非href匹配。只将处理程序应用于匹配链接的解决方案会更好。请参见我的筛选器示例。@tvanfosson:这个方法执行一些不必要的绑定是对的,但在您的方法中,jQuery仍然需要执行一些额外的解析和遍历,这总是比开关慢。因此,就性能而言,这种方法更好。