Introduction au Document Object Model (DOM)
Romuald THION
Semestre pair 2022 UNC
Qu’est ce que le Document Object Model (DOM) ?
xml.dom
dans la bibliothèque standard de PythonLe DOM propose une interface pour naviguer et éditer les documents via leurs représentations en mémoire, le DOM tree.
Source javascript.info
document
nodes
(noeuds) de l’arbreLe système de classes du DOM est riche avec de nombreuses interfaces et abstractions, voir Difference between Node object and Element object?
Interface | Description |
---|---|
EventTarget |
La classe la plus abstraite, avec la gestion événementielle partagée par tous |
Document |
le type de la racine de l’abre DOM, l’objet document |
Interface | Description |
---|---|
Node |
un noeud abstrait de l’arbre, soit un Element soit du texte |
Element |
Une interface abstraite pour les éléments, hérite de Node , commun à HTMLElement et SVGElement |
Interface | Description |
---|---|
HTMLElement |
Un élément HTML (improprement balises), est spécialisé par les éléments concrets comme HTMLAnchorElement |
NodeList |
Un tableau de noeuds, pour stocket les fils par exemple. Similaire mais non identique à Array de la lib standard JS |
… | et bien d’autres |
Source javascript.info
Source MDN
document.querySelector(selector)
sélectionne le premier élément du sélecteurdocument.querySelectorAll(selector)
sélection tous les éléments du sélecteurdocument.getElementById(id)
similaire, mais par identifiant uniquement (plus efficace)Les sélecteurs sont des string dans la syntaxe des sélecteurs CSS. Voir https://javascript.info/searching-elements-dom
document.createElement(tag, options)
créer un objet représentant un élément HTMLparentNode.appendChild(node)
ajoute un dernier fils à un élémentelement.innerHTML
pour lire ou écrire un contenu en HTML directementelement.setAttribute()
et element.getAttribute()
pour modifier les attributs des éléments<script>
src
de l’élément <script>
, attributs possibles async
et defer
:defer
: le script est exécuté après l’analyse de toute la page et exécuté juste avant l’événement DOMContentLoaded
.
async
: le script sera téléchargé puis exécuté quand le navigateur pourra
Ajouter "use strict"
en tout début de programme impose d’interpréter le fichier en mode strict, impacte :
eval
et arguments
this
reste undefined
s’il n’est pas spécifié das une fonction (et ne pointe pas vers windows
)Pratique obligatoire, voir MDN et javascript.info.
Voir l’exemple de demo.html et les fichiers demo_1.js et demo_2.js.
NodeList
du deuxième affichage est-il vide ?$anchors
et pourquoi ? La corriger.console.log()
afficher le nombre de <li>
de la pagedocument.body
un nouveau item avec un lienconsole.log()
, vérifier que le nombre de <li>
de la page a augmentéElement.insertAdjacentElement()
Les événements DOM sont déclenchés pour notifier au code des « changements intéressants » qui peuvent affecter l’exécution du code. Ces changements peuvent résulter d’interactions avec l’utilisateur, […], de changements dans l’état de l’environnement […], et d’autres causes. Chaque événement est représenté par un objet implémentant l’interface Event […].
De nombreux éléments DOM peuvent être paramétrés afin d’accepter (« d’écouter ») ces évènements et d’exécuter du code en réaction afin de les traiter (« gérer »).
MDN Event Event handling (overview)
EventTarget
) peut écouter (listen) certains événementsOn peut attacher un handler de deux façons
element.addEventListener("click", listener, options)
element.onclick = listener
Important : le handler est une fonction :
element.onclick = handlerFunct()
n’est exécuté qu’une seule fois, ceci n’a pas de sens et provoquera une erreur si handlerFunct()
renvoie un objet qui ne peut pas être appelléelement.onclick = handlerFunct
l’appel handlerFunct()
sera exécuté à chaque occurrence de l’événement "click"
this
dans les handlersWhen a function is used as an event handler, its this is set to the element on which the listener is placed
Est-il utile de renvoyer une valeur de retour dans un handler ? Comment peut-on y accéder ?
Convention JS préfixer les identifiants des éléments avec $
et donner le nom camelCase
que l’attribut id
HTML ou le sélecteur utilisé (si possible).
A faire :
demo-btn
pour qu’il ajoute une nouvelle ligne de texte dans l’élément code
avec le nombre de fois où on a cliqué sur le boutons.code
et de RàZ le compteur précédent.