Aller au contenu
M05 · C. Manipuler les éléments d'une page avec DOM

Accéder aux éléments : les sélecteurs

Trouver un élément ou un groupe d'éléments avec getElementById, querySelector et querySelectorAll, et parcourir les résultats.

1Situer

Sur la page des horaires de bus d'Agadir, on veut mettre en évidence les lignes qui desservent l'aéroport, afficher le nombre de départs, et changer le titre. Avant de modifier quoi que ce soit, il faut trouver les bons éléments. Les sélecteurs CSS du module 04 servent à nouveau : ici, c'est JavaScript qui les utilise.

2Comprendre

Trouver des éléments avec les sélecteurs
h2#titre Horaires tr.ligne ✈ 22 · Aéroport · 07:10 tr.ligne 5 · Inezgane · 07:25 tr.ligne ✈ 22 · Aéroport · 08:40 tr.ligne 32 · Taghazout · 09:00 instruction – résultat .length → 4 querySelectorAll → []

La page des horaires : un titre et quatre lignes de bus. Deux d'entre elles vont à l'aéroport.

1 / 6

Les méthodes d’accès

MéthodeRenvoie
document.getElementById('titre')l’élément, ou null
document.querySelector('sélecteur CSS')le premier élément, ou null
document.querySelectorAll('sélecteur CSS')tous les éléments (NodeList, éventuellement vide)
document.getElementsByClassName('ligne')collection vivante (se met à jour seule)
document.getElementsByTagName('tr')idem, par balise

querySelector et querySelectorAll acceptent tous les sélecteurs CSS : c’est ce qu’on utilise le plus aujourd’hui.

Sélecteurs simples et multiples

document.querySelector('#titre');                        // id
document.querySelectorAll('.ligne');                     // classe
document.querySelectorAll('h2, h3');                     // plusieurs sélecteurs
document.querySelectorAll('table td:last-child');        // descendant + pseudo-classe
document.querySelectorAll('[data-dest="aeroport"]');     // attribut

Traiter plusieurs éléments

const lignes = document.querySelectorAll('.ligne');
console.log(lignes.length);                              // 4
lignes.forEach((tr) => tr.classList.add('surligne'));    // pour chacun
const tableau = [...lignes];                             // pour map, filter...

Chercher à l’intérieur d’un élément

querySelector existe aussi sur les éléments : table.querySelectorAll('td') ne cherche que dans ce tableau.

Penser au null

Si le sélecteur ne trouve rien, querySelector renvoie null et la ligne suivante plante (Cannot read properties of null). Vérifiez le sélecteur et que le script s’exécute après le HTML.

Exemple simple

Appeler quelqu'un dans une salle

On peut appeler une personne par son numéro de CIN (unique) : getElementById. Ou demander « toutes les personnes en rouge » : querySelectorAll('.rouge').

document.getElementById('titre');        // un seul : l'id est unique
document.querySelector('.ligne');        // le premier qui correspond
document.querySelectorAll('.ligne');     // tous
Exemple simple

Les mêmes sélecteurs qu'en CSS

Tout ce qui marche dans une feuille de style marche dans querySelector : balise, .classe, #id, descendant, attribut, pseudo-classe.

document.querySelectorAll('table tr:nth-child(odd)');
document.querySelector('input[type="email"]');

3Manipuler

Utilisez les sélecteurs pour trouver les éléments demandés. Chaque consigne se vérifie dans la page ou la console.
Ouvrir dans le lab ↗
Console
  • Changez le titre en « Horaires des bus d'Agadir »
  • Avec querySelectorAll('.ligne'), affichez dans #info « 4 départs »
  • Ajoutez la classe surligne aux lignes [data-dest="aeroport"] (forEach)
  • Avec querySelector, affichez dans la console l'heure du dernier départ (09:00)

4Pratiquer

Exercice 1 · Le bon sélecteur

Écrivez l'instruction qui récupère : (1) l'élément d'id menu ; (2) tous les boutons ; (3) le premier lien du footer ; (4) toutes les cases cochées.

Voir le corrigé
document.getElementById('menu');               // ou querySelector('#menu')
document.querySelectorAll('button');
document.querySelector('footer a');
document.querySelectorAll('input[type="checkbox"]:checked');

Exercice 2 · NodeList et tableau

querySelectorAll renvoie une NodeList. Comment utiliser map ou filter dessus ?

Voir le corrigé
const lignes = [...document.querySelectorAll('.ligne')];   // ou Array.from(...)
const heures = lignes.map((tr) => tr.lastElementChild.textContent);
// forEach, lui, fonctionne directement sur une NodeList.

Exercice 3 · Chercher dans un élément

Comment chercher seulement les cellules du premier <tr> ?

Voir le corrigé
const premier = document.querySelector('tr');
const cellules = premier.querySelectorAll('td');
// querySelector existe aussi sur chaque élément : la recherche se limite à ses descendants.

5Vérifier

1. Que renvoie document.querySelector('.ligne') ?
2. Dans getElementById('titre'), faut-il écrire le
3. Que renvoie querySelectorAll si rien ne correspond ?