2010-08-18 9 views
6

En jQuery, ¿el selector $ ('[id = foo]') es menos eficiente que $ ('# foo')?

Respuesta

16
  • corto y fácil: SÍ !

  • larga historia (aún por debajo realidad)

    $('[id=foo]') 
    

    utiliza Arden (motor de consulta CSS) para seleccionar el elemento que,

    $('#foo') 
    

    llamadas directamente getElementById.

Para tener una historia muy larga, aquí vamos: $('[id=foo]') es un sinónimo de $('*:[id=foo]') que utiliza el selector universal. Eso significa que solicita TODOS los nodos dentro de su marcado y luego mira cuáles de esos tienen el id === foo (que con suerte solo coincidirá con un elemento, ID = únicos). Eso, por supuesto, es costoso, bastante costoso. ¡Y es por eso que nunca jamás deberías escribir un selector como este! Siempre califican completamente esto si es posible, como $('span:[id=foo]')

+0

Ahh aquí hay un sub-pregunta para usted entonces Jandy - se '$ ('span: [id = foo]') 'solo a mano para' $ (span # foo) 'o un selector diferente en total? – HurnsMobile

+0

@HurnsMobile: No, en absoluto. '$ ('span: [id = foo]')'. De hecho, recomendaría echarle un vistazo al código de jQuery init aquí. jQuery analiza algunas expresiones de selector a una llamada directa de 'getElementById' o' getElementsByTagName', creo que '$ (span # foo)' es una de esas. Por lo tanto, es definitivamente más rápido que '$ ('span: [id = foo]')'. Esa expresión entrará en Sizzle y obviamente lleva más tiempo que uno de los métodos mencionados anteriormente. – jAndy

+0

Muy informativo, muchas gracias. La razón por la que estaba considerando usar algo además de $ ("# foo") para apuntar a una identificación es porque la identificación a la que apuntaba tenía un período, lo que obviamente es problemático ya que jQuery interpretaría esto como una identificación y una clase. Entonces, al usar $ ("[id = Address.State]"), por ejemplo, pude solucionar el problema. Otra forma de evitarlo es escaparse dos veces del período como en $ ("# Dirección \\. Estado"), pero pensé que el doble escape podría ser menos legible. Sin embargo, dada la pérdida de eficiencia que señaló, probablemente usaría eso de todos modos. – jbyrd

1

sí ,.

El selector rápido en jQuery es el selector de ID $ ('# foo'), ya que se asigna directamente a un método JavaScript nativo, getElemenById()

Cuestiones relacionadas