In jQuery, ist der Selektor $ ('[id = foo]') weniger effizient als $ ('# foo')?
Antwort
kurz und einfach: JA!
lange Geschichte (noch kurz tatsächlich)
$('[id=foo]')
verwendet Sizzle (css-Abfrage-Engine), um das Element auszuwählen, während
$('#foo')
direkt
getElementById
nennt.
eine wirklich lange Geschichte zu haben, hier gehen wir: $('[id=foo]')
ein Synonym für $('*:[id=foo]')
ist, die den universellen Selektor verwendet. Das heißt, es fragt ALLE Knoten in Ihrem Markup und schaut dann, welche von denen haben die id === foo
(die dann hoffentlich nur ein Element, IDs = einzigartig) übereinstimmen wird. Das ist natürlich teuer, ziemlich teuer. Und deshalb sollten Sie nie einen solchen Selektor schreiben! Immer qualifizieren Sie dies, wenn möglich, wie $('span:[id=foo]')
yeah ,.
Der schnellste Wähler in jQuery ist der ID-Selektor $ ('# foo'), weil es direkt an eine nativen JavaScript-Methode abbildet, getElementById()
Ahh here eine Unterfrage für Sie dann JANDY - ist '$ ('span: [id = foo]') 'nur longhand für' $ (span # foo) 'oder einen anderen Selektor? – HurnsMobile
@HurnsMobile: Überhaupt nicht. '$ ('span: [id = foo]')'. Ich würde empfehlen, hier den jQuery-Init-Code zu sehen. jQuery analysiert einige Selektor-Ausdrücke zu einem direkten Aufruf von 'getElementById' oder 'getElementsByTagName', ich denke, '$ (span # foo)' ist einer davon. Also ist es definitiv schneller als '$ ('span: [id = foo]')'. Dieser Ausdruck wird in Sizzle eingehen und das dauert offensichtlich länger als eine der oben genannten Methoden. – jAndy
Sehr informativ, vielen Dank. Der Grund, warum ich etwas außer $ ("# foo") als Ziel für eine ID in Erwägung zog, war, dass die ID, die ich anvisierte, eine Periode enthielt, was offensichtlich problematisch ist, da jQuery dies als eine ID und eine Klasse interpretieren würde. Mit $ ("[id = Address.State]") beispielsweise konnte ich das Problem umgehen. Eine andere Möglichkeit, um es zu umgehen, besteht darin, die Periode wie in $ ("# Address \\. State") zu entkommen, aber ich dachte, die doppelte Escape könnte weniger lesbar sein. Angesichts des Effizienzverlustes, auf den Sie hingewiesen haben, würde ich das wahrscheinlich trotzdem verwenden. – jbyrd