Règles pour une représentation graphique de l'arbre DOM
<personne> <nom famille="Dupont" prenom="Jean" /> <adresse> <rue numero="46" >Saint-Pierre</rue> <ville codePostal="14000">Caen</ville> </adresse> <telephone type="domicile">0231563459</telephone> </personne>Représentation graphique
Voir la référence sur MDN
Document
: le document (élément racine) duquel on a construit le DOMNode
: les nœuds, qui peuvent être de différents types :
Element
: nœuds éléments HTML (ou XML), contiennent d'autres nœuds (de type Element
, Comment
…)CharacterData
: nœuds de texte, contiennent du texte (objet Text
)Event
: les événementsNodeList
: liste de nœuds (par exemple la liste des fils d'un nœud)HTMLCollection
: liste d'élémentsUne collection peut être statique ou « vivante » (live), c'est-à-dire que les changements du DOM y sont reflétés en permanence.
NodeList
et HTMLCollection
)
ne sont pas des tableaux, mais des objets particuliers qui ont aussi un attribut
length
et dont les éléments sont accessibles avec les crochetsdocument
html
) du document : document.documentElement
body
du document : document.body
document.getElementById("toto")
Node
Node
:
n.childNodes
n.childNodes.length
n.firstChild
n.lastChild
n.parentNode
n.nextSibling
n.previousSibling
Attention aux nœuds de texte vides !
Element
Généralement, on préfère parcourir le DOM en ignorant les nœuds de texte (notamment à cause des nœuds de texte vides)
Element
permettent de
le faire simplement :
e.children
e.childElementCount
plus efficace que e.children.lengthe.firstElementChild
et e.lastElementChild
nextElementSibling
et previousElementSibling
Pour accéder et modifier les attributs d'un élément HTML : méthodes
getAttribute("toto")
et setAttribute("toto", "valeur")
, hasAttribute("toto")
,
getAttributeNames()
… de l'interface Element
id
: identifiant d'un élémenthref
: attribut href, pour un liensrc
: attribut src, pour une imagestyle
: objet représentant le contenu de l'attribut style
(voir plus loin)classList
: objet représentant le contenu de l'attribut class
(voir plus loin)src
d'un HTMLImageElement
contient l'URL absolue vers l'image, telle que résolue par le navigateur)
document.getElementById("toto")
:
utilisation de l'identifiant id
d'un élément
<body> <p class="intro">bla bla bla</p> <div id="toto">Bonjour le monde</div> <script> var maDiv = document.getElementById("toto"); maDiv.setAttribute("style", "color: red;"); // ou bien maDiv.style.color="red"; </script> </body>Résultat
document.getElementsByTagName("h2")
: renvoie
une liste « vivante » de tous les éléments h2
document.getElementsByClassName("erreur")
: renvoie
une liste « vivante » de tous les éléments de classe erreur
document.querySelector("#tutu div.erreur")
: renvoie
le premier élément qui correspond au sélecteur CSS donnédocument.querySelectorAll("#tutu div.erreur")
: renvoie
une liste statique de tous les éléments correspondant au sélecteur CSS donné::before
, ::first-letter
…
à ne pas confondre avec les pseudo-classes)
sont inutiles, car ils ne correspondent à aucun élément de l'arbre et renvoient
donc toujours null
querySelector
est moins efficace que les
getElementsBy
, en particulier pour sélectionner un identifiant.
En pratique, à moins que vous ne fassiez des modifications vraiment intensives du DOM, la différence est négligeable : il est conseillé de préférer
la simplicité d'implémentation que permet querySelector
.
style
de chaque objet DOM :
document.getElementById("toto").style.color="green"; document.getElementById("toto").style.backgroundColor="blue"; document.getElementById("toto").style.display="none";
.style
correspondent uniquement au contenu de l'attribut HTML style="…"
getComputedStyle(element)
classList
des éléments (ne marche pas pour IE<10) :
toto = document.getElementById("toto"); toto.classList.add("tutu"); toto.classList.remove("titi"); if (toto.classList.contains("foobar")) toto.classList.toggle("erreur");
nodeValue
:
var para = document.querySelector("p"); alert(para.firstChild.nodeValue); // affiche le texte para.firstChild.nodeValue = "nouveau texte !";
em
), auquel cas on ne remplace pas tout.textContent
,
qui correspond au texte concaténé de tous les descendants du nœudtextContent
on remplace tous les descendants
du nœud par un unique nœud de texteinnerHTML
innerHTML
fonctionne de la même façon que textContent
,
mais en « gardant les éléments HTML » :+=
!textContent
outerHTML
, qui
correspond au code HTML de l'élément entier, pas seulement son contenu.var newP = document.createElement("p"); var newTxt = document.createTextNode("contenu"); newP.appendChild(newTxt);
var maDiv = document.getElementById("toto"); maDiv.appendChild(newP);
appendChild()
sur un nœud
déjà attaché dans l'arbre, le nœud n'est pas copié mais déplacé
Les éléments que l'on crée n'ont aucun attribut, il faut les ajouter explicitement
var monA = document.createElement("a"); monA.setAttribute("href", "http://example.com"); monA.setAttribute("title", "Exemple"); var monText = document.createTextNode("Le site example.com"); monA.appendChild(monText); maDiv.appendChild(monA);
papa.removeChild(toto)
supprimer un élément : toto.parentNode.removeChild(toto)
papa.insertBefore(nouveau, toto)
insertAdjacentElement
,
existe aussi en version texte (insertAdjacentText
) et HTML (insertAdjacentHTML
— mêmes remarques que pour innerHTML
)toto.cloneNode(true)
papa.replaceChild(nouveau, toto)
NodeList
et HTMLCollection
sont « vivantes »,
c'est-à-dire qu'elles sont actualisées en directliveCol = document.getElementsByTagName("li"); tableau = Array.prototype.slice.call(liveCol); /* on parcourt le tableau, qui reste statique */ for (i = 0; i < tableau.length; i++) if (tableau[i].classList.contains("suppr")) tableau[i].parentNode.removeChild(tableau[i]);
querySelectorAll
renvoie une collection statique,
mais c'est un cas rare.querySelectorAll
,
à moins d'en avoir besoin dans une tight loop, auquel cas ça vaut le coup
de se poser la question et d'évaluer les performances (par exemple
avec jsperf)