
Le contrĂŽle du DOM par le JavaScript
Document Object Model = lors du chargement dâune page web, le navigateur crĂ©e un âarbre dâobjetsâ appelĂ© DOM, avec chaque objet possĂ©dant des propriĂ©tĂ©s, des mĂ©thodes, des Ă©vĂ©nements. Les Ă©lements Ă la base de lâarbre sont : la balise racine<html> >> la balise <head> >> les balises <title>, <meta charset=âutf-8â>, <link rel=âstylesheetâ href="">,⊠>> la balise <body> >> les balises <h1>, <div>, <p>, <span>, <ol>, <li>, <header>, <footer>âŠ
Le JavaScript fonctionne conjointement avec le HTML et le CSS.
La DOM HTML est une API (Application Programming Interface) pour JavaScript, qui peut :
- modifier, ajouter, supprimer des éléments HTML
- modifier, ajouter, supprimer leurs attributs
- modifier, ajouter, supprimer les styles CSS
- réagir aux événements HTML
- modifier, ajouter, supprimer les événements HTML
Le JavaScript est intĂ©grĂ© au fichier HTML grĂące Ă la balise <script>, Ă laquelle il est possible de passer directement du code JavaScript ou bien de lier un fichier JavaScript avec lâattribut src.
BP : sĂ©parer les rĂŽles et ressources â> on met le script JavaScript dans son propre fichier (souvent dans un rĂ©pertoire dĂ©diĂ©).
<script src="js/script.js"></script>Lâappel du script peut ĂȘtre fait dans le <head> ou tout Ă la fin, juste avant la fermeture du </body> : le choix est fait selon quand on a besoin du script.
BP : mieux vaut appeler le script Ă la fin, pour ne pas ralentir le chargement de la page web.
BP : garder la console du navigateur ouverte tout le temps, pour suivre les erreurs au fil de lâeau.
Propriétés et méthodes accessibles
LâaccĂšs Ă un Ă©lĂ©ment HTML avec JavaScript se fait par son id, son tag name (sa balise associĂ©e), sa class name, son sĂ©lecteur CSS ou sa collection dâobjets.
Les principales propriĂ©tĂ©s sont accessibles avec document. suivi de lâĂ©lĂ©ment concernĂ© (head, title, bodyâŠ).
Les principales méthodes sont accessibles avec document. suivi de la méthode concernée :
- Lecture :
document.getElementByID();
document.getElementsByTagName();
document.getElementsByClassName();
document.querySelector();
document.querySelectorAll();
// exemples de collection d'objets : document.images ou document.links- Ecriture
document.write();
document.createElement();
document.createAttribute();
document.createTextNode();
Une fois lâĂ©lĂ©ment rĂ©cupĂ©rĂ©, il possĂšde des propriĂ©tĂ©s et de mĂ©thodes qui lui sont propres, telles que :
// exemples de proprietes
unElement.id;
unElement.value;
unElement.attributes;
unElement.innerText;
unElement.innerHTML;
unElement.firstElementChild;
unElement.lastElementChild;
unElement.nextElementSibling;
unElement.previousElementSibling;
unElement.parentElement;
// exemples de methodes
// -- lecture
unElement.getAttribute();
unElement.hasAttribute();
unElement.hasAttributes();
unElement.focus();
unElement.getElementsByTagName();
unElement.querySelector();
// -- ecriture
unElement.insertAdjacentElement();
unElement.setAttribute();
unElement.appendChild();
unElement.replaceChild();
unElement.removeChild();
unElement.removeAttribute();
// -- autre
unElement.focus();
Objet racine dâune page web
Le âdocumentâ fait partie dâun objet encore plus grand : âwindowâ. Il possĂšde des fonctions comme alert() ou prompt() et permet dâaccĂ©der Ă dâautres objets :
âconsoleâ ~ log(), clear()
âhistoryâ ~ back(), forward(), go()
âlocationâ ~ href
Quelques exemples :
// modifier des elements
document.title = "Un beau titre de document";
document.getElementsByTagName("h1")[0].innerText = "Un titre principal";
document.getElementById("un-id").innerHTML = "du texte";
// creer un element
let une_div = document.createElement("div");
// modifier le style d'un element
une_div.style.backgroundColor = "lightblue";
// ajout de l'element juste cree au body
document.body.appendChild(une_div);
// autre facon de modifier un element
une_div.innerHTML += "<br><button>un boutton</button><br>";
// creer une pop-up
alert("Je suis une pop-up !");
ĂvĂ©nements
Une fonction peut ĂȘtre appelĂ©e lorsquâun Ă©vĂ©nement se produit, parce que le navigateur ou lâutilisateur fait quelque chose.
Un événement concerne un élément HTML. Le JavaScript réagit à cet événement.
Principaux événements :
onchange: un élément HTML a été modifié
onclick: lâutilisateur a cliquĂ© sur un Ă©lĂ©ment HTML
onmouseover: lâutilisateur passe sa souris sur un Ă©lĂ©ment HTML
onmouseout: lâutilisateur sort sa souris dâun Ă©lĂ©ment HTML
onkeydown: lâutilisateur appuie sur une touche du clavier
onload: le navigateur a fini de charger la page
On parle de âsâabonner Ă un Ă©vĂ©nementâ lorsquâon lie du code JavaScript pour rĂ©agir Ă un Ă©vĂ©nement.
Il est possible dâintĂ©grer du code JavaScript directement dans une balise HTML :
// modifier le texte affiché h1
<h1 onclick="this.innerHTML = 'Texte changé !'">Clique sur le texte ?</h1>
// modifier le texte de la balise p juste aprĂšs
<button onclick="document.getElementById('demo').innerHTML=Date()">
Quelle heure est-il?
</button>
<p id="demo"></p>BP : On range son code !! On prĂ©fĂšre mettre le code JavaScript dans des fonctions (et dâailleurs les fonctions dans un script externe) et appeler des fonctions dans le fichier HTML.
// mieux : code dans fonctions
<h1 onclick=changementTexte(this)>Clique sur le texte ?</h1>
<button onclick="afficheDate('demo')">
Quelle heure est-il?
</button>
<p id="demo"></p>
<script>
function changementTexte(obj) {
obj.innerHTML = "Texte changé !";
}
function afficheDate(zone) {
document.getElementById(zone).innerHTML=Date();
}
</script>
Il est possible dâassigner un Ă©vĂ©nement dans le code JavaScript :
- en utilisant la DOM HTML :
unElement.evenement = fonctionAExecuter();â> peu utilisĂ©
- avec une mĂ©thode Ă©couteur dâĂ©vĂ©nement, qui permet dâajouter un Ă©vĂ©nement et de lui spĂ©cifier Ă quel moment il arrive et Ă quelle mĂ©thode il est liĂ© :
unElement.addEventListener("evenement", fonctionAExecuter);
// changer la couleur de fond de la page
// - utilisation d'une méthode anonyme
// un bouton
<button id="test"> Cliquer pour changer la couleur de fond</button>
// V1 pas jolie
<script>
document.getElementById("test").addEventListener('click',
() => {
let fond = document.getElementsByTagName("body")[0];
function aleatoire255() {
return Math.floor(Math.random() * 256);
}
function choixCouleur() {
let red = aleatoire255();
let green = aleatoire255();
let blue = aleatoire255();
return "rgb("+red+","+green+","+blue+")";
}
Math.floor(Math.random() * 256);
console.log(choixCouleur());
fond.style.background = choixCouleur(); //"rgb(255,45,255)"
})
</script>
// V2 optimisée
<script>
function aleatoire255() {
return Math.floor(Math.random() * 256);
}
document.getElementById("test").addEventListener('click',
() => {
let fond = document.getElementsByTagName("body")[0];
fond.style.background = "rgb("+aleatoire255()+","+aleatoire255()+","+aleatoire255()+")";
})
</script>Bonnes pratiques en vrac
- Faire une fonction dâinitialisation (
init()) oĂč lâon crĂ©e les Ă©lĂ©ments dont on a besoin, qui sera appelĂ©e au dĂ©but du programme et Ă chaque rechargement de la page.- exemples : la date et lâheure se mettent Ă jour, le focus revient directement dans le premier champs de saisieâŠ
- PlutÎt que de créer des balises avec les méthodes
createElement(balise)etappendChild(element), il est plus rapide et lisible dâutiliserunElement.innerHTML += 'chaine de caracteres comprenant les balises HTLM'
- Les balises ne prennent pas la mĂȘme place sur la page :
~ div : prend toute la longueur de la page (générique)
~ p : avec un padding top et bottom (saut de ligne)
~ span : prend lâespace minimal pour afficher son contenu (le +petit conteneur)
Bonus
// BONUS : supprimer l'element sur lequel on clique
// - mieux avec une alert de verification avant suppression
obj.addEventListener("click", supprimer);
function supprimer(event) {
// fonction qui supprime le li sur lequel on clique
// - ici le param n'est pas obligatoire, mais il augmente la
// lisibilité et la maintenabilité
let obj= event.currentTarget.childNodes[0].textContent;
event.currentTarget.remove();
}