当链接的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
});这是不是很疯狂?
发布于 2009-12-04 04:06:10
我会选择所有链接,然后在click函数中对其进行过滤,例如:
$('a').click(function() {
var ext = /[^.]+$/.exec($(this).attr('href'));
switch(ext) {
case 'avi':
case 'ppt':
...
case 'xml':
// Do something
break;
}
});节省了大量的遍历,而且更漂亮。
这种方法的缺点是,jQuery可能会独立地处理每个选择器,因此在完成对第一个选择器的搜索之后,它会完全忘记它还找到了什么,并再次在整个文档中搜索下一个选择器。使用这种方法,jQuery只需搜索所有链接一次,并且在函数中使用switch-case可能非常快,您不必为性能问题而烦恼。
发布于 2009-12-04 04:11:22
我会给你一个提示--几乎是肯定的。我做了这样的事情,非常痛苦。我尝试了另一种方法,将每个选择器的结果存储在一个数组中,然后执行$(数组).click()要快得多(特别是在IE6/P3900 mHz中)。
也就是说,您应该对进行基准测试,并为您的应用程序找到最快的方法。找一台安装了IE6的破旧电脑,或者买一台安装了IE6的VM,并在其中测试计时。选择器调优(看看哪些比较慢,以及如何避免调用它们)是我进行javascript优化的第一站。
发布于 2009-12-04 04:19:03
我会考虑使用一个过滤函数,而不是一组选择器:
$('a').filter( function() {
return $(this).attr('href').match( /(avi|ppt|...|xml)$/ ) != null;
})
.click( function() {
// do something
});https://stackoverflow.com/questions/1842519
复制相似问题