3 septembre 2023

L'arbre DOM

L’épine dorsale d’un document HTML est constituĂ©e de balises.

Selon le modĂšle d’objets de document (DOM), chaque balise HTML est un objet. Les balises imbriquĂ©es sont des “enfants” de celle qui les entoure. Le texte Ă  l’intĂ©rieur d’une balise est Ă©galement un objet.

Tous ces objets sont accessibles via JavaScript, et nous pouvons les utiliser pour modifier la page.

Par exemple, document.body est l’objet reprĂ©sentant la balise <body>.

L’exĂ©cution de ce code rendra le <body> rouge pendant 3 secondes :

document.body.style.background = 'red'; // make the background red

setTimeout(() => document.body.style.background = '', 3000); // return back

Ici, nous avons utilisĂ© style.background pour changer la couleur d’arriĂšre-plan de document.body, mais il existe de nombreuses autres propriĂ©tĂ©s, telles que :

  • innerHTML – Contenu HTML du nƓud.
  • offsetWidth – la largeur du nƓud (en pixels)
  • 
 etc.

Bientît, nous apprendrons plus de façons de manipuler le DOM, mais nous devons d’abord connaütre sa structure.

Un exemple du DOM

Commençons par le simple document suivant :

<!DOCTYPE HTML>
<html>
<head>
  <title>About elk</title>
</head>
<body>
  The truth about elk.
</body>
</html>

Le DOM représente le HTML comme une structure arborescente de balises. Voici à quoi ça ressemble :

Sur l’image ci-dessus, vous pouvez cliquer sur les nƓuds des Ă©lĂ©ments et leurs enfants s’ouvriront/se rĂ©duiront.

Chaque nƓud de l’arbre est un objet.

Les balises sont des nƓuds d’élĂ©ment (ou simplement des Ă©lĂ©ments) et forment la structure arborescente : <html> est Ă  la racine, puis <head> et <body> sont ses enfants, etc.

Le texte Ă  l’intĂ©rieur des Ă©lĂ©ments forme des nƓuds texte, Ă©tiquetĂ©s comme #text. Un nƓud texte ne contient qu’une chaĂźne de caractĂšres. Il peut ne pas avoir d’enfants et est toujours une feuille de l’arbre.

Par exemple, la balise <title> a le texte "About elk".

Veuillez noter les caractĂšres spĂ©ciaux dans les nƓuds texte :

  • une nouvelle ligne : ↔ (en JavaScript appelĂ© \n)
  • un espace : ␣

Les espaces et les nouvelles lignes sont des caractùres totalement valides, comme les lettres et les chiffres. Ils forment des nƓuds de texte et deviennent une partie du DOM. Ainsi, par exemple, dans l’exemple ci-dessus, la balise <head> contient des espaces avant <title>, et ce texte devient un nƓud #text (il contient une nouvelle ligne et quelques espaces uniquement).

Il n’y a que deux exclusions de haut niveau :

  1. Les espaces et les nouvelles lignes avant <head> sont ignorés pour des raisons historiques.
  2. Si nous mettons quelque chose aprĂšs </body>, alors cela est automatiquement dĂ©placĂ© Ă  l’intĂ©rieur du body, Ă  la fin, car la spĂ©cification HTML exige que tout le contenu soit Ă  l’intĂ©rieur de <body>. Il ne peut donc pas y avoir d’espace aprĂšs </body>.

Dans d’autres cas, tout est simple – s’il y a des espaces (comme n’importe quel caractùre) dans le document, alors ils deviennent des nƓuds texte dans le DOM, et si nous les supprimons, il n’y en aura pas.

Voici des nƓud de texte sans espace :

<!DOCTYPE HTML>
<html><head><title>About elk</title></head><body>The truth about elk.</body></html>
Les espaces au dĂ©but/Ă  la fin de la chaĂźne de caractĂšres et les nƓuds texte uniquement composĂ© d’espaces sont gĂ©nĂ©ralement masquĂ©s dans les outils

Les outils de navigation (qui seront bientĂŽt traitĂ©s) qui fonctionnent avec le DOM n’affichent gĂ©nĂ©ralement pas d’espaces au dĂ©but/fin du texte et des nƓuds texte vides (sauts de ligne) entre les balises.

Les outils de dĂ©veloppement permettent d’économiser de l’espace d’écran de cette façon.

Sur d’autres images DOM, nous les omettons parfois lorsqu’elles ne sont pas pertinentes. Ces espaces n’affectent gĂ©nĂ©ralement pas la façon dont le document est affichĂ©.

Auto-correction

Si le navigateur rencontre du HTML mal formé, il le corrige automatiquement lors de la création du DOM.

