J'ai toujours été confus entre HTMLCollections, objets et tableaux quand il s'agit de DOM. Par exemple...
- Quelle est la différence entre
document.getElementsByTagName("td")
et$("td")
? $("#myTable")
et$("td")
sont des objets (objets jQuery). Pourquoi console.log affiche-t-il également le tableau des éléments DOM à côté d'eux, et ne sont-ils pas des objets et pas un tableau?- Qu'est-ce que les "NodeLists" insaisissables et comment en sélectionner une?
Veuillez également fournir toute interprétation du script ci-dessous.
Je vous remercie
[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
utilisateur1032531
la source
la source
document.querySelectorAll('td')
et$('td')
. (b) La différence fondamentale est que jQuery fonctionne avec son propre type d'objet qui contient, entre autres, une collection numérotée d'éléments HTML; cette collection n'est rien de ce qui précède, et l'objet jQuery est essentiellement un wrapper autour des vrais éléments DOM.Réponses:
Je vais d'abord expliquer la différence entre
NodeList
etHTMLCollection
.Les deux interfaces sont des collections de nœuds DOM. Ils diffèrent par les méthodes qu'ils fournissent et par le type de nœuds qu'ils peuvent contenir. Alors que a
NodeList
peut contenir n'importe quel type de nœud, anHTMLCollection
est censé ne contenir que des nœuds Elément.An
HTMLCollection
fournit les mêmes méthodes que aNodeList
et en plus une méthode appeléenamedItem
.Les collections sont toujours utilisées lorsque l'accès doit être fourni à plusieurs nœuds, par exemple, la plupart des méthodes de sélection (telles que
getElementsByTagName
) retournent plusieurs nœuds ou obtiennent une référence à tous les enfants (element.childNodes
).Pour plus d'informations, consultez la spécification DOM4 - Collections .
getElementsByTagName
est la méthode de l'interface DOM. Il accepte un nom de balise comme entrée et renvoie unHTMLCollection
(voir la spécification DOM4 ).$("td")
est probablement jQuery. Il accepte tout sélecteur CSS / jQuery valide et renvoie un objet jQuery.La plus grande différence entre les collections DOM standard et les sélections jQuery est que les collections DOM sont généralement actives (toutes les méthodes ne renvoient cependant pas une collection active), c'est-à-dire que toutes les modifications apportées au DOM sont reflétées dans les collections si elles sont affectées. Ils sont comme une vue sur l'arborescence DOM, tandis que les sélections jQuery sont des instantanés de l'arborescence DOM au moment où la fonction a été appelée.
Les objets jQuery sont des objets de type tableau , c'est -à- dire qu'ils ont des propriétés numériques et une
length
propriété (gardez à l'esprit que les tableaux ne sont que des objets eux-mêmes). Les navigateurs ont tendance à afficher les tableaux et les objets de type tableau d'une manière spéciale, comme[ ... , ... , ... ]
.Voir la première partie de ma réponse. Vous ne pouvez pas sélectionner les
NodeList
s, ils sont le résultat d'une sélection.Autant que je sache, il n'y a même pas de moyen de créer des
NodeList
s par programme (c'est-à-dire en créant un vide et en ajoutant des nœuds plus tard), ils ne sont retournés que par certaines méthodes / propriétés DOM.la source
td
éléments, l'ajout d'un nouveltd
élément ultérieurement ne mettra pas à jour automatiquement la sélection pour contenir le nouvel élément.NodeList
s ne sont pas en ligne..forEach()
et l'autre pas?0. Quelle est la différence entre un
HTMLCollection
et unNodeList
?Voici quelques définitions pour vous.
Spécification DOM niveau 1 - Définitions d'objets divers :
Spécification DOM niveau 3 - NodeList
Ainsi, ils peuvent tous les deux contenir des données en direct, ce qui signifie que le DOM se mettra à jour lorsque leurs valeurs le feront. Ils contiennent également un ensemble différent de fonctions.
Vous noterez si vous inspectez la console si vous exécutez vos scripts que l'
table
élément DOM contient à la fois achildNodes
NodeList[2]
et achildren
HTMLCollection[1]
. Pourquoi sont-ils différents? CommeHTMLCollection
ne peut contenir que des nœuds d'élément, NodeList contient également un nœud de texte.1. Quelle est la différence entre
document.getElementsByTagName("td")
et$("td")
?document.getElementsByTagName("td")
renvoie un tableau d'éléments DOM (aNodeList
),$("td")
est appelée un objet jQuery qui présente les éléments dedocument.getElementsByTagName("td")
ses propriétés0
,1
,2
, etc. La principale différence est que l'objet jQuery est un peu plus lent à récupérer , mais donne accès à tous les à portée de main Fonctions jQuery.2.
$("#myTable")
et$("td")
sont des objets (jQuery
objets). Pourquoi est-ceconsole.log
affiche également le tableau des éléments DOM à côté d'eux, et ne sont-ils pas des objets et pas un tableau?Ce sont des objets avec leurs propriétés
0
,1
,2
, etc. ensemble aux éléments DOM. Voici un exemple simple: comment cela fonctionne:jsFiddle
3. Qu'est-ce que les "NodeLists" insaisissables et comment en sélectionner une?
Vous les avez récupérés dans votre code
getElementsByClassName
et lesgetElementsByTagName
deux renvoient desNodeList
sla source
length
propriété, et non des noms de propriété numériques. Et qu'est-ce que votre exemple d'alerte d'une chaîne a à voirconsole.log
?Remarque additionnelle
Quelle est la différence entre une HTMLCollection et une NodeList?
Une HTMLCollection contient uniquement des nœuds d'élément ( balises ) et une NodeList contient tous les nœuds .
Il existe quatre types de nœuds:
nodeTypes
Les espaces à l'intérieur des éléments sont considérés comme du texte et le texte est considéré comme des nœuds.
Considérer ce qui suit:
Espace blanc:
<ul id="myList"> <li>List item</li></ul>
Pas d'espace blanc:
<ul id="myList"><li>List item</li></ul>
la source
$("td")
est un objet jQuery étendu et il a des méthodes jQuery, il retourne un objet jquery qui contient un tableau d'objets html.document.getElementsByTagName("td")
est la méthode js brute et renvoie NodeList. Voir cet articlela source
Les objets NodeList sont des collections de Node, renvoyées par exemple par x. propriété childNodes ou méthode document.querySelectorAll () . Dans certains cas, le NodeList est en direct , ce qui signifie que les changements dans les DOM automatiquement mis à jour la collection! Par exemple, Node.childNodes est en direct:
Mais dans certains autres cas, la NodeList est statique , où toute modification dans le DOM n'affecte pas le contenu de la collection. querySelectorAll () renvoie une NodeList statique.
La HTMLCollection est une collection d'éléments vivants et ordonnés (elle est automatiquement mise à jour lorsque le document sous-jacent est modifié). Il peut être le résultat de propriétés comme en tant qu'enfants ou de méthodes comme document.getElementsByTagName () , et ne peut avoir que HTMLElement comme éléments.
HTMLCollection expose également ses membres directement en tant que propriétés par nom et index:
Le HTMLElement n'est qu'un type de nœuds:
Le nœud peut être de plusieurs types . Les plus importants sont les suivants:
<p>
ou<div>
.Donc, une grande différence est que HTMLCollection ne contient que HTMLElements mais NodeList contient également les commentaires, les textes d'espaces blancs (caractères de retour chariot, espaces ..), etc. Vérifiez-le comme dans l'extrait de code suivant:
HTMLCollection et NodeList contiennent la propriété length que vous pouvez utiliser pour boucler sur leurs éléments. N'utilisez pas for ... in ou for each ... in pour énumérer les éléments dans NodeLists, car ils énuméreront également sa longueur et ses propriétés d'élément et provoqueront des erreurs si votre script suppose qu'il ne doit traiter que des objets élément. De plus, for..in n'est pas garanti de visiter les propriétés dans un ordre particulier.
la source
Tant de choses ont déjà été dites, mais j'ai pensé qu'une version plus résumée de la réponse avec un exemple pour expliquer les différences entre
HTMLCollection
etNodeList
serait utile.Types de nœuds dans DOM
Nous pouvons utiliser les trois propriétés suivantes pour inspecter et interroger les nœuds dans DOM:
nodeType
PropriéténodeName
PropriéténodeValue
Propriétéle
nodeType
propriété renvoie le type de nœud, sous forme de nombre, du nœud spécifié.nodeType
propriété retournera 1 .nodeType
propriété retournera 2 .nodeType
propriété retournera 3 .nodeType
propriété retournera 8 .HTMLCollection vs NodeList
Nous pouvons comprendre les différences entre
HTMLCollection
etNodeList
plus clairement avec l'exemple suivant. S'il vous plaît, essayez de vérifier les sorties dans votre propre console de navigateur pour avoir une meilleure compréhension.la source