当该链接的href指向具有特定扩展名的文件时,我想将click()事件应用于页面上的所有链接。适用扩展名列表徘徊在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() {
// Do something
});
这是疯了吗?
答案 0 :(得分:6)
我会选择所有链接,然后在点击功能中对其进行过滤,例如:
$('a').click(function() {
var ext = /[^.]+$/.exec($(this).attr('href'));
switch(ext) {
case 'avi':
case 'ppt':
...
case 'xml':
// Do something
break;
}
});
节省了大量的遍历,也更漂亮。
你的方法的坏处是jQuery可能独立处理你的每个选择器,所以在它完成搜索第一个选择器后,它会完全忘记它找到的其他内容,并再次搜索整个文档以寻找下一个选择器。使用这种方法,jQuery只需搜索一次所有链接,并且在函数内使用switch-case可能是如此之快,您不必为性能问题而烦恼。
答案 1 :(得分:3)
我会给你一个暗示 - 几乎是绝对的。我做了这样的事情,非常痛苦。我尝试了另一种方法,将每个选择器的结果存储在一个数组中然后执行$(array).click()要快得多(特别是在IE6 / P3 900 mHz中)
那就是说,你应该基准并找到适用于你的应用程序的最快方式。用IE6查找旧的糟糕计算机,或者用IE6获取虚拟机,然后测试时机。选择器调整(并查看哪些是慢的以及我如何避免调用它们)是我优化javascript的第一站。
答案 2 :(得分:2)
我会考虑使用过滤器功能而不是一组选择器:
$('a').filter( function() {
return $(this).attr('href').match( /(avi|ppt|...|xml)$/ ) != null;
})
.click( function() {
// do something
});