Par exemple, la balise la plus haute est toujours <html>. MĂȘme si elle n’existe pas dans le document, elle existera dans le DOM, car le navigateur la crĂ©era. Il en va de mĂȘme pour <body>.

Par exemple, si le fichier HTML est le seul mot "Hello", le navigateur l’enroulera dans <html> et <body>, et ajoutera le <head> requis, et le DOM sera :

Lors de la génération du DOM, les navigateurs traitent automatiquement les erreurs dans le document, ferment les balises, etc.

Un document avec des balises non fermées :

<p>Hello
<li>Mom
<li>and
<li>Dad


 deviendra un DOM normal à mesure que le navigateur lit les balises et restaure les parties manquantes :

Les tableaux ont toujours <tbody>

Un “cas spĂ©cial” intĂ©ressant est celui des tableaux. Selon la spĂ©cification DOM, ils doivent avoir un <tbody>, mais le texte HTML peut (officiellement) l’omettre. Ensuite, le navigateur crĂ©e automatiquement le <tbody> dans le DOM.

Pour le HTML :

<table id="table"><tr><td>1</td></tr></table>

La structure du DOM sera :

Vous voyez ? Le <body> est sorti de nulle part. Vous devez garder cela Ă  l’esprit lorsque vous travaillez avec des tableaux pour Ă©viter les surprises.

Autres types de nƓuds

Il existe d’autres types de nƓuds en plus des Ă©lĂ©ments et des nƓuds de texte.

Par exemple, les commentaires :

<!DOCTYPE HTML>
<html>
<body>
  The truth about elk.
  <ol>
    <li>An elk is a smart</li>
    <!-- comment -->
    <li>...and cunning animal!</li>
  </ol>
</body>
</html>

Nous pouvons voir ici un nouveau type de nƓud de l’arbre – nƓud commentaire, Ă©tiquetĂ© comme #comment, entre deux nƓuds texte.

Nous pouvons penser – pourquoi un commentaire est-il ajoutĂ© au DOM ? Cela n’affecte en rien la reprĂ©sentation visuelle. Mais il y a une rĂšgle – si quelque chose est en HTML, alors il doit aussi ĂȘtre dans l’arborescence DOM.

Tout en HTML, mĂȘme les commentaires, devient une partie du DOM.

MĂȘme la directive <!DOCTYPE...> au tout dĂ©but du html est Ă©galement un noeud du dom. C’est dans l’arborescence du DOM juste avant <html>. Peu de gens le savent. Nous n’allons pas toucher ce nƓud, nous ne le dessinons mĂȘme pas sur les diagrammes pour cette raison, mais il est lĂ .

L’objet document qui reprĂ©sente l’ensemble du document est Ă©galement, formellement, un nƓud dom.

Il existe 12 types de nƓuds. En pratique, nous travaillons gĂ©nĂ©ralement avec 4 d’entre eux :

  1. le document – le “point d’entrĂ©e” dans le dom.
  2. les nƓuds Ă©lĂ©ments – les balises HTML, les blocs de construction de l’arborescence.
  3. les nƓuds texte – contient du texte.
  4. les commentaires – parfois, nous pouvons y mettre des informations, elles ne seront pas affichĂ©es, mais js peut les lire depuis le dom.

Voyez par vous-mĂȘme

Pour voir la structure dom en temps réel, essayez le live DOM viewer. Tapez simplement le document, et il apparaßtra comme un dom en un instant.

Une autre façon d’explorer le dom est d’utiliser les outils de dĂ©veloppement du navigateur. en fait, c’est ce que nous utilisons lors du dĂ©veloppement.

Pour ce faire, ouvrez la page web elk.html, activez les outils de dĂ©veloppement du navigateur et passez Ă  l’onglet Ă©lĂ©ments.

Cela devrait ressembler à ça :

Vous pouvez voir le dom, cliquer sur les éléments, voir leurs détails et ainsi de suite.

Veuillez noter que la structure du dom dans les outils de dĂ©veloppement est simplifiĂ©e. Les nƓuds texte sont affichĂ©s comme du texte. Et il n’y a aucun nƓud texte “vide” (espace uniquement). C’est trĂšs bien, car la plupart du temps nous nous intĂ©ressons aux nƓuds Ă©lĂ©ments.

En cliquant sur le bouton dans le coin supĂ©rieur gauche cela nous permet de choisir un nƓud Ă  partir de la page Web Ă  l’aide d’une souris (ou d’autres pĂ©riphĂ©riques de pointeur) et de “l’inspecter” (faites dĂ©filer jusqu’à l’onglet ÉlĂ©ments). cela fonctionne trĂšs bien lorsque nous avons une Ă©norme page html (et un Ă©norme dom correspondant) et que nous aimerions voir la place d’un Ă©lĂ©ment particulier.

