Facebook
Twitter
LinkedIn

Gérer les événements

Les événements permettent à l’internaute de déclencher une fonction sur une action souris, clavier, ou tactile. Ils rendent le contenu interactif. L’utilisateur peut participer au comportement de la page en exécutant des taches sur le clic, au survol ou avec les touches du clavier..

Evénement en ligne

La première façon de créer un événement est d’utiliser un attribut comme onclick dans la balise HTML.

<input type="button" value="Cliquez ici" onclick="alert('toto')">

Testez vous-même

En cliquant sur le bouton vous afficher le texte ‘toto’ dans une fenêtre ‘alert’.

Liste des principaux événements

Evénements souris

  • onclick : cliquer
  • ondblclick : double clique
  • onmouseover : au survol d’un élément html
  • onmouseout : quitter le survol d’un élément html
  • onmousedown : enfoncer le clique gauche (sans relacher)
  • onmouseup : relacher le clique gauche
  • onmousmove : bouger la souris sur un élément

Evénements clavier

  • onkeydown : enfoncer une touche du clavier (sans relacher)
  • onkeyup : relacher une touche du clavier
  • onkeypress : enfoncer – relacher une touche du clavier

Evénements formulaire

  • onfocus : prendre le focus (rentrer dans la zone de saisie)
  • onblur : perdre le focus (sortir d’une zone de saisie)
  • onchange : changer la valeur d’un élément HML

Bloquer un comportement par défaut

Il est possible de désactiver l’action par défaut d’un élément html, comme par exemple la redirection quand on clique sur un lien.

Pour cela, il faut utiliser le return false comme instruction dans l’évènement onclick

<a href="contact.html" onclick="return false;">Vers contact</a> <!-- redirection annulée -->

Syntaxe this

Le this fait référence à l’élément html qui a déclenché l’évènement

<input type="button" value="Cliquez ici" id="toto" onclick="alert(this.id)">

Testez vous-même

Le this fait référence au bouton qui déclenche l’alert. La fenêtre affichera donc l’id du bouton (this.id).

Evénement avec le DOM-0 (implémentée par Netscape)

L’inconvénient de la première méthode est que le javascript se retrouve mélangé avec le HTML.

Avec le DOM qui permet de cibler un élément HTML, on peut externaliser l’événement.

-> Code HTML

<input type="button" value="Cliquez ici" id="toto">

-> Code Javascript

let cible = document.getElementById('toto'); // cible le bouton
function action(){
    alert(this.id);
}
cible.onclick = action // évènement onclick

Dans cet exemple le code Javascript peut se situer dans un fichier externe (.js) et ce sont les méthodes DOM ( ici getElementById(‘toto’) ) qui vont permettre de cibler les éléments HTML.

Dans notre cas, c’est la propriété onclick reliée à l’objet ‘cible’ par la syntaxe pointée ‘.’ qui va déclencher la fonction ‘action’.

L’objet Event

Cet objet contient toutes les informations concernant l’événement (souris, clavier..). C’est avec cet objet qu’on peut récupérer par exemple la position (x et y ) de la souris.

L’objet est passé en paramètre de la fonction qui est appelée par l’événement

let cible = document.getElementById('toto'); // cible le bouton
function action(e){ // objet event passé en argument
    alert(e.type); // affiche click
}
cible.onclick = action // évènement onclick

L’objet Event (e dans l’exemple ci-dessus) peut être nommé autrement (evt ou event par exemple). La propriété type de l’objet Event indique quel type d’évènement s’est produit (ici click).

la propriété target de l’objet Event

Le target fait référence à l’élément html qui reçoit l’évènement et non pas à l’élément qui déclenche l’évènement (l’écouteur).

Pour comprendre la nuance, voici une structure HTML qui contient un parent (balise div) et un enfant (balise p). On applique l’évènement onclick sur le parent.

-> Code HTML

<div id="parent">
  <p id="enfant">toto</p>
</div>

-> Code Javascript

let parent = document.getElementById('parent'); 
function action(e){ // objet event passé en argument
    alert(e.target.id);
}
parent.onclick = action;

