Ich war immer verwirrt zwischen HTMLCollections, Objekten und Arrays, wenn es um DOM geht. Zum Beispiel...
- Was ist der Unterschied zwischen
document.getElementsByTagName("td")
und$("td")
? $("#myTable")
und$("td")
sind Objekte (jQuery-Objekte). Warum zeigt console.log auch das Array von DOM-Elementen neben sich an, und sind sie keine Objekte und kein Array?- Worum geht es in den schwer fassbaren "NodeLists" und wie wähle ich eine aus?
Bitte geben Sie auch eine Interpretation des folgenden Skripts an.
Danke dir
[123,"abc",321,"cba"]=[123,"abc",321,"cba"]
{123:123,abc:"abc",321:321,cba:"cba"}=Object { 123=123, abc="abc", 321=321, more...}
Node= Node { ELEMENT_NODE=1, ATTRIBUTE_NODE=2, TEXT_NODE=3, more...}
document.links= HTMLCollection[a #, a #]
document.getElementById("myTable")= <table id="myTable">
document.getElementsByClassName("myRow")= HTMLCollection[tr.myRow, tr.myRow]
document.getElementsByTagName("td")= HTMLCollection[td, td, td, td]
$("#myTable")= Object[table#myTable]
$("td")= Object[td, td, td, td]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Collections?</title>
<script src="http://code.jquery.com/jquery-latest.js" type="text/javascript"></script>
<script type="text/javascript">
$(function(){
console.log('[123,"abc",321,"cba"]=',[123,"abc",321,"cba"]);
console.log('{123:123,abc:"abc",321:321,cba:"cba"}=',{123:123,abc:"abc",321:321,cba:"cba"});
console.log('Node=',Node);
console.log('document.links=',document.links);
console.log('document.getElementById("myTable")=',document.getElementById("myTable"));
console.log('document.getElementsByClassName("myRow")=',document.getElementsByClassName("myRow"))
console.log('document.getElementsByTagName("td")=',document.getElementsByTagName("td"));
console.log('$("#myTable")=',$("#myTable"));
console.log('$("td")=',$("td"));
});
</script>
</head>
<body>
<a href="#">Link1</a>
<a href="#">Link2</a>
<table id="myTable">
<tr class="myRow"><td>td11</td><td>td12</td></tr>
<tr class="myRow"><td>td21</td><td>td22</td></tr>
</table>
</body>
</html>
javascript
jquery
dom
user1032531
quelle
quelle
document.querySelectorAll('td')
und$('td')
. (b) Der grundlegende Unterschied besteht darin, dass jQuery mit einem eigenen Objekttyp arbeitet, der unter anderem eine nummerierte Sammlung von HTML-Elementen enthält. Diese Auflistung ist keine der oben genannten, und das jQuery-Objekt ist im Wesentlichen ein Wrapper um die wahren DOM-Elemente.Antworten:
Zuerst werde ich den Unterschied zwischen
NodeList
und erklärenHTMLCollection
.Beide Schnittstellen sind Sammlungen von DOM-Knoten. Sie unterscheiden sich in den von ihnen bereitgestellten Methoden und in der Art der Knoten, die sie enthalten können. Während a
NodeList
einen beliebigen Knotentyp enthalten kann,HTMLCollection
soll a nur Elementknoten enthalten.An
HTMLCollection
bietet die gleichen Methoden wie aNodeList
und zusätzlich eine aufgerufene MethodenamedItem
.Sammlungen werden immer verwendet, wenn der Zugriff auf mehrere Knoten bereitgestellt werden muss, z. B. geben die meisten Auswahlmethoden (z. B.
getElementsByTagName
) mehrere Knoten zurück oder erhalten einen Verweis auf alle untergeordneten Knoten (z.element.childNodes
).Weitere Informationen finden Sie in der DOM4-Spezifikation - Sammlungen .
getElementsByTagName
ist die Methode der DOM-Schnittstelle. Es akzeptiert einen Tag-Namen als Eingabe und gibt ein zurückHTMLCollection
(siehe DOM4-Spezifikation ).$("td")
ist vermutlich jQuery. Es akzeptiert jeden gültigen CSS / jQuery-Selektor und gibt ein jQuery-Objekt zurück.Der größte Unterschied zwischen Standard-DOM-Sammlungen und jQuery-Auswahlen besteht darin, dass DOM-Sammlungen normalerweise live sind (nicht alle Methoden geben jedoch eine Live-Sammlung zurück), dh Änderungen am DOM werden in den Sammlungen wiedergegeben, wenn sie betroffen sind. Sie sind wie eine Ansicht des DOM-Baums, während jQuery-Auswahlen Momentaufnahmen des DOM-Baums in dem Moment sind, in dem die Funktion aufgerufen wurde.
jQuery-Objekte sind Array-ähnliche Objekte, dh sie haben numerische Eigenschaften und eine
length
Eigenschaft (denken Sie daran, dass Arrays nur Objekte selbst sind). Browser neigen dazu, Arrays und Array-ähnliche Objekte auf besondere Weise anzuzeigen, wie z[ ... , ... , ... ]
.Siehe den ersten Teil meiner Antwort. Sie können s nicht auswählen
NodeList
, sie sind das Ergebnis einer Auswahl.Soweit ich weiß, gibt es nicht einmal eine Möglichkeit,
NodeList
s programmgesteuert zu erstellen (dh ein leeres zu erstellen und später Knoten hinzuzufügen), sondern sie werden nur von einigen DOM-Methoden / -Eigenschaften zurückgegeben.quelle
td
Elemente ausgewählt haben und später ein neuestd
Element hinzufügen, wird die Auswahl nicht automatisch aktualisiert, um das neue Element zu enthalten.NodeList
s live sind..forEach()
und der andere nicht?0. Was ist der Unterschied zwischen an
HTMLCollection
und aNodeList
?Hier sind einige Definitionen für Sie.
DOM Level 1 Spec - Verschiedene Objektdefinitionen :
DOM Level 3 Spec - NodeList
Sie können also beide Live-Daten enthalten, was bedeutet, dass das DOM aktualisiert wird, wenn ihre Werte dies tun. Sie enthalten auch andere Funktionen.
Sie werden feststellen, dass das
table
DOM-Element sowohl achildNodes
NodeList[2]
als auch a enthält , wenn Sie die Konsole überprüfen, wenn Sie Ihre Skripte ausführenchildren
HTMLCollection[1]
. Warum sind sie anders? DaHTMLCollection
NodeList nur Elementknoten enthalten kann, enthält es auch einen Textknoten.1. Was ist der Unterschied zwischen
document.getElementsByTagName("td")
und$("td")
?document.getElementsByTagName("td")
ein Array von DOM - Elemente zurückkehrt (aNodeList
),$("td")
wird ein jQuery Objekt aufgerufen , die die Elemente aus hatdocument.getElementsByTagName("td")
auf seine Eigenschaften0
,1
,2
usw. Der Hauptunterschied ist , dass das jQuery Objekt ein wenig langsamer ist abzurufen , sondern gibt Zugang zu allen praktisch jQuery-Funktionen.2.
$("#myTable")
und$("td")
sind Objekte (jQuery
Objekte). Warum istconsole.log
neben ihnen auch das Array der DOM-Elemente angezeigt, und sind sie keine Objekte und kein Array?Sie sind Objekte mit ihren Eigenschaften
0
,1
,2
etc. Satz auf die DOM - Elemente. Hier ist ein einfaches Beispiel: wie es funktioniert:jsFiddle
3. Worum geht es in den schwer fassbaren "NodeLists" und wie wähle ich eine aus?
Sie haben sie in Ihrem Code abgerufen
getElementsByClassName
undgetElementsByTagName
beide gebenNodeList
s zurückquelle
length
Eigenschaft, nicht der numerischen Eigenschaftsnamen. Und was hat Ihr Beispiel für die Alarmierung einer Zeichenfolge damit zu tunconsole.log
?Zusätzliche Anmerkung
Was ist der Unterschied zwischen einer HTMLCollection und einer NodeList?
Eine HTMLCollection enthält nur Elementknoten ( Tags ) und eine NodeList enthält alle Knoten .
Es gibt vier Knotentypen:
nodeTypes
Leerzeichen in Elementen werden als Text und Text als Knoten betrachtet.
Folgendes berücksichtigen:
Leerzeichen:
<ul id="myList"> <li>List item</li></ul>
Kein Leerzeichen:
<ul id="myList"><li>List item</li></ul>
quelle
$("td")
ist ein erweitertes jQuery-Objekt und verfügt über jQuery-Methoden. Es gibt ein jquery-Objekt zurück, das ein Array von HTML-Objekten enthält.document.getElementsByTagName("td")
ist die Raw-JS-Methode und gibt NodeList zurück. Siehe diesen Artikelquelle
Die NodeList- Objekte sind Sammlungen von Knoten, die beispielsweise von x zurückgegeben werden. childNodes- Eigenschaft oder document.querySelectorAll () -Methode. In einigen Fällen ist der NodeList Live , was bedeutet , dass Änderungen in dem DOM automatisch die Sammlung aktualisieren! Zum Beispiel ist Node.childNodes live:
In einigen anderen Fällen ist die NodeList jedoch statisch , wobei Änderungen im DOM den Inhalt der Sammlung nicht beeinflussen. querySelectorAll () gibt eine statische NodeList zurück.
Die HTMLCollection ist eine Live- und geordnete Sammlung von Elementen (sie wird automatisch aktualisiert, wenn das zugrunde liegende Dokument geändert wird). Es kann aufgrund der Eigenschaften wie als seine Kinder oder Methoden wie als document.getElementsByTagName () , und konnte nur Htmlelement des als ihre Einzelteile.
HTMLCollection macht seine Mitglieder auch direkt als Eigenschaften sowohl nach Name als auch nach Index verfügbar:
Das HTMLElement ist nur eine Art von Knoten:
Der Knoten kann verschiedene Typen haben . Die wichtigsten sind wie folgt:
<p>
oder<div>
.Ein großer Unterschied besteht also darin, dass HTMLCollection nur HTMLElements enthält, NodeList jedoch auch Kommentare, Leerzeichen (Zeilenumbruchzeichen, Leerzeichen ..) usw. enthält. Überprüfen Sie dies wie im folgenden Snippet:
Sowohl HTMLCollection und NodeList enthalten die Länge Eigenschaft , die Sie verwenden können , Schleife über ihre Produkte. Verwenden Sie nicht für ... in oder für jedes ... in, um die Elemente in NodeLists aufzulisten, da sie auch deren Länge und Elementeigenschaften auflisten und Fehler verursachen, wenn Ihr Skript davon ausgeht, dass es sich nur um Elementobjekte handelt. Es ist auch nicht garantiert, dass for..in die Immobilien in einer bestimmten Reihenfolge besucht.
quelle
Es wurde bereits viel gesagt, aber ich dachte an eine zusammengefasstere Version der Antwort mit einem Beispiel, um die Unterschiede zwischen zu erklären
HTMLCollection
undNodeList
würde helfen.Knotentypen in DOM
Wir können die folgenden drei Eigenschaften verwenden, um Knoten in DOM zu untersuchen und abzufragen:
nodeType
EigentumnodeName
EigentumnodeValue
EigentumDas
nodeType
Eigenschaft gibt den Knotentyp als Nummer des angegebenen Knotens zurück.nodeType
Eigenschaft 1 zurück .nodeType
Eigenschaft 2 zurück .nodeType
Eigenschaft 3 zurück .nodeType
Eigenschaft 8 zurück .HTMLCollection vs NodeList
Wir können die Unterschiede zwischen
HTMLCollection
und anhandNodeList
des folgenden Beispiels klarer verstehen . Bitte versuchen Sie, die Ausgaben in Ihrer eigenen Browserkonsole zu überprüfen, um ein besseres Verständnis zu erhalten.quelle