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 crochetsdocumenthtml) du document : document.documentElementbody du document : document.bodydocument.getElementById("toto")NodeNode :
n.childNodesn.childNodes.lengthn.firstChildn.lastChildn.parentNoden.nextSiblingn.previousSiblingAttention aux nœuds de texte vides !
ElementGé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.childrene.childElementCount
plus efficace que e.children.lengthe.firstElementChild et e.lastElementChild nextElementSibling et previousElementSiblingPour 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ésultatdocument.getElementsByTagName("h2") : renvoie
une liste « vivante » de tous les éléments h2document.getElementsByClassName("erreur") : renvoie
une liste « vivante » de tous les éléments de classe erreurdocument.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 nullquerySelector 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 texteinnerHTMLinnerHTML fonctionne de la même façon que textContent,
mais en « gardant les éléments HTML » :+= !textContentouterHTML, 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 direct
liveCol = 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)