En cliquant sur l’élément parent (zone bleu), l’objet ciblé est ‘parent’, mais si vous cliquez sur l’enfant (zone orange), l’objet ciblé est ‘enfant’ puisqu’il recoit l’événement, et non pas le ‘parent’ qui pourtant est l’écouteur.

Le target permet de cibler tous les éléments descendants d’un élément parent (l’écouteur) sans leur associer d’évènement.

la propriété currentTarget de l’objet Event

Le currentTarget fonctionne comme le this vu plus haut. Elle fait toujours référence à l’écouteur, c’est à dire à celui qui déclenche l’événement.

Que vous cliquez sur le parent (zone bleu) ou sur l’enfant (zone orange), l’objet ciblé sera toujours celui qui déclenche l’évènement, c’est à dire le parent dans l’exemple ci-dessous.

Testez vous-même

Connaitre la position de la souris avec l’objet Event

Si vous utiliser des évènement souris (comme le ‘click’), il est possible de récupérer la position x et y de la souris avec les propriétés clientX et clientY de l’objet Event

function action(e){ // objet event passé en argument
    alert("position de la souris \n" + e.clientX + "px en x et " + e.clientY + "px en y");
}
window.onclick = action;

Testez vous-même

Ces propriétés peuvent être intéressant pour obliger un élément HTML à suivre la souris.

 Récupérer le code d’une touche clavier avec l’objet Event

Si vous utiliser des événements clavier (comme le ‘keydown’), il est possible de récupérer le code de la touche avec la propriété keyCode de l’objet Event

L’événement onkeypress ne peut capter que les touches de type caractère : Ctrl ou Shift par exemple ne correspondant pas à des caractères.

function action(e){ // objet event passé en argument
    alert("Code de la touche \n" + e.keyCode );
}
window.onkeydown = action;

Testez vous-même

Cliquez dans la zone grise, puis enfoncez un touche du clavier pour récupérer le code correspondant.

A l’inverse vous pouvez afficher le caractère à partir du code de la touche avec la méthodefromCharCode() de l’objet String.

function action(){
  alert( String.fromCharCode( 89 ) ); // retourne Y
}
window.onclick = action;

Testez vous-même

La méthode peut prendre plusieurs codes séparés par une virgule, elle renverra un mot

function action(){
  alert( String.fromCharCode( 79,85,13 ) ); // retourne OUI
}
window.onclick = action;

Testez vous-même

Vous remarquez que la méthode retourne toujours un caractère en majuscule.

 Bloquer un comportement par défaut avec l’objet Event

Il est possible de désactiver l’action par défaut d’un élément html, comme par exemple la redirection quand on clique sur un lien.

Pour cela, il faut utiliser la méthode preventDefault() de l’objet event

-> Code HTML

<a href="//www.google.fr/" id="toto">google</a>

-> Code Javascript

let cible = document.getElementById('toto');
function action(e){ // objet event passé en argument
    e.preventDefault(); // annule la redirection
}
cible.onclick = action // évènement onclick

Testez vous-même

Limites du DOM-0

Le DOM-0 ne permet l’addition de plusieurs évènements identiques sur le même élément HTML. Seul l’action du dernier évènement sera déclenchée, comme dans l’exemple ci-dessous

-> Code HTML

<input type="button" value="ok" id="toto">

-> Code Javascript

let cible = document.getElementById('toto');
function action1(){
    alert('action 1');
}
function action2(){
    alert('action 2');
}
cible.onclick = action1
cible.onclick = action2 // même évènement sur la même cible

Testez vous-même

Vous remarquez que la fonction ‘action1’ est ignorée

Evénement avec le DOM-2 (standard actuel)

Pour palier aux limites du DOM-0, vous pouvez utiliser une autre méthode, le DOM-2, qui prend aussi en charge l’objet Event.

Avec le Dom-2, l’événement est gérer par la méthode addEventListener() qui peut contenir trois paramètres :

  • l’événement (sous forme de chaîne sans le « on », exemple ‘click’ )
  • la fonction à appeler
  • un booléen pour gérer la propagation (on y reviendra plus tard) : valeur false par défaut

