119 votes

Différence entre HTMLCollection, NodeLists et tableaux d'objets

J'ai toujours été confus entre les collections HTML, les objets et les tableaux lorsqu'il s'agit de DOM. Par exemple...

  1. Quelle est la différence entre document.getElementsByTagName("td") y $("td") ?
  2. $("#myTable") y $("td") sont des objets (objets jQuery). Pourquoi le fichier console.log affiche-t-il également le tableau d'éléments DOM à côté d'eux, alors qu'il ne s'agit pas d'objets ni d'un tableau ?
  3. Qu'est-ce que l'insaisissable "NodeLists" et comment en sélectionner une ?

Veuillez également fournir toute interprétation du script ci-dessous.

[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>

133voto

Felix Kling Points 247451

Je vais d'abord expliquer la différence entre NodeList y HTMLCollection .

Les deux interfaces sont 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 qu'un NodeList peut contenir tout type de nœud, un HTMLCollection est censé ne contenir que des nœuds d'éléments.
Un site HTMLCollection fournit les mêmes méthodes qu'un NodeList et en plus une méthode appelée namedItem .

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 la méthode getElementsByTagName ) renvoie plusieurs nœuds ou obtient une référence à tous les enfants ( element.childNodes ).

Pour plus d'informations, consultez le site Spécification DOM4 - Collections .

Quelle est la différence entre document.getElementsByTagName("td") y $("td") ?

getElementsByTagName est une méthode de l'interface DOM. Elle accepte un nom de balise en entrée et renvoie une méthode HTMLCollection (voir Spécification DOM4 ).

$("td") est vraisemblablement 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 live (toutes les méthodes ne retournent pas une collection live), c'est-à-dire que tout changement du DOM est reflété dans les collections si elles sont affectées. Ils sont comme un voir sur l'arbre du DOM, alors que les sélections jQuery sont des instantanés de l'arbre du DOM au moment où la fonction a été appelée.

Pourquoi le fichier console.log affiche-t-il également le tableau d'éléments DOM à côté d'eux, alors qu'il ne s'agit pas d'objets ni d'un tableau ?

Les objets jQuery sont en forme de tableau c'est-à-dire qu'ils ont des propriétés numériques et un objet de type length (n'oubliez pas que les tableaux sont eux-mêmes des objets). Les navigateurs ont tendance à afficher les tableaux et les objets de type tableau d'une manière particulière, comme par exemple [ ... , ... , ... ] .

Qu'est-ce que l'insaisissable "NodeLists" et comment en sélectionner une ?

Voir la première partie de ma réponse. Vous ne pouvez pas sélectionnez NodeList ils sont les résultat d'une sélection.

Pour autant que je sache, il n'y a même pas de moyen de créer NodeList de manière programmatique (c'est-à-dire en créant une structure vide et en ajoutant des nœuds plus tard), ils ne sont retournés que par certaines méthodes/propriétés DOM.

37voto

Daniel Imms Points 16273

0. Quelle est la différence entre un HTMLCollection et un NodeList ?

Voici quelques définitions pour vous.

DOM Level 1 Spec - Définitions d'objets divers :

Interface HTMLCollection

Une HTMLCollection est une liste de nœuds. On peut accéder à un nœud individuel par l'index ordinal ou par les attributs name ou id du nœud. Note : Les collections dans le DOM HTML sont supposées être vivantes, ce qui signifie qu'elles sont automatiquement mises à jour lorsque le document sous-jacent est modifié.

DOM Niveau 3 Spec - NodeList

Interface NodeList

L'interface NodeList fournit l'abstraction d'une collection ordonnée de nœuds, sans définir ni contraindre la manière dont cette collection est mise en œuvre. Les objets NodeList dans le DOM sont vivants.

Les éléments de la NodeList sont accessibles via un indice intégral, en partant de 0.

Ils peuvent donc tous deux contenir des données vivantes, ce qui signifie que le DOM sera mis à jour lorsque leurs valeurs le seront. Ils contiennent également un ensemble différent de fonctions.

Vous remarquerez si vous inspectez la console lors de l'exécution de vos scripts que le table L'élément DOM contient à la fois un childNodes NodeList[2] et un children HTMLCollection[1] . Pourquoi sont-ils différents ? Parce que HTMLCollection ne peut contenir que des nœuds d'éléments, NodeList contient également un nœud de texte.

enter image description here

1. Quelle est la différence entre document.getElementsByTagName("td") y $("td") ?

