Warum nicht getElementsByName
, getElementsByTagName
und getElementsByClassName
Rückkehr ein HTMLCollection
(W3C, MDN) anstelle eines NodeList
(W3C, MDN)?Warum geben document.getElementsBy__-Methoden keine HTMLCollection zurück?
Alle drei Rückkehr eine Live NodeList von nur Elemente:
document.getElementsByName('nameAttrVal');
document.getElementsByTagName('div');
document.getElementsByClassName('space separated classes');
Nodelisten sind groß, aber HTMLCollection
s sind spezifischer, da sie nur HTML-Elemente enthalten können. Es scheint, als wäre das perfekt für diese Methoden.
Wenn eine Sammlung erstellt wird, sind ein Filter und ein Stamm mit der Sammlung verknüpft.
Zum Beispiel, wenn das Objekt für die HTMLCollection document.images Attribut erzeugt wird, wird es mit einem Filter zugeordnet ist, das nur img Elemente und wurzelt an der Wurzel des Dokuments auswählt.
Die Sammlung stellt dann eine Live Ansicht des Unterbaums auf wurzelt der Wurzel der Sammlung, die nur Knoten, die den gegebenen Filter entsprechen. Die Ansicht ist linear. In Ermangelung spezifischer Anforderungen an im Gegenteil, müssen die Knoten innerhalb der Sammlung in Baum Reihenfolge sortiert werden.
ein paar Orte HTMLCollection
bereits verwendet wird:
document.images
element.children
NB:querySelectorAll
gibt einen Nicht-Live-NodeList
.
Nun 'qSA' wurde ein paar Jahre nach diesen drei APIs definiert, also denke ich, dass die Spezifikationsdesigner mit Ihnen übereinstimmen. Aber du kannst nicht zurückgehen und Dinge jetzt ändern. –
Mögliche doppelte Frage - [LINK] (http: // stackoverflow.com/questions/15763358/difference-zwischen-htmlcollection-nodelists-and-arrays-of-objects) – Quinn
@ Quinn, ich bin mir nicht sicher, dass es ein Duplikat genau ist, aber es ist sicherlich relevant. – zzzzBov