2011-07-28 15 views
15

Me encontré con una reacción que no podía explicar hoy mientras trabajaba con Jquery muy básico hoy y esperaba que uno de ustedes me explicara lo que está ocurriendo para conducir a estos resultados¿Qué significa un espacio en un selector de jquery?

Así que tengo un modelo DOM (simplificado aquí)

<div class="ObjectContainer"> 
    <div class="Object"> 
     <div>stuff</div> 
    <div class="Object"> 
     <div>stuff</div> 

la idea era establecer un atributo en el último objeto que utiliza este código:

$('div.ObjectContainer').find('div.Object :last').attr("index", "1"); 

ahora entiendo el código aquí era incorrecta y el selector hallazgo adecuada debería ser 'div .Objeto: la st ', pero son los resultados que no entiendo. Cuando ejecuté el primer código de esto ocurrió:

<div class="ObjectContainer"> 
    <div class="Object"> 
     <div index="1">stuff</div> 
    <div class="Object"> 
     <div>stuff</div> 

Podría alguien explicarme cómo mi selector inicial logró establecer un atributo en un nodo hijo?

+0

': la última' = '*: pasado', 'div: última' = 'div *: última' – rkw

Respuesta

33

Los espacios indican la coincidencia con los descendientes. Para cada espacio, está descendiendo (al menos) un nivel y aplicando su selector a los elementos secundarios previamente seleccionados.

Por ejemplo:

div.container.post 

coincidirá con un <div> con los container y post clases, mientras que el siguiente:

div.container .post 

... coincidirá con cualquier elemento con la clase post que descienden de un <div> con una clase de container.

Esto corresponderá con <div class="container"><p class="post"></p></div>, pero también coincidirá con cualquier .post, no importa cuán profundamente anidado es:

<div class="container"> 
    <div> 
    <div> 
     <a class="post"> <!-- matched --> 
    </div> 
    </div> 
</div> 

Puede pensar que es coincidente en etapas: Primeros elementos coincidentes div.container se encuentran, y luego cada uno de esos elementos (y todos sus subelementos) se buscan coincidencias contra .post.

En caso de que eres, div.Object :last primero buscará todos <div> etiquetas con la clase Object, y luego las búsquedas dentro de cada uno de los elementos coincidentes para :last, es decir, cualquier elemento que es el último elemento en su contenedor. Esto se aplica tanto a <div index="1">stuff</div> como a <div>stuff</div>.

Los espacios funcionan exactamente del mismo modo que el encadenamiento de llamadas múltiples al find, por lo que si comprende cómo funciona eso, puede comprender cómo los espacios afectan a un selector.Estos son idénticos:

$('div#post ul.tags li'); 
$('div#post').find('ul.tags').find('li'); 
+0

jQuery selector engine funciona de derecha a izquierda. Creo que la explicación de la coincidencia en etapas debe cambiarse aquí? Esto también significa '$ ('div # post ul.tags li')' & '$ ('div # post'). Find ('ul.tags'). Find ('li');' no son idénticos ... ¿Estoy correcto aquí? –

+0

@ techie_28 No hay diferencia funcional, y son idénticos. – meagar

1

$('div.ObjectContainer').find('div.Object :last') resulta en un efecto comodín. busca cualquier niño con la clase psudo de: último. Por lo tanto, simplemente eligió div: último. Es equivalente a $('div.ObjectContainer').find('div.Object div:last')

0

Usando jQuery, se puede encontrar cualquier obj DOM al proporcionar su ID, nombre de la clase, tipo de etiqueta, etc, o simplemente encontrar el padre primero y luego especificar el niño anidado que desea

Para ejemplo, puedes encontrar la primera Div. Objeto de esta consulta

$('.ObjectContainer .Object:first') 

Así que el espacio en el selector de jQuery separa el nodo padre y de los niños

+0

Para aclarar, el espacio separa un nodo padre y cualquier DESCENDENTE ... no solo hijos inmediatos. –

+0

También para aclarar, no hay nada que restrinja que los elementos coincidentes deben ser un div – Arkaine55

Cuestiones relacionadas