Ich habe an einem kurzen Skript gearbeitet, um <abbr>
den inneren Text der Elemente zu ändern , aber festgestellt, dass nodelist
es keine forEach
Methode gibt. Ich weiß, dass nodelist
das nicht erbt Array
, aber scheint es forEach
nicht eine nützliche Methode zu sein? Gibt es eine bestimmte Implementierung Frage , die ich bin mir nicht bewusst , dass verhindert Zugabe forEach
zu nodelist
?
Hinweis: Mir ist bekannt, dass Dojo und jQuery beide eine forEach
Form für ihre Knotenlisten haben. Ich kann es aufgrund von Einschränkungen auch nicht verwenden.
javascript
arrays
dom
foreach
Schlangen und Kaffee
quelle
quelle
Antworten:
NodeList hat jetzt forEach () in allen gängigen Browsern
Siehe nodeList forEach () auf MDN .
Ursprüngliche Antwort
Keine dieser Antworten erklärt, warum NodeList nicht von Array erbt, sodass es
forEach
und alles andere möglich ist .Die Antwort finden Sie in diesem Diskussions-Thread . Kurz gesagt, es bricht das Web:
Das heißt, irgendein Code hat so etwas getan
Allerdings
concat
wird behandeln „echte“ Arrays (nicht Instanceof Array) unterschiedlich von anderen Objekten:Das bedeutet, dass der obige Code als
x
NodeList fehlerhaft war, weil er zuvor dendoSomethingElseWith(x)
Pfad entlang ging , während er danach denotherArray.concat(x)
Pfad entlang ging , was etwas Seltsames tat, dax
es sich nicht um ein echtes Array handelte.Für einige Zeit gab es einen Vorschlag für eine
Elements
Klasse, die eine echte Unterklasse von Array war und als "neue NodeList" verwendet werden sollte. Dies wurde jedoch zumindest vorerst aus dem DOM-Standard entfernt , da eine Implementierung aus verschiedenen technischen und spezifikationsbezogenen Gründen noch nicht möglich war.quelle
NodeList now has forEach() in all major browsers
scheint zu implizieren, dass der IE kein wichtiger Browser ist. Hoffentlich gilt das für einige Leute, aber für mich (noch) nicht.Du kannst tun
quelle
Array.prototype.forEach.call
kann kurz sein[].forEach.call
Array.prototype.forEach.call
, es erstellt ein leeres Array und verwendet dessenforEach
Methode.Sie können ein neues Array von Knoten erstellen.
Hinweis: Dies ist nur eine Liste / ein Array von Knotenreferenzen, die wir hier erstellen, keine doppelten Knoten.
quelle
Array.prototype.forEach.call(nodeList, fun)
.var forEach = Array.prototype.forEach.call(nodeList, callback);
. Jetzt können Sie einfach anrufenforEach(nodeList, callback);
Sag niemals nie, es ist 2016 und das
NodeList
Objekt hat eineforEach
Methode in neuestem Chrome (v52.0.2743.116) implementiert.Es ist zu früh, um es in der Produktion zu verwenden, da andere Browser dies noch nicht unterstützen (getestet FF 49), aber ich würde vermuten, dass dies bald standardisiert wird.
quelle
Array.prototype.slice.call(nodelist).forEach(…)
was Standard ist und in alten Browsern funktioniert.Kurz gesagt, es ist ein Designkonflikt, diese Methode zu implementieren.
Von MDN:
Quelle: https://developer.mozilla.org/en-US/docs/DOM/NodeList (scrollen Sie nach unten zu Warum kann ich forEach oder Map nicht auf einer NodeList verwenden? )
quelle
myNodeList --> NodeList.prototype --> Array.prototype --> Object.prototype --> null
?Wenn Sie forEach in NodeList verwenden möchten, kopieren Sie diese Funktion einfach aus dem Array:
Das ist alles, jetzt können Sie es auf die gleiche Weise verwenden, wie Sie es für Array tun würden:
quelle
In ES2015 können Sie jetzt die
forEach
Methode für die Knotenliste verwenden.Siehe Der MDN-Link
Wenn Sie jedoch HTML-Sammlungen oder andere Array-ähnliche Objekte verwenden möchten, können Sie in es2015 die
Array.from()
Methode verwenden. Diese Methode verwendet ein Array-ähnliches oder iterierbares Objekt (einschließlich NodeList, HTML-Sammlungen, Zeichenfolgen usw.) und gibt eine neue Array-Instanz zurück. Sie können es so verwenden:Da die
Array.from()
Methode shimmbar ist, können Sie sie in es5-Code wie diesem verwendenWeitere Informationen finden Sie auf der MDN- Seite.
Um zu überprüfen , Unterstützung aktuelle Browser .
ODER
Eine andere Möglichkeit für es2015 ist die Verwendung des Spread-Operators.
MDN-Spread-Operator
Spread Operator - Browser-Unterstützung
quelle
Meine Lösung:
quelle
NodeList ist Teil der DOM-API. Schauen Sie sich die ECMAScript-Bindungen an, die auch für JavaScript gelten. http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html . Die Funktion nodeList und eine schreibgeschützte Längeneigenschaft sowie die Funktion item (index) geben einen Knoten zurück.
Die Antwort ist, Sie müssen iterieren. Es gibt keine Alternative. Foreach wird nicht funktionieren. Ich arbeite mit Java DOM API-Bindungen und habe das gleiche Problem.
quelle
Verwenden Sie im IE die Antwort von akuhn :
quelle