2014-03-04 4 views
12

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.

- W3C on collections

ein paar Orte HTMLCollection bereits verwendet wird:

document.images 
element.children 

NB:querySelectorAll gibt einen Nicht-Live-NodeList.

+1

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. –

+1

Mögliche doppelte Frage - [LINK] (http: // stackoverflow.com/questions/15763358/difference-zwischen-htmlcollection-nodelists-and-arrays-of-objects) – Quinn

+1

@ Quinn, ich bin mir nicht sicher, dass es ein Duplikat genau ist, aber es ist sicherlich relevant. – zzzzBov

Antwort

2

HTMLCollection weitgehend nur in der DOM-Spezifikation enthalten war zu dokumentieren, wie Die meisten Browser funktionierten, bevor das DOM eingeführt wurde. Es macht nur im Kontext von HTML Sinn, während das DOM für HTML und XML konsistent erstellt wurde. Implementierungen des DOM können HTMLCollection und all ihre Verwendung auslassen und trotzdem als konform betrachtet werden; Die Browser haben sich dafür entschieden, die Abwärtskompatibilität mit alten Websites aufrechtzuerhalten.

-2

Weil weitere Tags HTML-Elemente existieren mit dem gleichen Namen oder Klassennamen, und Sie können es als DOM-Objekt manipulieren, nicht als HTML-Typ

"das erste Element Kosten mit ID oder Namen Namen von der Sammlung ". W3C

Wenn Sie versuchen, ein Ereignis fangen oder es wie zu modifizieren als Attribute in einem bestimmten Knoten hinzufügen, können Sie es durch Id ausgewählt haben oder Name Sammlung

+0

Ich bin mir nicht sicher, was du meinst? Könnten Sie das klären? –