54 votes

Pourquoi $ .each () ne parcourt-il pas tous les éléments?

J'ai le balisage suivant contenant 10 pre éléments avec la classe indent:

​<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>
<pre class="indent"></pre>​

Je suis à l'aide de la suite de jQuery .each() fonction pour itérer sur chaque élément:

​$(function(){    
    $.each(".indent", function(index){
       alert(index); 
    });    
});​

Je m'attends à voir 10 alertes, cependant je ne vois 7

-- Voir Violon --


Toutefois, cela fonctionne comme prévu avec $(".indent").each():

$(function(){    
    $(".indent").each(function(index){
       alert(index); 
    });    
});​

-- Voir Violon --


En regardant l' $.each() de la documentation, je comprends qu'il y a une différence:

L' $.chaque fonction() n'est pas le même que $(selector).each(), qui est utilisé pour effectuer une itération, exclusivement, sur un objet jQuery.

Mais je ne comprends pas pourquoi dans ce cas, il n'a pas d'itérer sur tous les éléments.

Pourquoi est-ce arrivé?

145voto

dystroy Points 145126
$.each(".indent", function(index){

ne pas effectuer une itération sur les éléments d' $('.indent') mais plus de la ".indent" chaîne de caractères dont la longueur est de 7 caractères.

Voir la référence


Une explication plus détaillée basée sur jQuery code source :

jQuery vérifie d'abord si le premier paramètre, obj (ici votre chaîne), a un length :

var ...
        length = obj.length,
        isObj = length === undefined || jQuery.isFunction( obj );

Votre chaîne ayant un length (et de ne pas être une fonction), isObj est false.

Dans ce cas, le code suivant est exécuté :

for ( ; i < length; ) {
    if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
        break;
    }
}

Donc, compte tenu de la fonction f, le code suivant

$.each(".indent", f);

est équivalent à

for (var i=0; i<".indent".length; i++) {
    var letter = ".indent"[i];
    f.call(letter, i, letter);
}

(vous pouvez vous connecter aux lettres à l'aide de var f = function(i,v){console.log(v)}; ou être rappelé à l'une des subtilités de l' call l'aide var f = function(){console.log(this)};)

38voto

Vohuman Points 79122

Vous parcourez la chaîne, vous devez passer un objet ou un tableau à la méthode $.each :

 $(function(){    
    $.each($(".indent"), function(index){
       alert(index);
    });    
});
 

22voto

Sérgio Michels Points 10528

$ .each effectue une itération sur une collection de données. Puisque vous passez une chaîne qui a 7 caractères, elle sera itérée pour chaque caractère. Voir l'exemple d'utilisation:

 $.each([52, 97], function(index, value) { 
  alert(index + ': ' + value); 
});
 

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