2010-06-08 4 views
32

Je pourrais mal comprendre ce qui se passe mais d'après ce que je peux dire, je reçois un élément DOM et pas un objet jQuery lorsque j'utilise .each().jQuery .each() renvoie l'élément DOM et non un objet jQuery

Le ci-dessous ne fonctionnera pas comme this fait référence à un élément DOM et non un objet jQuery

$("span[id$='_TotalItemCost']").each(function() { 
    var someText = this.text(); 
}); 

modifié pour transformer this à un objet jQuery et tout est bien

$("span[id$='_TotalItemCost']").each(function() { 
    var someText = $(this).text(); 
}); 

Y at-il quelque chose funky avec mon sélecteur? Est-ce que le jQuery .each() documentation est faux et ce n'est pas un objet jQuery mais plutôt un élément DOM retourné par .each()?

Répondre

37

La documentation n'est pas fausse mais vous pouvez vous méprendre sur ce qu'est un objet jQuery.

L'objet jQuery est renvoyé par la fonction $(). Donc $("span[id$='_TotalItemCost']") est un objet jQuery qui contient tous les éléments span sélectionnés.

L'utilisation de .each() va parcourir les éléments contenus dans l'objet jQuery. C'est pourquoi il s'agit d'un noeud DOM et non d'un objet jQuery.

Vous avez fait la bonne chose en utilisant $(this) pour utiliser les méthodes jQuery sur cet élément spécifique.

+2

En outre, les objets jQuery sont plus lourds que l'objet DOM lui-même - certains d'entre nous ne veulent pas de peluches supplémentaires si nous recherchons quelque chose de simple .. –

+1

Impressionnant, viens de trouver cette friandise dans la documentation que j'avais manquée * le rappel est renvoyé dans le contexte de l'élément DOM actuel, donc le mot-clé 'this' fait référence à l'élément. * – ahsteele

+2

$ (expression) .each (..) renvoie l'instance de jquery pour le chaînage. C'est probablement à quoi la documentation de jquery fait référence. –

3

@Vincent Robert, vous l'avez résumé à peu près parfaitement, mais permettez-moi de le prolonger un peu.

Même si JQuery est une fonction avec des prototypes qui étendent son instance racine, elle agit plus comme un objet.

Si vous séparez les objets des méthodes/fonctions et que vous les observez individuellement, vous comprendrez alors comment l'interface jQuery est construite.

et pensez à $() comme un objet, et pensez à each() comme méthode. vous initialisez un objet en utilisant le "sélecteur" jQuery $(), qui renvoie à son tour un objet qui contient uniquement les données/éléments que vous avez sélectionnés dans le sélecteur $().

Ceci a alors des méthodes/fonctions que vous pouvez exécuter directement sur le contenu sélectionné, mais les méthodes ne doivent pas renvoyer un objet jquery car la plupart du temps il ne renvoie pas de nœuds mais simplement des booléens. objet serait inutile.

que votre OP est basé autour de la chaque fonction, votre pas destinée à recevoir un objet jquery là parce que chacun est pas spécifiquement conçu pour les noeuds et les éléments en tant que tels

par exemple, vous voulez un objet jquery ici?

$({a:'1',b:'2'}).each(function(){ 
}); 

ce serait mauvais droit, et inutile, c'est pourquoi les méthodes ne/ne devrait pas retourner des objets, à moins que la méthode est le sens de retourner un singleton ou est spécialement conçu pour objet de retour.

aussi, quand je dis objet, je ne parle pas d'objets json en tant que tels, mais d'objets de méthode/prototypage.

Espérons que cela aide.