Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当使用大量选择器时,jQuery的性能会有多大程度的下降,还是会下降?_Jquery_Performance_Css Selectors_File Extension - Fatal编程技术网

当使用大量选择器时,jQuery的性能会有多大程度的下降,还是会下降?

当使用大量选择器时,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

当链接的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() {
      // 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仍然需要执行一些额外的解析和遍历,这总是比开关慢。因此,就性能而言,这种方法更好。