Programmation événementielle§
Pierre-Antoine Champin & Michael Mrissa
Département Informatique, IUT Lyon 1Ce travail est sous licence Creative Commons Attribution-ShareAlike 3.0 France.
Pierre-Antoine Champin & Michael Mrissa
Département Informatique, IUT Lyon 1Ce travail est sous licence Creative Commons Attribution-ShareAlike 3.0 France.
addEventListener
) ;Javascript autorise la création de fonctions anonymes :
function (param1, param2) { /* instructions here */ }
Contrairement à une déclaration de fonction, une fonction anonyme peut apparaître partout où une fonction est acceptée.
C'est utile dans les cas où cette fonction n'a pas vocation à être réutilisée ailleurs, en particulier pour les abonnements.
1window.addEventListener("load", function() {
2 document.getElementsByTagName('span')[0]
3 .addEventListener("mouseover", function() {
4 console.log("haha, tickles");
5 }
6 );
7 document.getElementById('b1')
8 .addEventListener("click", function() {
9 console.log("click");
10 }
11 );
12});
1window.addEventListener("load", function() {
2 const b1 = document.getElementById('b1');
3
4 b1.addEventListener("click", function() {
5 b1.textContent = "(en attente)";
6 b1.disabled = true;
7 setTimeout(function() {
8 alert("message");
9 b1.disabled = false;
10 b1.textContent = "Afficher un message dans 2s";
11 }, 2000);
12 });
13});
Dans l'exemple précédent,
pourquoi utiliser la fonction setTimeout
et non une fonction qui bloquerait l'exécution pendant 2s,
comme dans l'exemple ci-dessous ?
// ⚠ MAUVAIS EXEMPLE ⚠
b1.textContent = "(en attente)";
b1.disabled = true;
sleep(2000); // fonction imaginaire (n'existe pas en JS)
alert("message");
b1.disabled = false;
b1.textContent = "Afficher un message dans 2s";
Avertissement
La fonction sleep
n'existe pas réellement en Javascript,
et pour cause puisque ce n'est pas la bonne manière de faire.
let
ou const
,
c'est le bloc dans lequel elle est déclarée.var
,
c'est la fonction dans laquelle elle est déclarée.b1
est définie au chargement de la page,
mais « survit » à cette fonction,
puisqu'elle est réutilisée au clic sur ce bouton,
et encore deux secondes plus tard,
dans le callback de la fonction setTimeout
.Vocabulaire
Une fonction de callback est utilisée en paramètre d’une méthode ou d’une fonction qui l'exécute le moment voulu.
Les balises HTML décrivent une structure d'arbre.
Remarque
Il existe d'autres types de nœuds (par exemple les nœuds commentaire), mais ils sont plus rarement utiles.
Récupérer des éléments depuis l'objet document
:
getElementById, getElementsByTagName, getElementsByClassName, querySelector, querySelectorAll
Récupérer des éléments depuis un autre élément e
:
e.getElementsByTagName, e.getElementsByClassName, e.querySelector, e.querySelectorAll, e.childNodes, e.children, e.parentNode,
Propriétés d'un nœud :
nodeName, nodeType, nodeValue, textContent
Création d'un nœud :
document.createElement, document.createTextNode, elt.cloneNode
Une fois créé, le nœud est encore hors de l'arborescence du document (et donc, non affiché). Il est nécessaire de le rattacher à un nœud parent par l'une des méthodes suivantes :
insertBefore, replaceChild, removeChild, appendChild,
target
contient l'élément cible.Indication
On peut également forcer un listener à se déclencher à la descente
(capture d'un événement) plutôt qu'à sa remontée (bubbling).
Pour cela on passera true
en troisième paramètre de
addEventListener.
1document.body
2 .addEventListener("click", function(evt) {
3 const msg = document.getElementById("msg");
4 if (evt.target.tagName === "BUTTON") {
5 msg.textContent = "Vous avez cliqué sur " +
6 evt.target.textContent;
7 } else {
8 console.log(evt.target);
9 msg.textContent = "Vous avez raté les boutons...";
10 }
11});
Indication
L'objet événement passé en paramètre aux listeners
a également une méthode preventDefault
qui permet d'inhiber le comportement par défaut de l'événement.
Comme on vient de le voir pour les listeners, Javascript est très tolérant avec le nombre de paramètres des fonctions.
arguments
(comparable à un tableau).undefined
.Loupe vous permet de visualiser la manière dont les événements sont gérés en Javascript.
La vidéo qui sert d'introduction est également une bonne introduction aux mécanismes mis en œuvre.