DOM+

Interagir avec le DOM en javascript

Le Document Object Model, abbrégé DOM, est un élément essentiel pour rendre les sites Web interactifs. Il s’agit d’une interface qui permet à JavaScript de manipuler le contenu, la structure et le style d’un site Web.

Quand un site Web permet une interaction – un diaporama d’images, l’affichage d’une erreur lorsqu’un utilisateur tente de soumettre un formulaire incomplet, l’affichage d’un menu de navigation… – c’est le résultat de JavaScript qui accède au DOM et le manipule.

Cette page réunit des commandes JavaScript usuelles pour interagir avec le DOM.

Sélectionner

Sélectionner un seul élément, grâce à un sélecteur CSS

let el_by_id = document.querySelector('#element'); // sélectionne l’élément dont l’id est 'element'
let el_by_class = document.querySelector('.element'); // sélectionne le premier élément dont la class est 'element'
let el_by_src = document.querySelector('img[href="fichier.jpg"]'); // sélectionne un élément image dont l’attribut src est 'fichier.jpg

Sélectionner plusieurs éléments, grâce à un sélecteur CSS

let elements = document.querySelectorAll('.element'); // sélectionne tous les éléments dont la class est 'element'
let elementsenfants = document.querySelectorAll('#truc .element'); // idem, mais uniquement au sein de l’élément dont l’id est truc
// querySelectorAll retourne une NodeList qu’on peut parcourir, notamment grâce à forEach.
// Voir plus bas « Parcourir une liste d'éléments et faire quelque chose avec chaque élément »

Traverser

Est-ce qu’un élément a une class, un id ou une propriété ?

let el = document.querySelector('p'); // sélectionne un élément
let is_important = el.matches('.important'); // est-ce que l’élément à la class important ?  
let is_intro =  el.matches('#intro'); // est-ce que l’élément à l’id intro ?  
let is_second =  el.matches(':nth-child(2)'); // est-ce que l’élément est le deuxième enfant de son parent ?  

Obtenir le parent d'un élément

let el = document.querySelector('p'); // sélectionne un élément
let parent = el.parentElement; // retourne le parent de l’élément

Otenir les éléments qui suivent ou précédent un élément

let el = document.querySelector('p'); // sélectionne un élément
let precedent = el.previousSibling;
let suivant = el.nextSibling;

Obtenir l'élément parent le plus proche par sélecteur

let el = document.querySelector('p'); // sélectionne un élément
let article = el.closest(".article"); // retrourne le plus proche parent dont la class est 'article' 

Sélectionner les enfants d'un élément

let el = document.querySelector('article'); // sélectionne un élément
let children = el.children; // retourne tous les éléments enfants
let first = el.firstChild; // retourne le premier enfant
let last = el.lastChild; // …le dernier enfant

Manipulation

Créer un élément

let button = document.createElement("button");
let paragraph = document.createElement("p");

Remplacer un élément

let old_el = document.querySelector("#old"); // sélectionne l’élément dont l’id est "old"
let new_el = document.createElement('span'); // crée un nouvel élément
new_el.textContent = "NEW!"; // lui affecte un contenu textuel
old_el.parentNode.replaceChild(new_el, old_el); // remplace l’un par l’autre

Vider le contenu d'un élément

let el = document.querySelector('p'); // sélectionne un élément
el.innerHTML = '';

Supprimer un élément

let el = document.querySelector('p'); // sélectionne un élément
el.parentNode.removeChild(el); // on supprime un élément “depuis son parent”

Obtenir ou définir le contenu d'un élément

let p = document.querySelector('p');
let text = p.textContent; // retourne le contenu textuel de l’élément
p.textContent = "Nouveau texte"; // détermine un nouveau contenu textuel

let article = document.querySelector('article');
let html = article.innerHTML; // retourne le contenu HTML de l’élément
article.innerHTML = "<p>Nouveau texte HTML</p>"; // détermine un nouveau contenu HTML

Insérer un élément après ou avant un autre

let reference = document.querySelector("h1"); // sélectionne un élément de référence
let new_el = document.createElement('h2'); // crée un nouvel élément
new_el.textContent = "NEW!"; // lui affecte un contenu textuel
reference.before(new_el); // insère avant le h1
reference.after(new_el);  // insère après le h1

Ajouter un élément à l’intérieur d’un autre (au début ou à la fin)

let el = document.querySelector("#container"); // sélectionne un élément
let first = document.createElement("header");
let last = document.createElement("footer");
el.append(last); // insère le footer à l’intérieur du #container, en dernière position
el.appendChild(last); // idem, avec quelques différences subtiles
el.prepend(first); // insère le header à l’intérieur du #container, en première position

Créer une copie d'un élément

let source = document.querySelector(".source"); // sélectionne l’élément dont la class est "source";
let deep_clone = source.cloneNode(true); // clone l’élément source avec son contenu
let empty_clone = source.cloneNode(); //  clone l’élément source sans son contenu

Parcourir une liste d'éléments et faire quelque chose avec chaque élément.

let elements = document.querySelectorAll('.element'); // sélectionne tous les éléments dont la class est 'element'
// fait un truc pour chaque élément de la liste d’éléments sélectionnés
elements.forEach( el => {
  el.style.color = "red"; // modifie la couleur de chaque élément 
})

Attributs

Ajouter, supprimer et tester des classes

