Aller au contenu

Gestion des évènemnts avec JavaScript⚓︎

Revenons au évènements⚓︎

Associer les évènements à des commandes JavaScript

Afin d'exécuter ces actions, il faut associer les commandes JavaScript à des évènements. On peut par exemple associer un script au fait de cliquer sur un bouton.

Exercice 7

On considère le script suivant :

clicker.html
<!DOCTYPE HTML>
<html>
  <head>
    <title>Clic si tu oses</title>
    <meta charset="utf-8">
    <script type="text/javascript">
        let compteur = 0;
        function suivant () {
            compteur = compteur + 1;
            let v = document.getElementById("valeur");
            v.innerHTML = compteur;
        }
    </script>
  </head>
  <body>
    <button onclick="suivant();">Clic !</button>
    <span id="valeur">0</span>
  </body>
</html>

Créez un fichier clicker.html et recopiez le code ci-dessus.

Explications

On remarque que lorsqu'on clic sur le bouton, le compteur augmente. La page n'est pas rechargée et aucun appel au serveur n'est fait. C'est parce qu'à chaque clic sur le bouton, la commande suivant() est appelée. Cet évènement est relié au bouton par l'attribut onclick.

Programmation évènementielle

Le code JavaScript est interprété lors de l'affichage de la page. Le navigateur transforme la page en une structure d'arbre, avec des éléments (les nœuds) et les sous-éléments (les fils). À chaque rafraîchissement de l'écran, les évènements sont générés :

  • Est-ce qu'on a cliqué ?
  • Est-ce que la souris a bougé ?
  • Est-ce qu'on a modifié une valeur dans un formulaire ?
  • ...

Ces évènements sont interceptés par les gestionnaires qui écoutent et s'exécutent dès que l'évènement attendu est activé. Le code JavaScript correspondant est alors activé, modifiant éventuellement le contenu de la page, qui est alors affiché et ainsi de suite.

On parle de programmation évènementielle. Le code est exécuté en fonction des évènements qui sont déclenchés.

Les attributs

Il existe de nombreux attributs liés aux évènements, comme ondblclic pour un double-clic, onkeypress pour une touche du clavier pressée, onmouseover pour le survol de l'élément par la souris\ldots Il est possible de rajouter ces attributs sur n'importe quelle balise HTML et pas uniquement sur les boutons.

Organisation du code

Comme pour le code CSS, il est préférable de séparer le code HTML du code JavaScript. Il est conseillé de modfier le fichier précédent de la manière suivante :

clicker.html (nouvelle version)
<!DOCTYPE HTML>
<html>
  <head>
    <title>Clic si tu oses</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="code.js" defer="defer">
    </script>
  </head>
  <body>
    <button id="bouton">Clic !</button>
    <span id="valeur">0</span>
  </body>
</html>

Le code de code.js est le suivant :

code.js
let compteur = 0;

function suivant() {
        compteur = compteur + 1;
        let v = document.getElementById("valeur");
        v.innerHTML = compteur;
}

let b = document.getElementById("bouton");
b.addEventListener("click", suivant);
Exercice 8

Modifiez clicker.html et créez code.js avec le code ci-dessus.

Explications

On peut remarquer que l'attribut onclick a disparu. À la place, dans code.js, on ajoute un gestionnaire d'évènement qui associe la fonction suivant() au clic sur le bouton.

L'attribut defer lors de l'appel du fichier code.js indique qu'il doit être chargé à la fin du chargement de la page.

Un autre exemple⚓︎

Un autre exemple

On considère les fichiers flou.html, flou.css et flou.js suivants :

flou.html
<!DOCTYPE HTML>
<html>
  <head>
    <title>Où sont mes lunettes ?</title>
    <meta charset="utf-8">
    <script type="text/javascript" src="flou.js" defer="defer">
    </script>
    <link rel="stylesheet" href="flou.css">
  </head>
  <body>
    <div>Bonjour !</div>
    <div>C'est moi ou c'est illisible votre truc ?</div>
    <div>C'est vraiment flou.</div>
  </body>
</html>
flou.css
div {
     font-size: 40px;
     filter: blur(10px);
}
flou.js
let divs = document.querySelectorAll('div');

function alterner(elem) {
  if (elem.style.backgroundColor == "blue") {
    elem.style.backgroundColor = "";
    elem.style.color = "";
  } else {
    elem.style.backgroundColor = "blue";
    elem.style.color = "yellow";
  }
}

for (var i = 0; i < divs.length; i++) {
  // version avec attributs
  divs[i].onmouseover = function(){this.style.filter = "blur(0px)"};
  divs[i].onmouseout = function(){this.style.filter = "blur(10px)"};
  // version avec gestionnaire d'évènement
  divs[i].addEventListener("click", function() { alterner(this); });
};
Exercice 9

Créez les fichiers ci-dessus et ouvrir flou.html.

Explications

Dans cet exemple, nous utilisons deux façons pour rajouter la gestion des évènements. La deuxième version, avec gestionnaire d'évènement est généralement considéré comme préférable.