2011-11-11 13 views
18

Estoy refactorización algo de código en el momento y han llegado a través de un selector:Lista de selectores separados por comas?

jQuery("tr","#ctl00_MainContent_MyUserControl").each(function(i,row) { ... } 

Parece que está seleccionando <tr> 's desde el control de usuario en la página (ignorar el hecho de que la instancia está totalmente nombrado !) pero no es una sintaxis con la que estoy familiarizado y no puedo encontrar nada en la documentación. Yo esperaría que fuera escrito:

$("#ctl00_MainContent_MyUserControl tr").each(function(i,row) { ... } 

Puede alguien decirme si hay una diferencia (sutil o de otro tipo) que me falta aquí ??

+0

La primera sintaxis es útil cuando el contexto se almacena en caché y desea realizar consultas rápidas en él. Sin embargo, como se menciona en una de las respuestas, es euqal a $ ('# ...') .find ('tr'). La segunda sintaxis se recomienda por razones de legibilidad si el almacenamiento en caché no es importante. Recuerda que cuando guardas algo en la memoria caché, ocupará memoria, por lo que a veces la sobrecarga no vale la pena. – AlexStack

Respuesta

16

This selector selecciona todos los tr elementos dentro de un elemento con id ctl00_MainContent_MyUserControl. Es exactamente lo mismo que tu segundo ejemplo.

El segundo parámetro proporciona un contexto para el primer parámetro. Hay mejores casos de uso de esta sintaxis, por ejemplo:

function(el) { 
    $('tr', el).each(...); 
} 

Dónde el algún elemento en su página. En este caso, no puede usar el segundo formulario de sintaxis.

+0

¿Es esto lo mismo que usar '$ (el) .find ('tr')'? Si es así, ¿alguna idea de cuál es más eficiente? – ksav

2

El segundo argumento para el constructor de jQuery (cuando el primero es un selector) es el contexto .

A partir de los documentos de la API

contexto un elemento DOM, un documento o jQuery para usar como marco

Ver http://api.jquery.com/jQuery/

3

Es exactamente lo mismo. Podría también haber sido escrito:

$("#ctl00_MainContent_MyUserControl").find("tr").each(function(i,row) { ... } 

La sintaxis para el primero se puede ver en la jQuery constructor documentation. Básicamente es "encontrar todos los elementos que coinciden con el primer selector, que es un descendiente del segundo emparejado por el segundo".

12

Llamar al método jQuery() con dos argumentos (selector y context) is equivalent tojQuery(context).find(selector). Por lo tanto:

jQuery("tr","#ctl00_MainContent_MyUserControl"); 

es igual a:

jQuery("#ctl00_MainContent_MyUserControl").find("tr"); 

que también pasa a ser el mismo que:

jQuery("#ctl00_MainContent_MyUserControl tr"); 

Mi opinión personal es que el uso de context solamente tiene sentido cuando puede pasar un elemento ya seleccionado (jQuery o DOM), no tanto cuando acaba de pasar un selector (String). En ese caso, simplemente prefiero imitar el selector de CSS: por ejemplo, #ctl00_MainContent_MyUserControl tr.

Cuestiones relacionadas