2010-12-15 115 views
15

J'utilise jQuery depuis longtemps et j'ai écrit un plugin de diaporama pour mon travail et je (pas 100% consciemment) écrit probablement 75% dans une seule chaîne. Il est entièrement commenté et je spécifie chaque end() et ce qu'il réinitialise à, etc, mais est-ce ralentir jQuery ou le chargement DOM, ou, est-ce que cela accélère réellement?Les longues chaînes jQuery sont-elles mauvaises?

+1

taggés ce '[performances]' aussi bien, puisque c'est préoccupation principale, il semble :) –

Répondre

7

Cela dépend de votre code spécifique, comme toujours. Quant à stocker une référence vs .end(), ben ... avec une très longue chaîne, c'est plus rapide de ne pas enchaîner vs .end() appels, tout simplement parce que vous devez gérer les extra baggage (storage/restoring), comme la référence .prevObject, la .selector, .context, etc. que vous probablement ne se soucient pas dans de nombreux cas .... et juste plus de références entrelacées aux objets précédents. Où il est plus coûteux de mesurer ... ce n'est pas l'exécution (bien que cela soit plus lent, même si infinitésimal) ... c'est la collecte des ordures plus compliquée pour nettoyer tous ces objets plus tard, puisque le graphe de dépendance est maintenant beaucoup plus grand.

Maintenant ... fera-t-il une différence mesurable? pas à moins que votre chaîne ne soit vraiment longue, dans ce cas probablement une micro-optimisation dont vous n'avez pas à vous inquiéter dans la plupart des cas.

99% du temps, à moins que vous ne fassiez une performance accablante pénalisante appel, ne vous inquiétez pas à ce sujet, comme avec la plupart des micro-optimisations. Si vous avez un problème avec la performance, alors entrez dedans.

+1

+1, pour les bons conseils sur l'utilisation de '.end()' –

+1

+1 Pour le point concernant la taille du graphe de dépendance. – Orbling

+0

Merci! Bon à savoir. Je fais de la mise en cache, etc, mais pour cela il n'y a pas beaucoup de sélecteurs et le code a juste coulé bien enchaîné, donc je suis allé avec ça alors j'ai pensé ... euh oh ... cela pourrait ralentir les choses. –

2

Mon deviner ne serait pas une différence, ou plus rapide, en raison du manque d'intermédiaires.

Le seul inconvénient majeur est à la clarté, si vous pensez via les commentaires qu'il est évident sans le faire multi-ligne avec des variables intermédiaires, via des commentaires ou juste une chaîne d'appel bien propre puis bien.

6

Une des choses les plus chères que vous pouvez faire dans un navigateur moderne est d'accéder et de manipuler le DOM. Le chaînage vous permet de minimiser les recherches réelles que vous avez à faire, ce qui peut signifier un code beaucoup plus rapide. L'autre option consiste à effectuer la recherche initiale, à la stocker dans une variable et à tout faire en dehors de cette variable. Cela étant dit, jquery a été spécialement conçu avec cette api chaining à l'esprit, il est donc plus idiomatique de la chaîne.

4

Je pense que l'enchaînement de jQuery est une fonctionnalité intéressante ... on devrait vraiment l'utiliser plus souvent. par exemple:

$(this) 
    .find('.funky') 
    .css('width', 30) 
    .attr('title', 'Funky Title') 
.end() 
.fadeIn(); 

est beaucoup mieux (et élégant) - ne pas créer 2 objets jQuery $(this) que:

$(this).find('.funky').css('width', 30).attr('title', 'Funky Title'); 
$(this).fadeIn(); 
+0

Vous n'avez pas besoin de créer deux jQuery '$ (this)' ... 'var obj = $ (this) .find ('. Funky'). Css ('width', 30) .attr ('title' , 'Titre génial'); obj.fadeIn(); ' – Matt

+0

bien sûr si vous le stockez dans une variable - mais ce n'est pas ce que la plupart des utilisateurs jQuery ont tendance à écrire dans mon expérience, ils" abusent "juste $(). c'est pourquoi je trouve que l'enchaînement est élégant - on peut rester bon marché sur les variables :). d'ailleurs vous êtes smt différent du mien ... (fading '$ (this) .find ('. funky')' au lieu de '$ (this)') – kares

+0

@Matt - cela n'aura pas le même effet , votre variable 'obj' se réfère à des éléments' .find', pas 'this' :) –