📘

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 :

📌
Pour aller plus loin : https://www.w3schools.com/whatis/whatis_htmldom.asp voir cours 03 - HTML/CSS

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.
⚠
Il est possible d’appeler plusieurs fichiers JavaScript mais attention Ă  l’ordre : la moindre erreur entrainera l’arrĂȘt de la lecture du fichier.
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 :

document.getElementByID();
document.getElementsByTagName();
document.getElementsByClassName();
document.querySelector();
document.querySelectorAll();
// exemples de collection d'objets : document.images ou document.links
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();

â„č
JQuery propose d’autres sĂ©lecteurs avec une syntaxe plus facile (voir module 04 - Jquery).

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 :

⚙
Une liste plus complĂšte d’évĂ©nements : https://www.w3schools.com/jsref/dom_obj_event.asp

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 :

// 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>
â„č
BP : utiliser une fonction anonyme si on n’a pas besoin de la rĂ©utiliser plus tard. Attention : ce qui est dedans n’existe que dans son contexte donc on ne crĂ©e pas de fonctions Ă  l’intĂ©rieur.
📌
Pour aller plus loin : https://developer.mozilla.org/fr/docs/Learn/JavaScript/Building_blocks/Events

Bonnes pratiques en vrac


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