2017-06-23 3 views
2

ich in Ergebnisse um die Diskrepanz eine harte Zeit Umhüllung meinem Kopf haben, wenn ich getElementsByClassName auf zwei verschiedene Elemente nennen:Typoskript Rückgabetypen mit .getElementsByClassName()

Betrachten Sie den folgenden Code ein:

let section:HTMLElement = document.getElementById("mainSection"); 

// This returns NodeListOf<Element> 
let blah1 = section.getElementsByClassName("blah"); 

// This returns HTMLCollectionOf<Element> 
let blah2 = document.getElementsByClassName("blah"); 

Warum bekomme ich beim Aufruf der Methode auf section eine NodeList aber wenn ich es auf Dokument anrufe, bekomme ich eine HTMLCollection?

Basiert auf der MDN Documentation, sollten sie nicht beide eine HTMLCollection zurückgeben?

Antwort

2

Das Javascript document Objekt enthält nur gültige HTML-Elemente, das ist eine Garantie für Standards.

HTML-Elemente (die Ihre selection ist) können jedoch andere HTML-Elemente oder Knoten enthalten, die kein gültiges HTML sind (denken Sie an Klartext, der ein Knoten ist, aber nicht selbst im Javascript-Dokument existieren kann)).

NodeList und HTMLCollection sind fast identisch, aber mit traditioneller objektorientierter Sprache erweitert HTMLCollection NodeList, dh es kann alles, was NodeList kann, aber es hat auch die namedItem Methode.

+0

Ich verstehe, dass 'HTMLElements' nicht gültige HTML-Knoten enthalten kann. Wenn ich jedoch 'getElementsByClassName()' verwende, würde ich dann nicht nur gültige HTML-Elemente erhalten, die der Klasse entsprechen? Ich könnte keinen einfachen Text erhalten, wenn ich explizit eine Methode aufruft, die nach Elementen anhand ihres Klassennamens sucht. – Marquizzo

+1

'getElementsByClassName' kann bei Ausführung auf einem beliebigen Element auch SVG-Elemente zurückgeben, die keine HTML-Elemente sind –