document.getElementsByTagName("td") renvoie un tableau d'éléments DOM (un NodeList ), $("td") est appelé un objet jQuery qui a les éléments de document.getElementsByTagName("td") sur ses propriétés 0 , 1 , 2 etc. La principale différence est que l'objet jQuery est un peu plus lent à récupérer mais donne accès à toutes les fonctions pratiques de jQuery.

2. $("#myTable") y $("td") sont des objets ( jQuery objets). Pourquoi le console.log montrant également le tableau d'éléments DOM à côté d'eux, et ne sont-ils pas des objets et non un tableau ?

Ce sont des objets avec leurs propriétés 0 , 1 , 2 etc. aux éléments du DOM. Voici un exemple simple de son fonctionnement :

jsFiddle

    var a = {
        1: "first",
        2: "second"
    }
    alert(a[1]);

3. Qu'est-ce que l'insaisissable "NodeLists" et comment en sélectionner une ?

Vous les avez récupérés dans votre code, getElementsByClassName y getElementsByTagName tous les deux retournent NodeList s

NodeList

18voto

Note supplémentaire

Quelle est la différence entre une HTMLCollection et une NodeList ?

A HTMLCollection ne contient que des nœuds d'éléments ( tags ) et un Liste de nœuds contient tous les nœuds .

Les types de nœuds les plus importants :

  1. nœud d'élément
  2. nœud attributaire
  3. nœud de texte
  4. nœud de commentaires

types de nœuds

Les espaces blancs à l'intérieur des éléments sont considérés comme du texte, et le texte est considéré comme des nœuds.

Considérez ce qui suit :

<ul id="myList">
  <!-- List items -->
  <li>List item 1</li> 
  <li>List item 2</li>
  <li>List item 3</li>
  <li>List item 4</li>
  <li>List item 5</li>
</ul>

Espace blanc : <ul id="myList"> <li>List item</li></ul>

Pas d'espace : <ul id="myList"><li>List item</li></ul>

Difference between HTMLCollection and a NodeList

10voto

Shraddha Points 491

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 y NodeList aiderait.

Types de nœuds dans le DOM

  • Il existe 12 types de nœuds différents, qui peuvent avoir des enfants de différents types de nœuds :

enter image description here

  • Nous pouvons utiliser les trois propriétés suivantes pour inspecter et demander des informations sur les nœuds du DOM :

    • nodeType Propriété
    • nodeName Propriété
    • nodeValue Propriété
  • Le site nodeType renvoie le type de nœud, sous forme de nombre, du nœud spécifié.

    • Si le nœud est un nœud d'élément, le nodeType retournera 1 .
    • Si le nœud est un nœud d'attribut, la balise nodeType retournera 2 .
    • Si le nœud est un nœud de texte, le nodeType retournera 3 .
    • Si le noeud est un noeud de commentaire, le nodeType retournera 8 .
    • Cette propriété est en lecture seule.

HTMLCollection vs NodeList

enter image description here

Nous pouvons comprendre les différences entre HTMLCollection y NodeList plus clairement avec l'exemple suivant. Veuillez essayer de vérifier les résultats dans la console de votre propre navigateur pour mieux comprendre.

<ul>
  <li>foo</li>
  <li>bar</li>
  <li>bar</li>
</ul>

// retrieve element using querySelectorAll
const listItems_querySelector = document.querySelectorAll('li');
console.log('querySelector', listItems_querySelector);

// retrieve element using childNodes
const list  = document.querySelector('ul')
const listItems_childNodes = list.childNodes;
console.log('childNodes', listItems_childNodes);
const listItems_children = list.children;
console.log('children', listItems_children);

const listItems_getElementsByTagName = document.getElementsByTagName('li');
console.log('getElementsByTagName', listItems_getElementsByTagName);

console.log('*************************');
console.log('add one list item');
console.log('*************************');
list.appendChild(document.createElement('li'));

console.log('querySelector', listItems_querySelector);
console.log('childNodes', listItems_childNodes);
console.log('children', listItems_children);
console.log('getElementsByTagName', listItems_getElementsByTagName);

console.log('*************************');
console.log('add one more list item');
console.log('*************************');
listItems_getElementsByTagName[0].parentNode.appendChild(document.createElement('li'));

console.log('querySelector', listItems_querySelector);
console.log('childNodes', listItems_childNodes);
console.log('children', listItems_children);
console.log('getElementsByTagName', listItems_getElementsByTagName);

2voto

karaxuna Points 11303

$("td") est un objet jQuery étendu et possède des méthodes jQuery, il renvoie un objet jQuery qui contient un tableau d'objets html. document.getElementsByTagName("td") est une méthode raw js et retourne NodeList. Voir cet article

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X