Une autre façon de le faire serait simplement de cliquer avec le bouton droit sur une page Web et de sĂ©lectionner “inspecter” dans le menu contextuel.

Dans la partie droite des outils se trouvent les sous-onglets suivants :

  • Styles – nous pouvons voir le CSS appliquĂ© Ă  l’élĂ©ment en cours, rĂšgle par rĂšgle, y compris les rĂšgles intĂ©grĂ©es (gris). Presque tout peut ĂȘtre modifiĂ© sur place, y compris les dimensions/margins/paddings de la boĂźte ci-dessous.
  • Computed – pour voir le CSS appliquĂ© Ă  l’élĂ©ment par propriĂ©tĂ© : pour chaque propriĂ©tĂ©, nous pouvons voir une rĂšgle qui la lui donne (y compris l’hĂ©ritage CSS et autres).
  • Event Listeners – pour voir les Ă©couteurs d’évĂ©nements attachĂ©s aux Ă©lĂ©ments du DOM (nous les couvrirons dans la prochaine partie du tutoriel).
  • 
 etc.

La meilleure façon de les étudier est de cliquer dessus. La plupart des valeurs sont modifiables sur place.

Interaction avec la console

Comme nous travaillons le DOM, nous pouvons Ă©galement vouloir lui appliquer du JavaScript. Comme : obtenir un nƓud et exĂ©cuter du code pour le modifier, pour voir le rĂ©sultat. Voici quelques conseils pour voyager entre l’onglet Elements et la console.

Pour commencer :

  1. SĂ©lectionnez le premier <li> dans l’onglet ÉlĂ©ments.
  2. Appuyez sur la touche Esc – cela ouvrira la console juste en dessous de l’onglet ÉlĂ©ments.

Maintenant, le dernier élément sélectionné est disponible en tant que $0, le précédent sélectionné est $1, etc.

Nous pouvons exĂ©cuter des commandes sur eux. Par exemple, $0.style.background = 'red' rend l’élĂ©ment de la liste sĂ©lectionnĂ© rouge, comme ceci :

Voilà comment obtenir un nƓud à partir d’Elements dans la console.

Il y a aussi un chemin de retour. S’il y a une variable rĂ©fĂ©rençant un nƓud DOM, alors nous pouvons utiliser la commande inspect(node) dans la console pour la voir dans le volet ÉlĂ©ments.

Ou nous pouvons simplement sortir le nƓud DOM dans la console et explorer “sur place”, comme document.body ci-dessous :

C’est Ă  des fins de dĂ©bogage bien sĂ»r. À partir du chapitre suivant, nous accĂ©derons et modifierons le DOM en utilisant JavaScript.

Les outils de dĂ©veloppement du navigateur sont d’une grande aide au dĂ©veloppement : nous pouvons explorer le DOM, essayer des choses et voir ce qui ne va pas.

Résumé

Un document HTML/XML est reprĂ©sentĂ© dans le navigateur sous forme d’arbre DOM.

  • Les balises deviennent des nƓuds Ă©lĂ©ment et forment la structure.
  • Le texte devient des nƓuds texte.
  • 
 etc, tout en HTML a sa place dans le DOM, mĂȘme les commentaires.

Nous pouvons utiliser les outils de développement pour inspecter le DOM et le modifier manuellement.

Ici, nous avons couvert les bases, les actions les plus utilisĂ©es et les plus importantes pour commencer. Il existe une documentation complĂšte sur Chrome Developer Tools Ă  l’adresse https://developers.google.com/web/tools/chrome-devtools. La meilleure façon d’apprendre les outils est de cliquer ici et lĂ , lire les menus : la plupart des options sont Ă©videntes. Plus tard, lorsque vous les connaissez en gĂ©nĂ©ral, lisez la documentation et dĂ©couvrez le reste.

Les nƓuds DOM ont des propriĂ©tĂ©s et des mĂ©thodes qui nous permettent de voyager entre eux, de les modifier, de se dĂ©placer dans la page, etc. Nous y reviendrons dans les prochains chapitres.

Carte du tutoriel

Commentaires

lire ceci avant de commenter

  • Si vous avez des amĂ©liorations Ă  suggĂ©rer, merci de soumettre une issue GitHub ou une pull request au lieu de commenter.
  • Si vous ne comprenez pas quelque chose dans l'article, merci de prĂ©ciser.
  • Pour insĂ©rer quelques bouts de code, utilisez la balise <code>, pour plusieurs lignes – enveloppez-les avec la balise <pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepen
)