2010-06-08 12 views
32

Podría estar malinterpretando lo que está sucediendo, pero por lo que puedo decir, obtengo un elemento DOM y no un objeto jQuery cuando uso .each().jQuery .each() devuelve un elemento DOM y no un objeto jQuery

La continuación no va a funcionar como this se refiere a un elemento DOM y no un objeto jQuery

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

Modificado para transformar this a un objeto jQuery y todo está bien

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

¿Hay algo funky con mi selector? ¿Es incorrecto el jQuery .each() documentation y no es un objeto jQuery sino un elemento DOM devuelto por .each()?

Respuesta

37

La documentación no es incorrecta, pero puede malinterpretar lo que es un objeto jQuery.

El objeto jQuery es devuelto por la función $(). Por lo tanto, $("span[id$='_TotalItemCost']") es un objeto jQuery que contiene cada elemento span seleccionado.

El uso de .each() iterará sobre los elementos contenidos en el objeto jQuery. Es por eso que este es un nodo DOM y no un objeto jQuery.

Hizo lo correcto al usar $(this) para usar los métodos de jQuery en este elemento específico.

+2

Además, los objetos jQuery son más pesados ​​que el objeto DOM en sí; algunos de nosotros no queremos pelusa extra si buscamos algo simple ... –

+1

Impresionante, acabo de encontrar este tidbit en la documentación que me había perdido * la devolución de llamada se activa en el contexto del elemento DOM actual, por lo que la palabra clave 'this' se refiere al elemento. * – ahsteele

+2

$ (expresión) .each (..) devuelve la instancia de jquery para el encadenamiento. Esto es probablemente a lo que se refiere la documentación de jquery. –

3

@Vincent Robert, lo resumiste perfectamente, pero permítanme extenderlo un poco.

aunque JQuery es una función con prototipos que extienden su instancia de raíz, actúa más como un objeto.

si separa objetos de métodos/funciones y los mira individualmente, comprenderá cómo se construye la interfaz jQuery.

si piensa en $() como un objeto, y piense en each() como un método. Inicializa un objeto utilizando el "selector" jQuery $(), que a su vez devuelve un objeto que contiene solo los elementos/datos que seleccionó del selector $().

esto tiene métodos/funciones que puedes ejecutar directamente en el contenido seleccionado, pero los métodos no deben devolver un objeto jquery porque la mayoría de las veces no devuelven nodos sino cadenas simples o booleanas, por lo que se envuelven en jQuery objeto no tendría sentido.

como su OP se basa en el cada función, su no significaba para recibir un objeto jQuery allí porque cada uno no está diseñado específicamente para los nodos y elementos como tales

por ejemplo, ¿le gustaría un objeto jQuery aquí?

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

esto sería mala derecho, y sin sentido, por eso los métodos hacen/no hay que devolver los objetos, a menos que el método es el sentido de devolver un producto único o está diseñado específicamente para el objeto de regresar.

también, cuando digo objeto, no estoy hablando de objetos json como tales, sino de objetos de método/creación de prototipos.

Espero que esto ayude.

Cuestiones relacionadas