let el = document.querySelector('p'); // sélectionne un élément
el.classList.add("selected"); // ajoute la class "selected" à l’élément
el.classList.remove("selected"); // supprime la class "selected" de l’élément
el.classList.toggle("selected"); // ajoute ou supprime la class "selected" de l’élément
if(el.classList.contains("selected")) {}; // vérifie si l’élément a la class "selected"

Définir, obtenir ou supprimer des attributs

let el = document.querySelector('img'); // sélectionne un élément
el.getAttribute("src"); // retourne l’attribut src d’un élément;
el.setAttribute("src", "fichier.jpg"); // affecte une nouvelle valeur à l’attribut src d’un élément;

Définir, obtenir ou supprimer des attributs de données

// on peut attacher dess données arbitraires à un élément frâce aux attrinbuts “data-”
// en HTML, on peut les créer ainsi : <div data-bidule="machin"></div>
let el = document.querySelector('p'); // sélectionne un élément
let bidule = el.dataset.bidule; // retourne la propriété "data-bidule" de l’élément
el.dataset.bidule = "truc"; // ajoute la propriété de données ou modifie la propriété "data-bidule"

Styles

Obtenir ou définir les styles CSS des éléments

let el = document.querySelector('p'); // sélectionne un élément
let style = window.getComputedStyle ? getComputedStyle(el, null) : el.currentStyle; // retourne l’ensemble des styles qui s’appliquent à l’élément
console.log(style.backgroundColor); // renvoie la propriété d’arrière plan de l’élément
el.style.display = 'none'; // affecte une nouvelle valeur de 'display' au style de l’élément
el.fontSize = "12px"; // affecte une nouvelle propriété de font-size 

Obtenir ou définir le scroll d'un élément

let el = document.querySelector('div'); // sélectionne un élément
console.log(el.scrollLeft, el.scrollTop); // renvoie la position de scroll de l’élément
el.scrollLeft = 100; // détermine de nouvelles positions
el.scrollTop = 500;

Obtenir la position d'un élément

let el = document.querySelector('img'); // sélectionne un élément

// retourne la position top et left de l’élément par rapport à son parent
console.log(el.offsetLeft, el.offsetTop); 

// retourne la position top et left de l’élément par rapport au document
let rect = el.getBoundingClientRect(),
  scrollLeft = window.pageXOffset,
  scrollTop = window.pageYOffset;
console.log("top: " + (rect.top + scrollTop)); // top
console.log("left: " + (rect.left + scrollLeft)); // left

Obtenir la largeur et la hauteur d'un élément

let el = document.querySelector('img'); // sélectionne un élément
let width = el.offsetWidth;
let height = el.offsetHeight;
// ou bien, alternativement :
let rect = el.getBoundingClientRect();
let width = rect.width;
let height = rect.height;

Évènements

Gérer les événements d’un élément (click, submit, survol, etc)

let el = document.querySelector("a"); // sélectionne un élément
// pour un seul évènement click
el.onclick = () => {
  alert("Clicked!")
};
// pour laisser la possibilité de plusieurs évènements click
el.addEventListener("click", () => {
  alert("Clicked!")
});

// Évènements utiles :
// clicks : click, dblclick
// souris : mousedown, mouseenter, mouseleave, mousemove, mouseover, mouseout, mouseup
// médias : pause, play, playing, timeupdate, canplaythrough, canplay, ended
// scroll : scroll
// chargement : load
// formulaire : submit
// tactile : touchcancel, touchend, touchmove,  touchstart
// clavier : keydown, keypress, keyup
// drag : drag, dragend, dragenter, dragleave, dragover, dragstart
// print : beforeprint

Empêcher l'action par défaut des événements

let el = document.querySelector("a"); // sélectionne un élément
el.onclick = (e) => {
  e.preventDefault(); // empêche l’évènement par défaut
  e.stopPropagation(); // empêche l’évènement de “remonter” dans l’arbre du DOM
}

Récupérer les événements clavier

document.addEventListener("keydown" (e) => {
  // le caractère saisi
  console.log(e.key);
  // les éventuels modificateurs 
  console.log((e.shiftKey ? ' shiftKey' : '') + (e.ctrlKey ? ' ctrlKey' : '') + (e.altKey ? ' altKey' : '') + (e.metaKey ? ' metaKey' : '') );
  // touches spéciales
  if (e.key === "Escape") console.log("Escape");
  if (e.key === "Enter") console.log("Enter");
  if (e.key === "Space") console.log("Space");
  if (e.key === "ArrowLeft") console.log("ArrowLeft");
  if (e.key === "Backspace") console.log("Backspace");
  // combinaison de touches
  if (e.ctrlKey && e.key === "z") {
    console.log("Annuler ?"); 
  }
})

Obtenir la position actuelle de la souris

document.addEventListener('mouseMove', (e) => {
  let pageX = e.pageX; // position X
  let pageY = e.pageY; // position Y
});

Exécuter du code lorsque le document est prêt

// Une page ne peut pas être manipulée en toute sécurité tant que le document n'est pas "prêt". 
// Voici comment s'assurer que le code n'est pas exécuté prématurément.
document.addEventListener('DOMContentLoaded', function(){
  // le document est prêt
});

Déclencher un événement programmatiquement

let el = document.querySelector('#input'); // sélectionne un élément

// tous les éléments :
el.click();

// inputs, textareas :
el.focus();
el.blur();

// form :
let form = document.querySelector('form');
form.submit();
form.reset();