使用大量选择器时jQuery性能有多糟糕,或者是这样?

时间:2009-12-03 20:01:44

标签: jquery performance css-selectors file-extension

当该链接的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
 });
这是疯了吗?

3 个答案:

答案 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
       });