In jQuery, il selettore $ ('[id = foo]') è meno efficiente di $ ('# foo')?
risposta
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]')
sì ,.
Il selettore veloce in jQuery è il selettore ID $ ('# foo'), in quanto le mappe direttamente a un metodo JavaScript nativo, getElementById()
Ahh heres un sub-domanda per voi allora JANDY - è '$ ('arco: [id = foo]') 'proprio longhand per' $ (arco # foo) 'o un selettore del tutto diverso? – HurnsMobile
@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
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