2012-04-04 28 views
5

que tienen algo de HTML así:es jquery. ¿Es útil siempre?

<div id="MyDiv"> 

    <div class="Class1"> 
    <div class="SClass1"></div> 
    </div> 
    <div class="Class2"></div> 

</div> 

¿Hay alguna diferencia entre

$('#MyDiv').find('.SClass1').show(); 

y

$('#MyDiv .SClass1').show(); 
+2

No, son equivalentes. –

+0

http://api.jquery.com/jquery/#selector-context podría ayudar con su comprensión – Greg

+0

ok, muchachos geniales! – frenchie

Respuesta

2

en ti caso, utilizando find() es bastante sin sentido (a excepción de la legibilidad - pero cualquiera tendrá otra opinión sobre eso). Yo sólo uso find() en los casos en que es realmente necesario, como:

$('#MyDiv').show().find('.SClass1').css(...); 

donde algo se tiene que hacer con el padre de elementos primero y algo más con uno o más de sus hijos.

2

Esencialmente no hay diferencia. Pero find() es útil si lo usa con variables de ámbito y this.

Por ejemplo:

$(document).ready(function() { 
    $('.action').click(function() { 
     $(this).find('p').text("hello world"); 
    }); 
}); 

que establece todos p dentro de todo lo que tiene una clase denominada action a "hola mundo".

2

Ambos son equivalentes. El primero será un poco más lento, ya que estás haciendo dos consultas. La diferencia de velocidad probablemente no sea notoria.

Puede usar find en casos cuando está creando un complemento/componente que obtiene su contenedor en el constructor y que lo usa como la raíz de sus búsquedas con find para asegurarse de que no obtiene ningún elemento fuera de tu contenedor.

3

http://api.jquery.com/jquery/#selector-context establece que:

Internamente, el contexto de selección se lleva a cabo con el método .find(), por lo que $ ('período', esto) es equivalente a $ (this) .find ('lapso ').

Lo que significa

$('#MyDiv .SClass1').show(); 

es sólo un paso de distancia de jQuery internamente por lo que es

$('#MyDiv').find('.SClass1').show(); 

View this jsPerf test case to see the differences in speed


Como @Dominic menciona en los comentarios, en su jQuery Anti-Patterns for Performance & Compression presentation, Paul irlandesa afirma:

Selector de optimización

Por supuesto, descendiendo de un #id es mejor

// #id-based selector 
var arms = $('#container div.robotarm'); 

// hyper-optimized #id case first, then find: 
var arms = $('#container').find('div.robotarm'); 
+0

No. Lea la cita de nuevo: dice que sería lo mismo que hacer '$ ('. SClass1', $ ('# MyDiv)). Show();' - teniendo el selector como una sola cadena una cosa diferente (pero da el mismo resultado). – oezi

+0

¿Ya no es el caso que el primero es más rápido/más optimizado? No estoy del todo claro, pero pensé que escribir el selector con la identificación primero y luego usar find() omite el motor de selección de jQuery Sizzle o lo hace más eficiente. Mi creencia se basa en el video de rendimiento jQuery de Paul Irish: http://paulirish.com/2009/perf/ (diapositiva 30) – Dominic

+0

@oezi - Equivalente en ejecución, pero no siempre en velocidad. Vea mi respuesta actualizada donde agregué un enlace a un jsPerf que muestra exactamente eso. –