Si on reprend l’exemple ci-dessus qui montrait les limites du DOM-0, on constate qu’avec le DOM-2, il est possible d’additionner plusieurs évènements identiques sur un même élément HTML

let cible = document.getElementById('toto');
function action1(){
    alert('action 1');
}
function action2(){
    alert('action 2');
}
cible.addEventListener("click", action1, false);
cible.addEventListener("click", action2, false);

Testez vous-même

Vous remarquez qu’en cliquant sur ‘ok’ les deux actions s’exécutent bien.

 utiliser l’objet Event

Comme avec le DOM-0, vous pouvez accéder à l’objet Event pour récupérer les informations concernant l’événement.

L’objet Event fonctionne exactement comme pour le DOM-0.

 gérer la propagation

Le troisième argument de la méthode addEventListener() permet de gérer le sens de propagation de l’évènement. Ce paramètre s’avère utile lorque les éléments HTML sont imbriqués comme dans l’exemple ci-dessous :

<div id="parent">
  <p id="enfant">toto</p>
</div>

La question est de savoir qui exécutera en premier l’action si on applique à chacun d’eux un événement (le ‘click’, par exemple).

  • Si l’élément enfant s’exécute avant l’élément parent, on parle de bouillonnement, c’est le comportement par défaut, la valeur du troisième argument est false
  • Si l’élément parent s’exécute avant l’élément enfant, on parle de capture, la valeur du troisième argument est true

Le code ci dessous exploite la capture.

let parent = document.getElementById('parent');
let enfant = document.getElementById('enfant');
function fenfant(){
    alert('enfant');
}
function fparent(){
    alert('parent');
}
enfant.addEventListener("click", fenfant, true); // capture
parent.addEventListener("click", fparent, true); // capture

Testez vous-même

Si vous cliquez d’abord sur ‘enfant’ (zone orange), c’est l’évènement du parent qui s’éxécute avant : c’est la phase de capture définie par la valeur true du troisième argument.

Si vous mettez false (ou si vous ne mettez pas de troisième argument), vous êtes dans la phase de propagation par défaut, qui est celle du bouillonnement.

let parent = document.getElementById('parent');
let enfant = document.getElementById('enfant');
function fenfant(){
    alert('enfant');
}
function fparent(){
    alert('parent');
}
enfant.addEventListener("click", fenfant, false); // bouillonnement
parent.addEventListener("click", fparent, false); // bouillonnement

Testez vous-même

Dans la majorité des cas, c’est le bouillonnement qui sera utilisé.

let parent = document.getElementById('parent');
let enfant = document.getElementById('enfant');
function fenfant(){
    alert('enfant');
}
function fparent(){
    alert('parent');
}
enfant.addEventListener("click", fenfant); // troisième argument omis
parent.addEventListener("click", fparent); // troisième argument omis

Dans la phase de bouillonnement le troisième argument peut-être omis.

 stopper la propagation

Si vous voulez éviter la propagation de l’évenement, il faut utiliser la méthode stopPropagation() de l’objet Event

Event.stopPropagation()

Dans l’exemple ci-dessous la progation est stoppée par l’élément ‘enfant’

let parent = document.getElementById('parent');
let enfant = document.getElementById('enfant');
function fenfant(e){
  alert('enfant');
  e.stopPropagation(); // on stoppe la propagation
}
function fparent(){
  alert('parent');
}
enfant.addEventListener("click", fenfant, false);
parent.addEventListener("click", fparent, false);

Testez vous-même

En cliquant sur l’enfant (zone orange), l’action ‘enfant’ se produit mais pas celle du ‘parent’ qui, pourtant, contient aussi un gestionnaire d’évènement.

A lire aussi

tutowebdesign

Afficher du contenu au scroll

Afficher du contenu au scroll Voici un effet impressionnant et pourtant très facile à mettre en place sur vos pages. Le principe consiste à faire

Lire »