2010-08-18 3 views
6

In jQuery, il selettore $ ('[id = foo]') è meno efficiente di $ ('# foo')?

risposta

16
  • breve e facile: SI!

  • lunga storia (ancora a corto realtà)

    $('[id=foo]') 
    

    utilizza Sizzle (motore di query CSS) per selezionare l'elemento che,

    $('#foo') 
    

    chiamate direttamente getElementById.

Per avere davvero una lunga storia, qui andiamo: $('[id=foo]') è sinonimo di $('*:[id=foo]') che utilizza il selettore universale. Ciò significa, che querys TUTTI nodi all'interno del vostro markup e poi guarda che di coloro che hanno la id === foo (che poi si spera solo corrispondere a un elemento, gli ID = unico). Questo, ovviamente, è costoso, piuttosto costoso. Ed è per questo che mai e poi mai dovresti scrivere un selettore come questo! Sempre qualificano pienamente questo, se possibile, come $('span:[id=foo]')

+0

Ahh heres un sub-domanda per voi allora JANDY - è '$ ('arco: [id = foo]') 'proprio longhand per' $ (arco # foo) 'o un selettore del tutto diverso? – HurnsMobile

+0

@HurnsMobile: Niente affatto. '$ ('Arco: [id = foo]')'. In realtà vorrei raccomandare di dare un'occhiata al codice init di jQuery qui. jQuery fa analizzare alcune espressioni di selezione per una chiamata diretta di '' getElementById' o getElementsByTagName', penso '$ (arco # foo)' è uno di quelli. Quindi è decisamente più veloce di '$ ('span: [id = foo]')'. Questa espressione andrà in Sizzle e ovviamente richiede più tempo di uno dei metodi sopra menzionati. – jAndy

+0

Molto informativo, grazie mille. Il motivo che mi stava prendendo in considerazione utilizzando qualcosa oltre $ ("# foo") per indirizzare un id è perché l'id che si indirizzava avuto un periodo in esso, che è ovviamente problematico, in quanto jQuery avrebbe interpretato questo come un id e una classe. Quindi, usando $ ("[id = Address.State]"), ad esempio, potrei aggirare il problema. Un altro modo per aggirare l'ostacolo è quello di raddoppiare il periodo di sfuggire come in $ ("# Indirizzo \\. State"), ma ho pensato che il doppio di fuga potrebbe essere meno leggibile. Tuttavia, data la perdita di efficienza che hai segnalato, probabilmente lo userei comunque. – jbyrd

1

sì ,.

Il selettore veloce in jQuery è il selettore ID $ ('# foo'), in quanto le mappe direttamente a un metodo JavaScript nativo, getElementById()