Aller au contenu
M05 · C. Manipuler les éléments d'une page avec DOM

L'arbre DOM : nœuds, parents et enfants

Comprendre comment le navigateur représente la page sous forme d'arbre d'objets, connaître l'objet document, et se déplacer d'un nœud à l'autre (parent, enfants, frères).

1Situer

La page d'un hammam traditionnel de Fès liste ses soins dans un menu. Pour que JavaScript puisse surligner un soin, afficher son prix ou en ajouter un, il doit savoir où se trouve chaque élément et comment il est relié aux autres. Le navigateur lui fournit pour cela une carte de la page : l'arbre DOM.

2Comprendre

Se déplacer dans l'arbre DOM
body h2 ul#soins p.note li li li GommageRhassoulMassage firstElementChild nextElementSibling parentElement nextElementSibling const liste = document.getElementById('soins')

Le navigateur a transformé le HTML en arbre : body contient h2, ul et p ; ul contient trois li.

1 / 6

Du HTML à l’arbre

Quand le navigateur charge la page, il lit le HTML et construit en mémoire un arbre d’objets : le DOM (Document Object Model). Chaque balise devient un nœud élément, chaque texte un nœud texte.

JavaScript ne modifie pas le fichier HTML : il modifie cet arbre, et le navigateur redessine la page.

L’objet document

document est la racine de l’arbre. Quelques propriétés :

document.title              // le titre de l'onglet
document.body               // l'élément <body>
document.head               // l'élément <head>
document.documentElement    // l'élément <html>

Se déplacer dans l’arbre

PropriétéVa vers
parentElement (parentNode)le parent
childrenles enfants éléments
childNodestous les nœuds enfants, y compris les textes
firstElementChild, lastElementChildle premier, le dernier enfant
nextElementSibling, previousElementSiblingle frère suivant, précédent
closest('section')l’ancêtre le plus proche qui correspond
const liste = document.getElementById('soins');
liste.children[0].textContent            // "Gommage au savon noir"
liste.parentElement                      // <body>
liste.nextElementSibling.className       // "note"

Le type d’un nœud

nodeType vaut 1 pour un élément, 3 pour un texte. nodeName (ou tagName) donne le nom de la balise en majuscules : "LI".

Exemple simple

L'arbre généalogique

Dans une famille, chacun a un parent, peut avoir des enfants et des frères et sœurs. Dans le DOM, chaque balise est un nœud qui a un parent (parentElement), des enfants (children) et des frères (nextElementSibling).

<ul>            ← parent
  <li>Gommage</li>   ← enfant, frère du suivant
  <li>Massage</li>
</ul>
Exemple simple

Le plan du centre commercial

Sur le plan, on part de l'entrée et on suit les couloirs. Dans le DOM, on part de document et on descend jusqu'à l'élément voulu.

document.body.firstElementChild   // le premier élément du body

3Manipuler

Sans utiliser querySelector, naviguez dans l'arbre à partir de la liste #soins pour répondre aux consignes. Les réponses s'affichent dans la console.
Ouvrir dans le lab ↗
Console
  • Affichez le texte du premier soin avec firstElementChild.textContent
  • Affichez le texte du dernier soin avec lastElementChild
  • Affichez la classe de l'élément qui suit la liste (nextElementSibling.className : note)
  • Ajoutez la classe choisi au deuxième soin (children[1].classList.add)

4Pratiquer

Exercice 1 · Dessiner l'arbre

Dessinez l'arbre DOM de : <body><header><h1>Fès</h1></header><main><p>Soins</p><p>Prix</p></main></body>

Voir le corrigé
body
├── header
│   └── h1  ("Fès")
└── main
    ├── p  ("Soins")
    └── p  ("Prix")

Exercice 2 · Nœuds et éléments

Pourquoi liste.childNodes.length vaut-il 7 alors que liste.children.length vaut 3 ?

Voir le corrigé
childNodes contient tous les nœuds, y compris les nœuds texte formés par
les retours à la ligne et les espaces entre les <li> (4 nœuds texte + 3 li).
children ne contient que les éléments (les balises). On utilise donc
children, firstElementChild, nextElementSibling...

Exercice 3 · Remonter à l'ancêtre

À partir d'un <li>, comment trouver la <section> qui le contient, quel que soit le nombre de niveaux ?

Voir le corrigé
const section = li.closest('section');
// closest remonte les ancêtres jusqu'au premier qui correspond au sélecteur

5Vérifier

1. Que représente l'objet document ?
2. Quelle propriété donne le parent d'un élément ?
3. Si on modifie le DOM avec JavaScript, le fichier HTML change-t-il ?