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>

1voto

saeed serpooshan Points 356

Le site Liste de nœuds Les objets sont des collections de Node, retournés par exemple par x. childNodes propriété ou document.querySelectorAll() méthode. Dans certains cas, la NodeList est en direct ce qui signifie que les changements dans le DOM mettent automatiquement à jour la collection ! Par exemple, Node.childNodes est vivant :

var c = parent.childNodes; //assume c.length is 2
parent.appendChild(document.createElement('div'));
//now c.length is 3, despite the `c` variable is assigned before appendChild()!!
//so, do not cache the list's length in a loop.

Mais dans certains autres cas, la NodeList est statique où tout changement dans le DOM n'affecte pas le contenu de la collection. querySelectorAll() renvoie une NodeList statique.

Le site HTMLCollection est un vivante et ordonnée collection d'éléments (elle est automatiquement mise à jour lorsque le document sous-jacent est modifié). Il peut être le résultat de propriétés comme enfants ou des méthodes comme document.getElementsByTagName() et ne pouvait avoir que de l'élément HTMLE comme leurs articles.

HTMLCollection expose également ses membres directement en tant que propriétés par le nom et l'index :

var f = document.forms; // this is an HTMLCollection
f[0] === f.item(0) === f.myForm //assume first form id is 'myForm'

Le HTMLElement n'est qu'un type de nœuds :

Node << HTMLElement inheritance

Le nœud peut être plusieurs types . Les plus importants sont les suivants :

  • élément (1) : Un nœud d'élément tel que <p> ou <div> .
  • attribut (2) : Attribut d'un élément. Les attributs des éléments n'implémentent plus l'interface Node dans la spécification DOM4 !
  • texte (3) : Le texte réel de l'élément ou de l'attribut.
  • commentaire (8) : Un nœud de commentaire.
  • document (9) : Un nœud de document.

Ainsi, une grande différence est que HTMLCollection ne contient que des HTMLElements mais que NodeList contient également les commentaires, les textes des espaces blancs (caractères de retour de chariot, espaces ), etc. Vérifiez-le comme dans l'extrait suivant :

function printList(x, title) {
  console.log("\r\nprinting "+title+" (length="+x.length+"):");
  for(var i=0; i<x.length; i++) {
    console.log("  "+i+":"+x[i]);
  }
}

var elems = document.body.children; //HTMLCollection
var nodes = document.body.childNodes; //NodeList

printList(elems, "children [HTMLCollection]");
printList(nodes, "childNodes [NodeList]");

<div>para 1</div><!-- MyComment -->
<div>para 2</div>

Le HTMLCollection et le NodeList contiennent tous deux l'attribut longueur que vous pouvez utiliser pour boucle sur leurs articles. N'utilisez pas for...in ou for each...in pour énumérer les éléments dans les NodeLists, car ils énuméreront également sa longueur et les propriétés des éléments et provoqueront des erreurs si votre script suppose qu'il doit uniquement traiter les objets éléments. De plus, il n'est pas garanti que for..in visite les propriétés dans un ordre particulier.

for (var i = 0; i < myNodeList.length; i++) {
  var item = myNodeList[i];
}

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