Apprends à sélectionner, créer, modifier et supprimer des éléments HTML en utilisant le Document Object Model.
Le Document Object Model (DOM) est une interface de programmation qui représente une page HTML sous forme d'arbre d'objets. Quand un navigateur charge un document HTML, il analyse le balisage et construit cette structure arborescente en mémoire. Chaque élément HTML, attribut et morceau de texte devient un nœud dans l'arbre.
document
└── html
├── head
│ └── title
│ └── "My Page"
└── body
├── h1
│ └── "Hello World"
└── p
└── "Welcome to my site."JavaScript peut lire et modifier chaque partie de cet arbre — changer du texte, mettre à jour des styles, ajouter de nouveaux éléments, supprimer des éléments existants et répondre aux interactions de l'utilisateur.
Le point d'entrée vers le DOM est l'objet document. Il représente la page HTML entière et fournit des méthodes pour trouver et manipuler des éléments :
console.log(document.title); // The page title
console.log(document.body); // The <body> element
console.log(document.documentElement); // The <html> elementComprendre le DOM est essentiel pour rendre les pages web interactives. Chaque fois que tu cliques sur un bouton, que tu soumets un formulaire, ou que tu vois du contenu se mettre à jour dynamiquement sur un site web, le DOM est manipulé par JavaScript.
Avant de pouvoir modifier un élément, tu dois le sélectionner. Le DOM fournit plusieurs méthodes pour cela :
getElementById() — sélectionne un seul élément par son attribut id :
const header = document.getElementById('main-title');Retourne l'élément ou null si aucun élément avec cet id n'existe.
querySelector() — sélectionne le premier élément qui correspond à un sélecteur CSS :
const firstButton = document.querySelector('button');
const submitBtn = document.querySelector('#submit-btn');
const highlight = document.querySelector('.highlight');
const navLink = document.querySelector('nav a.active');C'est la méthode de sélection la plus polyvalente car elle accepte n'importe quel sélecteur CSS valide — IDs, classes, types d'éléments, sélecteurs d'attributs, combinateurs, et plus encore.
querySelectorAll() — sélectionne tous les éléments qui correspondent à un sélecteur CSS :
const allButtons = document.querySelectorAll('button');
const items = document.querySelectorAll('.list-item');Cela retourne une NodeList, qui est similaire à un tableau mais n'est pas un vrai tableau. Tu peux la parcourir avec forEach ou for...of, et accéder aux éléments par index :
allButtons.forEach(btn => console.log(btn.textContent));
console.log(allButtons[0]); // first button
console.log(allButtons.length); // number of matchesIl existe aussi des méthodes plus anciennes comme getElementsByClassName() et getElementsByTagName() qui retournent des collections vivantes — elles se mettent automatiquement à jour quand le DOM change. Cependant, querySelector et querySelectorAll sont généralement préférées pour leur flexibilité.
// These return live HTMLCollections:
const divs = document.getElementsByTagName('div');
const highlights = document.getElementsByClassName('highlight');Une fois que tu as sélectionné un élément, tu peux modifier son contenu, ses styles et ses attributs.
Changer le contenu textuel :
textContent — obtient ou définit le texte brut. Sécurisé — il n'analyse pas le HTML :
const heading = document.querySelector('h1');
heading.textContent = 'New Heading';innerHTML — obtient ou définit le contenu HTML, y compris les balises :
const container = document.querySelector('#output');
container.innerHTML = '<strong>Bold</strong> text';Avertissement de sécurité : N'utilise jamais innerHTML avec des données fournies par l'utilisateur. Cela peut créer des vulnérabilités de Cross-Site Scripting (XSS) car le navigateur exécutera toutes les balises <script> ou gestionnaires d'événements dans la chaîne de caractères. Utilise textContent pour les données utilisateur.
Changer les styles :
La propriété style te donne accès aux styles inline d'un élément. Les noms de propriétés CSS sont écrits en camelCase :
const box = document.querySelector('.box');
box.style.backgroundColor = 'blue';
box.style.fontSize = '20px';
box.style.border = '2px solid black';Travailler avec les classes CSS est généralement mieux que les styles inline :
const element = document.querySelector('.card');
element.classList.add('active'); // Add a class
element.classList.remove('hidden'); // Remove a class
element.classList.toggle('expanded'); // Add if missing, remove if present
element.classList.contains('active'); // Check if class exists → true/falseDéfinir et obtenir des attributs :
const link = document.querySelector('a');
link.setAttribute('href', 'https://example.com');
link.setAttribute('target', '_blank');
console.log(link.getAttribute('href')); // 'https://example.com'JavaScript peut créer des éléments entièrement nouveaux et les ajouter à la page, ou supprimer des éléments existants.
Créer des éléments :
const newParagraph = document.createElement('p');
newParagraph.textContent = 'This paragraph was created by JavaScript.';
newParagraph.classList.add('dynamic');À ce stade, l'élément existe en mémoire mais n'est pas encore sur la page. Tu dois l'insérer dans le DOM.
Ajouter des éléments à la page :
appendChild() — ajoute un élément enfant à la fin d'un parent :
const container = document.getElementById('content');
container.appendChild(newParagraph);append() — comme appendChild, mais peut aussi accepter des chaînes de caractères et plusieurs arguments :
container.append(newParagraph, 'Some text', anotherElement);insertBefore() — insère avant un élément enfant spécifique :
const reference = document.querySelector('#content p:first-child');
container.insertBefore(newParagraph, reference);insertAdjacentHTML() — insère du HTML à une position spécifique par rapport à l'élément :
container.insertAdjacentHTML('beforeend', '<p>New content</p>');
// Positions: 'beforebegin', 'afterbegin', 'beforeend', 'afterend'Supprimer des éléments :
const toRemove = document.querySelector('.old-content');
toRemove.remove(); // Removes the element from the DOMAstuce de performance : Quand tu ajoutes beaucoup d'éléments à la fois, utilise un DocumentFragment pour regrouper les modifications. Cela évite de déclencher un re-rendu de la page pour chaque élément :
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {
const li = document.createElement('li');
li.textContent = 'Item ' + i;
fragment.appendChild(li);
}
document.getElementById('big-list').appendChild(fragment);
// Only one re-render instead of 100!<div id="app">
<h2>Dynamic Content</h2>
<ul id="list"></ul>
</div>
<script>
const items = ['Learn HTML', 'Learn CSS', 'Learn JavaScript'];
const list = document.getElementById('list');
// Create and append list items
items.forEach(function(text) {
const li = document.createElement('li');
li.textContent = text;
li.style.padding = '4px 0';
list.appendChild(li);
});
// Add a new item
const newItem = document.createElement('li');
newItem.textContent = 'Build a project!';
newItem.style.fontWeight = 'bold';
newItem.style.color = 'green';
list.appendChild(newItem);
// Modify the heading
const heading = document.querySelector('#app h2');
heading.style.color = 'navy';
heading.textContent = 'My Learning Path';
</script>Quelle méthode sélectionne le premier élément correspondant à un sélecteur CSS ?