Wie zu erkennen HTMLCollection/NodeList in JavaScript?
Ich bin nicht sicher, dass meine aktuellen Implementierung zur Verfügung steht die ganze Zeit:
function isNodeList(nodes) {
var result = Object.prototype.toString.call(nodes);
//modern browser such as IE9 /firefox /chrome etc.
if (result === '[object HTMLCollection]' || result === '[object NodeList]') {
return true;
}
//ie 6/7/8
if (typeof(nodes) != 'object') {
return false;
}
//detect length and item
if (!('length' in nodes) || !('item' in nodes)) {
return false;
}
//use the trick NodeList(index),all browsers support
try {
if (nodes(0) === null || (nodes(0) && nodes(0).tagName)) return true;
}
catch (e) {
return false;
}
return false;
}
Einer gemeinsamen situation ist {Länge:1,Artikelnummer:function(){return [];}}
Der Wert von Ergebnis, in chrome /safari /opera '[object NodeList]'.
In firefox und IE 9 , es ist '[object HTMLCollection]'.
Den standard-Wert?
Wie um zu überprüfen, ob ein Objekt eine Instanz einer NodeList im IE?
Ball -- typeof Knoten.item gibt 'Zeichenfolge' im ie6,nicht 'funktionieren'.also brauchen wir den Nachweis.
Ball -- typeof Knoten.item gibt 'Zeichenfolge' im ie6,nicht 'funktionieren'.also brauchen wir den Nachweis.
InformationsquelleAutor simon xu | 2011-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den folgenden zurückkehren sollte wahr, wenn der Knoten vom Typ NodeList
@DavidSpector, für HTMLCollection können Sie ebenso verwenden :
Ja, aber das beantwortet nicht die Frage: wie erkennen Sie, ob ein Objekt eine HTML-Collection.
InformationsquelleAutor vineethbc
Ich würde die Struktur der code anders:
Hinweise:
"item"
ist nicht zwingend in eine nodeListhasOwnProperty()
stattin
nodeType
statttagName
als text-Knoten oder Kommentare haben nicht einen Namen&&
Kette, wenn Sie sehen, passen'0.nodeType' is null or not an object
. jede Idee, was könnte den Tisch gefallen?dies sollte nun funktionieren, versuchen Sie es erneut.
warum haben sogar die Rückgabe true/false... einfach nur wieder den Wert, den Sie testen wollen, in der wenn. D. H. entfernen der if-Anweisung + zurück und ersetzen Sie es mit return.
nodes.hasOwnProperty('length')
Rückgabe von false in Chrome für mich. vielleichttypeof nodes.length === 'number'
ist besser?Ja, das klappte zu der Zeit, aber anscheinend ändern sich die Dinge. Ich modifiziert habe meine Antwort dementsprechend, vielen Dank für das heads-up.
InformationsquelleAutor Tomalak
Skript:
Einsatz, wie dies:
InformationsquelleAutor Guja1501
Hier ist, wie um zu testen, ob ein Objekt ist eine NodeList in modernen Browsern:
warum ist das so?
InformationsquelleAutor rosell.dk
Überprüfen, ob variable eine HTMLcollection oder ein dom-element
Danke! Ja, es hilft! Wie kann ich prüfen, ob es nicht
instanceof HTMLCollection
? Wo lege ich das (!) Ausrufezeichen?Die gute Lösung... danke. @Horay Wahrscheinlich ist es zu spät, aber... if (!(Sachen instanceof)) { ... }
InformationsquelleAutor koech
Diese Antwort ist wohl wirklich, wirklich spät, aber....
InformationsquelleAutor Mohamed Moustafa
Erstellt habe ich eine Messlatte für alle Antworten hier, um zu sehen, was ist die beste genehmigen in der Geschwindigkeit. Stellt sich heraus
NodeList.prototype.isPrototypeOf(nodes)
ist bei weitem die Schnellste. Aber in einer normalen use-casenodes instanceof NodeList
wäre auch in Ordnung.Ich persönlich würde es nur nicht, Holen Sie das
isNodeList
Funktion, da seine langsame, Brauch und zu viel overhead.Ich bevorzuge, wenn (!!Knoten.Länge) // true
Die überprüfung, ob
length
- Eigenschaft verfügbar ist, nichts gemein hat mit der überprüfung, ob eine variable ist eine Art vonNodeList
.InformationsquelleAutor eisbehr