2010-10-26 8 views
0

Cela fonctionne vite par rapport à d'autres. Mais je ne sais pas à quelle vitesse il serait sur les ordinateurs lents .. Le code filtre les résultats dymanically. Les critères sont définis dans la classe css ..Améliorer les performances de ce script 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(); 



}) 
}); 

Des idées pour l'améliorer? Aussi Que puis-je faire preventDefault (itsnot en considération si le isnt tout document chargé, car cela peut être un problème pour les personnes impacient ..

+3

il fonctionne très bien et vous n'avez pas un problème? .. rien à voir ici, alors. – Fosco

+0

Seule chose qui vient à l'esprit si la spécificité. Pouvez-vous être plus précis sur certains des sélecteurs pour que l'inspection DOM ne soit pas trop lourde? – brumScouse

+0

Je n'exécuterais pas une fonction 'each' dans un' autre '' mais j'aurais besoin de voir du HTML pour avoir une meilleure idée. – Mottie

Répondre

4

Une chose que je remarque est que vous faites un beaucoup d'appels inutiles à $() :.

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

Chaque fois que vous faites $(this), il y a plusieurs appels de fonctions sous-jacentes et quelques allocations de mémoire en jeu, il est tout à fait unnecssary Il suffit de faire:.

var $this = $(this); 

... au début, puis:

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

Ce (sans jeu de mots) applique à chaque fois que vous appelez $(), non seulement $(this), mais vous devez être sûr que vous ne cache le résultat aussi longtemps comme il sera vraiment inchangé (car cela varie en fonction du sélecteur ou de l'élément que vous passez). Sans passer en revue avec un peigne à dents fines, par exemple, vous pouvez probablement mettre en cache le résultat de $("#filters li.filtersGroup") dans au moins un endroit plutôt que de faire de nouveau jQuery.

+0

merci je vais essayer :) – GorillaApe

1

Dans T.J. Réponse de Crowder

Vous pouvez également nettoyer vos références à $("#filters li.filterGroup") comme celui-ci

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

merci, j'espère que cela devient plus rapide – GorillaApe

Questions connexes