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();

Contre la destruction de notre modèle social.
Contre l’augmentation croissante des inégalités.
Contre la stigmatisation systématique des plus fragiles.
Contre la négation de la valeur de l’art et de la culture.
Contre le cloud et son monde, ce site est en grève.