0

当该链接的 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
 });

这是疯了吗?

4

3 回答 3

6

我会选择所有链接,然后在 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-03T20:06:10.360 回答
3

我会给你一个提示——几乎是肯定的。我做了这样的事情,非常痛苦。我尝试了另一种方法,将每个选择器的结果存储在一个数组中,然后执行 $(array).click() 更快(尤其是在 IE6/P3 900 mHz 中)

也就是说,您应该为您的应用程序进行基准测试并找到最快的方法 找一台 IE6 的破旧电脑,或者找一台 IE6 的虚拟机,然后测试其中的时间。选择器调优(看看哪些很慢以及如何避免调用它们)是我进行 javascript 优化的第一站。

于 2009-12-03T20:11:21.940 回答
2

我会考虑使用过滤器功能而不是一组选择器:

$('a').filter( function() {
           return $(this).attr('href').match( /(avi|ppt|...|xml)$/ ) != null;
       })
      .click( function() {
           // do something
       });
于 2009-12-03T20:19:03.397 回答