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 firstChilddas beurteilen kann, verwendet die NodeList von childNodesund firstElementChildverwendet children. Ich stütze diese Annahme auf die MDN-Referenz:
childNodeist eine Referenz auf das erste untergeordnete Element des Elementknotens odernullwenn es keines gibt.
Ich vermute, dass in Bezug auf die Geschwindigkeit der Unterschied, wenn überhaupt, so gut wie nichts sein wird, da er firstElementChildeffektiv eine Referenz children[0]ist und das childrenObjekt ohnehin bereits im Speicher ist.
Was mich wirft, ist das childNodesObjekt. Ich habe es verwendet, um ein Formular in einem Tabellenelement zu betrachten. Während childrenalle Formularelemente aufgelistet werden, childNodesscheint 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 childNodesElement 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, childNodesist 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.