2011-08-07 10 views
7

Dada la siguiente

$("#identifier div:first, #idetifier2").fadeOut(300,function() { 
    // I need to reference just the '#identifier div:first' element 
    // however $(this) will grab both selectors 
}); 

¿Hay una mejor manera de hacer esto que no sea sólo llamando $ ("# identificador div: primero") de nuevo?

+0

** this ** se refiere al elemento actual. Como el selector termina encontrando varios elementos, aplica la función ** fadeOut ** a cada uno. ¿Qué estás tratando de hacer exactamente? – alkos333

+0

atenuar dos elementos, trabajar con ellos por separado y luego volver a fundirlos. Puedo lograr esto de otra manera, eso lo sé. Sin embargo, tengo curiosidad sobre cómo lo haría en esta mansión. – rlemon

Respuesta

5

No, llamará a la función de cada identificador por separado.

La coma en su selector es equivalente a decir:

$("#identifier div:first").fadeOut(300,function() { 
    // $(this) -> '#identifier div:first' 
    }); 

$("#idetifier2").fadeOut(300,function() { 
    // $(this) -> '#identifier2' 
}); 

Puede comprobar diciendo (no probado):

$("#identifier div:first, #idetifier2").fadeOut(300,function() { 
    if($(this).is("#identifier div:first") { 
    // do something 
    } 
}); 

Sin embargo, si usted quiere hacer cosas diferentes (como lo que parece de su publicación), es mejor adjuntarlos por separado.

1

Sólo echa sobre qué ID de la que se está procesando en $(this)

if(this.id == "identifier"){ //your code goes here } 
+1

'this.id' es aún más corto (y más rápido). –

+0

tienes razón :) –

+2

La ID no incluye el símbolo hash. –

3

¿Qué mucha gente no parece darse cuenta de jQuery es que cuando hay varios selectores coincidentes, lo son funciones después de la lista de selección se llamará por separado de a uno en cada selector individual.

Así $("#identifier div:first, #identifier2") coincidirá separado tanto:

$("#identifier div:first") 
and 
$("#identifier2") 

Y, llamará a la función especificada fadeOut y es controlador por separado para cada partido. Esto significa que cada controlador tendrá su propio valor this establecido para que coincida con el selector coincidente.

internamente dentro de jQuery, hay un bucle como este pseudo-código que itera a través de todos los partidos selector devueltos y llama a la función siguiente en la cadena para cada uno:

for (var i = 0; i < matches.length; i++) { 
    jQuery["fadeOut"].call(matches[i], duration, easing, fn); 
} 

Si desea código separado para ser utilizado para los dos partidos diferentes, entonces podría ser mejor usar sólo dos estados separados jQuery:

$("#identifier div:first").fadeOut(300,function() { 
    // do stuff for #identifier div:first 
}); 

$("#identifier2").fadeOut(300,function() { 
    // do stuff for #identifier2 
}); 

Si usted tiene una gran cantidad de código en el bloque y es casi igual, entonces también puede ramificarse dentro de una bloque de código común:

$("#identifier div:first, #identifier2").fadeOut(300,function() { 
    if (this.id != "identifier2") { 
     // execute code that only applies to the #identifier match 
    } 
    // execute rest of common code 
}); 
+0

No está buscando el #identificador sino el primer div dentro de él. – Mrchief

+0

@Mrchief - corrigió el código de muestra. – jfriend00

+0

:). Y si tienes muchos más? – Mrchief