Ich habe mich gefragt, ob JavaScript eine Vielzahl von Methoden bietet, um das erste untergeordnete Element aus einem Element abzurufen. Aber welches ist das beste? Mit "am besten" meine ich: am meisten browserübergreifend kompatibel, am schnellsten, am umfassendsten und vorhersehbarsten, wenn es um Verhalten geht. Eine Liste der Methoden / Eigenschaften, die ich als Aliase verwende:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Dies funktioniert in beiden Fällen:
var child = elem.childNodes[0]; // or childNodes[1], see below
Dies ist bei Formularen oder <div>
Iterationen der Fall . Wenn ich auf Textelemente stoßen könnte:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Soweit ich firstChild
das beurteilen kann, verwendet die NodeList von childNodes
und firstElementChild
verwendet children
. Ich stütze diese Annahme auf die MDN-Referenz:
childNode
ist eine Referenz auf das erste untergeordnete Element des Elementknotens odernull
wenn es keines gibt.
Ich vermute, dass in Bezug auf die Geschwindigkeit der Unterschied, wenn überhaupt, so gut wie nichts sein wird, da er firstElementChild
effektiv eine Referenz children[0]
ist und das children
Objekt ohnehin bereits im Speicher ist.
Was mich wirft, ist das childNodes
Objekt. Ich habe es verwendet, um ein Formular in einem Tabellenelement zu betrachten. Während children
alle Formularelemente aufgelistet werden, childNodes
scheint es auch Leerzeichen aus dem HTML-Code zu geben:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Beide protokollieren <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Alle protokollieren <input type="text"
… >
. Woher? Ich würde verstehen, dass ein Objekt es mir ermöglichen würde, mit dem „rohen“ HTML-Code zu arbeiten, während das andere beim DOM bleibt, aber das childNodes
Element scheint auf beiden Ebenen zu funktionieren.
Um auf meine ursprüngliche Frage zurückzukommen, würde ich raten: Wenn ich das umfassendste Objekt haben möchte, childNodes
ist dies der richtige Weg, aber aufgrund seiner Vollständigkeit ist es möglicherweise nicht das vorhersehbarste, wenn es das gewünschte Element zurückgibt. zu jedem Zeitpunkt erwarten. Die browserübergreifende Unterstützung könnte sich in diesem Fall ebenfalls als Herausforderung erweisen, obwohl ich mich irren könnte.
Könnte jemand die Unterscheidung zwischen den vorliegenden Objekten klarstellen? Wenn es einen Geschwindigkeitsunterschied gibt, wie vernachlässigbar er auch sein mag, würde ich gerne wissen. Wenn ich das alles falsch sehe, kannst du mich gerne erziehen.
PS: Bitte, bitte, ich mag JavaScript, also ja, ich möchte mich mit so etwas befassen. Antworten wie „jQuery kümmert sich für Sie darum“ sind nicht das, wonach ich suche, daher neinjquery Etikett.