Skip to content

Evénements

Les événements permettent de déclencher une fonction pour une action spécifique, comme par exemple le clic ou le survol d'un élément, le chargement du document HTML ou encore l'envoi d'un formulaire.

Principaux événements du DOM

Evénement DOMDescription
clickBouton de la souris enfoncé puis relâché sur un élément.
dblclickDeux foix l'événement click
mouseoverSouris au-dessus d'un élément.
mouseoutSouris sort d'un élément.
mousedownBouton de la souris enfoncé, pas relâché, sur un élément.
mouseupBouton de la souris relâché sur un élément.
mousemoveSouris en mouvement au-dessus d'un élément.
keydownTouche clavier enfoncée, pas relâchée, sur un élément.
keyupTouche clavier relâchée sur un élément.
keypressTouche clavier enfoncée et relâchée sur un élément.
focusL'élément reçoit, gagne, le focus.
Quand un objet devient l'élément actif du document.
blurElément perd le focus.
changeChangement de a valeur d'un élément de formulaire.
selectSélection du texte d'un élémen, mis en srubrillance.
submitEnvoi d'un formulaire
resetRéinitialisation d'un formulaire

🔗 Liste complète des événements : https://www.w3schools.com/jsref/dom_obj_event.asp

Affecter une fonction à un événement

Il existe différentes manières d'affecter une fonction à l'événement d'un objet.

TIP

Le meilleure moyen est souvent addEventListener()

Avec la méthode "on-event", chaque objet ne peut avoir qu'un seul gestionnaire d'événement pour un événement donné. C'est pourquoi addEventListener() est souvent le meilleur moyen d'être averti des événements.

On-event

Les gestionnaires d'événements "on-event" sont nommées selon l'événement lié : onclick, onkeypress, onfocus, onsubmit, etc.

🔗 Liste des gestionnaires d'événements : https://www.w3schools.com/tags/ref_eventattributes.asp

On peut scpécifier un "on-event" pour un événement particulier de différentes manières :

  • Avec un attribut HTML : <button onclick="bonjour()">
  • En utilisant la propriété correspondante en JavaScript : Element.onclick = bonjour;

WARNING

En JavaScript, afin d'affecter la fonction bonjour() et non son résultat, on n'ajoute pas les parenthèses après le nom de la fonction.

  • Element.onclick = bonjour; affecte la fonction bonjour().
  • Element.onclick = bonjour(); affecte le résultat de la fonction bonjour().
javascript
function citationLeia() {
  alert("Plutôt embrasser un Wookie");
}

// Affecte la fonction citationLeia() au click du bouton
document.querySelector('button').onclick = citationLeia;

// Variante avec fonction anonyme
document.querySelector('button').onclick = function() {
  alert("Plutôt embrasser un Wookie");
};

// Variante avec fonction fléchée (arrow function)
document.querySelector('button').onclick = () => alert("Plutôt embrasser un Wookie");

addEventListener()

🔗 Liste des événements JavaScript : https://www.w3schools.com/jsref/dom_obj_event.asp

La méthode addEventListener() permet de définir une fonction à appeler chaque fois que l'événement spécifié est détecté sur l'élément ciblé.

typescript
ElementCible.addEventListener("nomEvenement", nomFonction);
javascript
const newElement = document.getElementsByTagName('h1');

newElement.onclick = function() {
  console.log('clicked');
};

let logEventType = function(e) {
    console.log('event type:', e.type);
};

newElement.addEventListener('focus', logEventType, false);
newElement.removeEventListener('focus', logEventType, false);

window.onload = function() {
  console.log('Im loaded');
};

Ajouter un événement à une liste d'éléments

javascript
const boutons = document.querySelectorAll("button");

for (let bouton of boutons) {
   bouton.addEventListener("click", function(event) {
      bouton.classList.toggle("rouge");
   });
}
html
<button>Bouton 1</button>
<button>Bouton 3</button>
<button>Bouton 3</button>
css
button {
   cursor: pointer;
   color: #7f8c8d;
   font-weight: bold;
   background-color: #ecf0f1;
   padding: 1em 2em;
   border: 2px solid #7f8c8d;
}

button.rouge {
   border-color: #c0392b;
   background-color: #e74c3c;
   color: #ecf0f1;
}

L'objet event

Un objet event est automatiquement passé comme premier paramètre de la fonction affectée à un événement. Pour le récupérer il suffit d'ajouter un paramètre à la fonction liée. Le nom de ce paramètre est libre mais on le nomme régulièrement event ou plus simplement e.

html
<button>Clique moi !</button>

<script>
// Récupère le 1er boutons du document
const bouton = document.querySelector("button");
// Ajoute événement click avec une fonction avec paramètre event
bouton.addEventListener("click", function (event) {
  // Affiche le type d'événement envoyé
  alert(event.type); // click
});
</script>

Récupérer la cible d'un événement

On appelle "cible" l'objet ou 'élément qui a envoyé l'événement. Pour récupérer la cible on utiliser la propriété target de l'événement.

html
<button>Clique moi !</button>

<script>
// Récupère le 1er boutons du document
const bouton = document.querySelector("button");
// Ajoute événement click avec une fonction avec paramètre event
bouton.addEventListener("click", function (event) {
  // Récupère l'élément qui a envoyé l'événement, la cible
  let cible = event.target;
  // Modifie la taille du texte de la cible
  cible.style.fontSize = "2em";
  // Affiche le contenu texte de la cible
  alert(cible.innerText); // Clique moi !
});
</script>

Bubbling & Capturing

Capture ? Bouillonnement ? De quoi parle-t-on ?

Ces deux phases sont deux étapes distinctes de l'exécution d'un événement.

La première, la capture, s'exécute avant le déclenchement de l'événement.

La deuxième, le bouillonnement (bubbling en anglais), s'exécute après que l'événement a été déclenché.

Toutes deux permettent de définir le sens de propagation des événements.

bubbling-capturing.png

html
<div id="div1">
  <p id="p1">Je bouillonne.</p>
</div><br>

<div id="div2">
  <p id="p2">Je capture.</p>
</div>

<script>
  // Ajoute un écouteur d'événement pour le DIV #div1 en mode bouillonnement
  document.getElementById("div1").addEventListener(
          "click",
          function () {
            alert("You clicked the DIV element!");
          },
          false // useCapture est false, donc c'est un bouillonnement
  );
  // Ajoute un écouteur d'événement pour le P #p1
  document.getElementById("p1").addEventListener(
          "click",
          function () { alert("You clicked the P element!"); }
          false // useCapture est false, donc c'est un bouillonnement
  );
    
  // Ajoute un écouteur d'événement pour le DIV #div2 en mode capture
  document.getElementById("div2").addEventListener(
          "click",
          function () { alert("You clicked the DIV element!"); },
          true // useCapture est true, donc c'est la capture
  );
  
  // Ajoute un écouteur d'événement pour le P #p2 en mode capture
  document.getElementById("p2").addEventListener(
          "click",
          function () { alert("You clicked the P element!"); },
          true // useCapture est true, donc c'est la capture
  );

</script>

A lire...

https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events