2010-10-26 74 views
0

这比其他运行速度快。但我不知道它会在慢电脑有多快.. 代码过滤动态结果。该标准设置为CSS类。提高这个jQuery脚本的性能

$(document).ready(function() 
{ 


    $("#filters a").click(function(event) 
    { 
     event.preventDefault(); 
     event.stopPropagation(); 
     if($(this).hasClass("checked")) 
     { 
      $(this).removeClass("checked"); 
     } 
     else if(!$(this).hasClass("disabled")) 
     { 
      $(this).addClass("checked"); 
     } 
     else 
      { 
       return false; 
      } 


     var results=$("#products li"); 
     results.hide(); 
     $("#filters li.filtersGroup a").removeClass("disabled"); 
     $("#filters li.filtersGroup").each(function(index) { 
      var classes=""; 

      $(this).find("a.checked").each(function(index) { 
       classes=classes+ "." + $(this).attr("id") +","; 
      }); 
      if(classes=="") return true; 

      results=results.filter(classes.substr(0,classes.length-1)); 
//periorismos 
       $("#filters li.filtersGroup").not($(this)).each(function (index){ 
        $(this).find("a").each(function(index) { 


       if(results.filter("." + $(this).attr("id")).length<=0) { 
         $(this).removeClass("checked").addClass("disabled"); 
        } 

      }); 



     }); 
    }); 
    results.show(); 



}) 
}); 

任何想法如何改善它?还我能做些什么有关的preventDefault(itsnot触发如果整个文档的心不是装的,因为这可能是impacient人的问题..

+3

所以它运行很好,你没有问题吗?..没有在这里看到,然后。 – Fosco 2010-10-26 18:55:18

+0

只有在特殊情况下才会想到的东西。你可以更详细地了解一些选择器,以便DOM检查不会太重吗? – brumScouse 2010-10-26 18:56:26

+0

我不会在另一个'each'内运行'each'函数,但除此之外,我需要查看一些HTML以获得更好的想法。 – Mottie 2010-10-26 19:01:41

回答

4

有一两件事我注意到的是你做不必要的调用的很多$()

if($(this).hasClass("checked")) 
    { 
     $(this).removeClass("checked"); 
    } 
    else if(!$(this).hasClass("disabled")) 
    { 
     $(this).addClass("checked"); 
    } 
    else 
    { 
     return false; 
    } 

你做$(this)每一次,有多个底层函数调用,涉及一对夫妇的存储器分配中它是完全unnecssary只是做:

var $this = $(this); 

...开头,然后:

if($this.hasClass("checked")) 
    { 
     $this.removeClass("checked"); 
    } 
    else if(!$this.hasClass("disabled")) 
    { 
     $this.addClass("checked"); 
    } 
    else 
    { 
     return false; 
    } 

这(没有双关语)适用于你打电话$()任何时候,不要只是$(this),但你必须确保你只缓存结果,只要因为它实际上将保持不变(因为这取决于您传入的选择器或元素)。例如,如果不仔细阅读精细齿梳,至少可以将$("#filters li.filtersGroup")的结果缓存到至少一个位置,而不是让jQuery重新完成整个过程。

+0

谢谢,我会试试:) – GorillaApe 2010-10-27 08:25:04

1

继T.J.克罗德的回应

您还可以将引用收拾到$("#filters li.filterGroup")这样

var $filtersGroup = $("#filters li.filtersGroup"); 
$("a", $filtersGroup).removeClass("disabled"); 
$filtersGroup.each(function(index) { 
    ..... 
)} 
+0

谢谢,希望它变得更快 – GorillaApe 2010-10-27 08:25:25