2012-10-01 11 views
97

Recientemente actualicé mi versión de PHPStorm IDE y ahora me advierte sobre el uso ineficaz de jQuery.Ineficaces advertencias de uso de jQuery en PHPStorm IDE

Por ejemplo:

var property_single_location = $("#property [data-role='content'] .container"); 

Peticiones esta advertencia:

Comprueba que selectores jQuery se utilizan de una manera eficiente. Sugiere para dividir los selectores de descendientes que están precedidos por el selector de ID y advierte sobre los selectores duplicados que podrían almacenarse en caché.

Así que mi pregunta es:

¿Por qué es ineficiente y cuál es la forma eficiente de hacer el selector arriba?

supongo en:

var property_single_location = $("#property").find("[data-role='content']").find(".container"); 

¿Es este el camino correcto?

Respuesta

151

Tuve la misma pregunta hoy y pude encontrar una solución gracias a Scott Kosmanhere.

Básicamente, la respuesta es seleccionar identificadores individualmente y luego usar .find(...) para lo siguiente. Por lo que tomar el ejemplo:

$("#property [data-role='content'] .container"); 

Si lo cambia a esto hace PhpStorm feliz y no pueden, evidentemente more than twice as fast:

$("#property").find("[data-role='content'] .container"); 
+1

Para mi gusto $ ('[data-role = "content"] .container', '#property'); es más legible – n3rd

+25

@ n3rd Es curioso, no encuentro ese enfoque legible en absoluto, pero cada uno dice lo suyo. – MikeSchinkel

+2

Bien, pero ¿por qué? Al usar el selector de clase, IntelliJ no muestra una advertencia. –

19

creo que la diferencia entre los dos métodos al utilizar las últimas versiones de jQuery y navegadores es insignificante . Construí una prueba que muestra que es ahora en realidad un 10% más rápido para hacer un selector combinado en lugar de la selección de ID y luego encontrar un caso muy simple:

http://jsperf.com/jquery-find-vs-insel

Para la selección de varios niños por clase en cualquier profundidad, el "hallazgo" parece ser más rápido:

http://jsperf.com/jquery-find-vs-insel/7

Hubo alguna discusión sobre este tema en los foros de jQuery, pero sus 3 años de edad: https://forum.jquery.com/topic/which-jquery-selection-is-efficient Como señalan aquí, si usted es Al hacer muchas operaciones en el mismo selector de id, la mejor mejora en el rendimiento se encuentra al almacenar en caché el elemento de nivel superior. Por otro lado, si está haciendo solo algunas selecciones, prácticamente no habrá diferencia de rendimiento.

Por lo tanto, creo que IntelliJ está exagerando la importancia de este estilo de código.

+4

En su primera prueba, está utilizando el difunto directo, seleccione ">". Ejecuté su primera prueba sin ">" y el uso de "buscar" es más rápido. http://jsperf.com/jquery-find-vs-insel/12 – beardedlinuxgeek

+0

Lo que encuentro más interesante sobre esto es que las últimas versiones de Safari procesan el método directo más rápido en aproximadamente un 25%. No sé lo que han hecho, pero aparentemente todos los otros navegadores no se han dado cuenta. – Uxonith

13

La primera pregunta es presionar Alt + Intro, y seleccionar el primer consejo en la lista, luego presionar Entrar, verá lo que cree que es la manera más eficiente.