35 votes

La façon la plus appropriée d'obtenir ceci : $($(".answer")[0])

Supposons que je veuille obtenir le premier élément parmi tous les éléments de la classe ".answer".

$($(".answer")[0])

Je peux faire ce qui précède, mais quel est le meilleur équilibre entre élégance et rapidité ?

*changer la question pour refléter la discussion actuelle

0 votes

D'après ma propre expérience, j'ai constaté que .first peut être vraiment inefficace dans IE et que $($(foo)[0]) était significativement plus rapide. Cela n'a d'importance que pour le code critique (pensez à .each sur les grands ensembles)

1 votes

Votre version, bien que peu élégante, semble être de loin la plus efficace.

9 votes

C'est drôle de voir comment une question sur l'élégance s'est transformée en évaluation des performances.

73voto

Yahel Points 21516

Je ne peux pas parler de l'aspect élégance, mais l'aspect performance peut faire une énorme différence.

On dirait, à partir d'un ensemble de tests JavaScript que votre méthode originale est en fait la le plus efficace, et contrairement à l'hypothèse à laquelle la réponse acceptée fait référence, les sélecteurs Sizzle non-CSS tendent à être mucho moins efficaces que les sélecteurs de méthodes. Il y a une raison à cela. Le site $('.answer') peut utiliser le navigateur natif getElementsByClass() sans avoir à parcourir manuellement les résultats. Le site :first complique les choses. Dans ce cas, l'utilisation des sélecteurs de grésillement semble ralentir la sélection par un facteur de 4 à 5.

Je dirais qu'avec jQuery, les performances doivent l'emporter sur l'élégance, et tout semble indiquer (tous les navigateurs que j'ai testés jusqu'à présent !) que la solution inélégante de l'OP est la plus rapide, et de loin.

Voici les résultats des navigateurs ayant fait l'objet du plus grand nombre de tests :

enter image description here

(Les chiffres sont des "opérations par seconde", donc les chiffres les plus élevés sont plus rapides, les chiffres les plus bas sont plus lents).

0 votes

Une autre suite de tests montre des résultats similaires : jsperf.com/jquery-select-first

4 votes

Je pense qu'il serait bénéfique d'effectuer également des tests sur des arbres documentaires plus complexes.

4 votes

Par curiosité, pourquoi dites-vous qu'avec jQuery, les performances l'emportent sur l'élégance ? Je dirais plutôt le contraire, surtout si l'utilisateur ne peut pas faire la différence.

57voto

Phrogz Points 112337

Les produits suivants sont tous équivalents en termes de fonctionnalité (mais pas de vitesse) :

Lequel est le meilleur ?
Il a fait l'objet d'une hypothèse que les versions du sélecteur devrait être plus rapide que les versions de la méthode (et la logique a un certain sens) mais je n'ai pas encore trouvé un benchmark fiable multi-navigateurs et multi-documents qui prouve que c'est vrai.

Et dans certains cas, vous ne pouvez pas utiliser le sélecteur, car vous avez un objet jQuery résultant de résultats enchaînés et devez le réduire ultérieurement.

Modifier : Sur la base des excellentes informations provenant des tests de @yc ci-dessous, voici les résultats des tests actuels (2011-Feb-4) résumés et comparés à une base de référence de .answer:first :

          :first  :eq(0)  .first()  .eq(0)  $($('...')\[0\])
Chrome 8+   100%     92%      224%    266%       367%
   FF 3.6   100%    100%      277%    270%       309%
  FF 4.0b   100%    103%      537%    521%       643%
 Safari 5   100%     93%      349%    352%       467%
 Opera 11   100%    103%      373%    374%       465%
     IE 8   100%    101%     1130%   1246%      1767%
 iPhone 4   100%     95%      269%    316%       403%
=====================================================
 Weighted   100%     92%      286%    295%       405%
    Major   100%     95%      258%    280%       366%
  • En Pondéré La ligne montre les performances pondérées par le nombre de tests par navigateur ; les navigateurs les plus populaires (parmi ceux qui ont été testés) sont comptés plus fortement.
  • En Major montre la même chose, en incluant uniquement les versions non bêta des principaux navigateurs de bureau.

En résumé : l'hypothèse est (actuellement) fausse. Les méthodes sont nettement plus rapides que les sélecteurs Sizzle et, à peu près sans exception, le code de l'OP. $($('.answer')[0]) est le plus rapide de tous !

4 votes

:eq() est basé sur le zéro. Peut-être que vous pensiez à :nth-child() qui est à base unique ?

4 votes

Il suffit de créer un JSPerf pour ces jsperf.com/selecting-the-first . Veuillez l'exécuter sur vos différents navigateurs :) Mes premiers tests semblent indiquer que, contrairement à l'hypothèse, les méthodes sont plus rapides que les sélecteurs sizzle. Ce n'est pas surprenant, puisque les sélecteurs Sizzle non-CSS sont connus pour être assez lents.

3 votes

NB : les pourcentages du tableau semblent correspondre à la vitesse et non à la durée.

10voto

karim79 Points 178055

Utilisez le :first ou le sélecteur .first méthode de filtrage :

$(".answer:first");

ou :

$(".answer").first();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X