2010-06-23 10 views
4

Sur curiousty qui du code ci-dessous est plus efficace (si non plus, quelle serait la meilleure façon?)Quel code jQuery est le plus efficace?

Backstory - Construire un petit carrousel d'image et le code en question a à voir avec les contrôles (prev, pause/lecture, suivant)

<ul class="controls"> 
    <li> <a href="#" class="prev"> Previous Image </a> </li> 
    <li> <a href="#" class="pause"> Pause   </a> </li> 
    <li> <a href="#" class="next"> Next Image  </a> </li> 
</ul> 

// inside document.ready() 
$(".controls a").click(function() { 
    var cur_class = $(this).attr("class"); 

    if (cur_class == "pause") { 
     // do something 
    } else if (cur_class == "prev") { 
     // do something 
    } else if (cur_class == "next") { 
     // do something 
    } 
)}; 

// OR THIS 
$(".controls a.prev").click(function() { /* do something */ }); 
$(".controls a.pause").click(function() { /* do something */ }); 
$(".controls a.next").click(function() { /* do something */ }); 

Merci M.

+0

La classe sera-t-elle toujours la même à partir de la charge? Sinon, vous devrez penser à utiliser le gestionnaire live() –

+0

pas sûr si elle répond à cette question spécifique, mais le livre de cuisine jQuery O'reilly offre un bon aperçu des aspects de performance des approches différentes – STW

+2

optimisation prématurée hein – vittore

Répondre

5

La meilleure option consiste à utiliser .delegate(). C'est un nouvel événement ajouté à jQuery 1.4.2 et c'est bien mieux que d'utiliser click. .click() ajoute un nouvel événement pour chaque balise d'ancrage.

.delegate() 'attend' qu'un clic (ou un événement spécifié) soit effectué avant d'ajouter un nouvel événement (pour l'élément cliqué spécifique uniquement).

$(".controls").delegate("a", "click", function() { 

    var cur_class = $(this).attr("class"); 

    if (cur_class == "pause") { 
     // do something 
    } else if (cur_class == "prev") { 
     // do something 
    } else if (cur_class == "next") { 
     // do something 
    } 

} 

Note: le code n'a pas été testé, lisez les informations .delegate() dans la documentation jQuery pour plus d'informations.

Peut-être que vous devez ajouter un identifiant à la <ul>:

(<ul class="controls" id="ul_id">), puis utiliser $("#ul_id").delegate("a", "click", function() {/... }.

Espérons que ça aide.

+0

le code non testé, boo –

+1

C'est l'homme jQuery de base ... – Jonathan

+0

@Matt: Je pense qu'il est temps d'accepter une réponse :) – Jonathan

2

Je pense que ce qui suit est le moyen le plus rapide. Il ne récupèrera que DOM nodeList une fois les filtres au lieu d'aller chercher trois fois

$('.controls a') 
.filter('.prev') 
.click(function(){/*...*/}) 
.end() 
.filter('.pause') 
.click(function(){/*...*/}) 
.end() 
.filter('.next') 
.click(function(){/*...*/}); 
+0

Est-ce vraiment plus rapide que de simplement faire $ (". Controls a.prev")? – Matt

+1

Je pense que c'est. Il récupère une nodelist DOM une seule fois et la filtre au lieu de la récupérer trois fois. –

+0

Je pense que .delegate() a été fait pour ce problème spécifique donc c'est probablement plus efficace que .filter() – Jonathan

4

Presque pas de différence. Comme votre bâtiment carrousel le grand goulot d'étranglement sera les images que vous chargez.

+0

Je comprends cela, mais j'étais toujours curieux de savoir quelle technique utiliser jQuery est la plus (la plus?) Efficace. Je n'ai pas de goulots d'étranglement ou de problèmes de chargement ou quoi que ce soit de ce genre, juste une question d'efficacité, en particulier pour l'utilisation future de jQuery. – Matt

+1

quand les gens apprendront "le plus efficace" ne veut rien dire. "le plus efficace" quoi, espace, temps, beignets, singes? C'est javascript, si vous voulez dire "efficace" comme dans le plus rapide, puis faites le travail, le profil si vous-même et ne comptez pas sur les gens qui pensent que quelque chose est une chose ou une autre. Ensuite, vous devez tester tous les interprètes javascript dans tous les navigateurs pour savoir que ce que vous "pensez" que vous avez découvert n'est pas applicable dans tous les environnements. –

+0

@ sucette lubrique, chillax bro. Parfois, les gens consultent les autres, parce que vous savez, d'autres personnes peuvent avoir de la sagesse à transmettre. Apprendre des autres! = Paresse. – Mark

Questions connexes