TODO: voir plus bas. durée: une heure.
Eventelem :
elem.addEventListener('click', maFonction);
addEventListener prend deux arguments (ainsi qu'un troisième optionnel, voir plus loin) :
EventEvent en paramètre<div id=toto>Je suis la division toto.</div>
<script> "use strict";
function clicSurToto(ev) {
alert("On a cliqué sur toto !");
console.log(ev);
}
let toto = document.getElementById("toto");
toto.addEventListener("click", clicSurToto);
</script>
Résultatclick, mouseenter et mouseleave
(il existe aussi mouseover et mouseout, qui
sont moins pratiques — voir plus loin),
mouseup et mousedown
keydown et keyup
(keypress existe aussi mais est obsolète)load, unload, scroll, resize…focus, change, blur, submit, input…type : le type d'événement (demo)target : l'élément qui a déclenché l'événementcurrentTarget : l'élément sur lequel le listener est attaché
clientX, clientY, etc. pour un MouseEventkey, code, etc. pour un KeyboardEventpreventDefault() : empêche l'exécution de l'action par défaut
de l'événement (démo, détails sur MDN)stopPropagation() : arrête la propagation de l'événement (démo)addEventListener détecte les événements à la remontée, mais elle a un troisième paramètre optionnelonmouseover, onload, onclick, etc.Je donne quelques explications dessus, mais il ne faudra pas les utiliser dans le cadre de ce cours !
onévénement (onmouseover, onload, onclick) où il est possible de mettre du JavaScript directement
<li onclick="document.getElementById('toto').style.color='green';
document.getElementById('toto').style.fontSize='larger';">
Exemple : cliquer sur cet élément déclenche une action sur l'item suivant
</li>
<li id="toto">Cet élément possède l'identifiant toto</li>
Un peu plus propre : remplir les attributs onclick
et consorts dans le script JS
Il suffit de mettre une fonction dans l'attribut, et elle sera exécutée si l'événement se produit sur l'élément
<div id=toto>
Je suis la division toto.
</div>
<script>
function clicSurToto() {
alert("On a cliqué sur toto !");
}
toto = document.getElementById("toto");
toto.onclick = clicSurToto;
</script>
EventListenerIl y a quelques années, il restait intéressant d'utiliser
onclick et consorts pour la portabilité,
mais ce n'est plus le cas,
addEventListener est supporté partout
addEventListener :
Unique inconvénient : c'est un peu plus long à écrire
load et DOMContentLoadedload est lancé lorsque la page est entièrement chargée,
y compris toutes les dépendances (notamment les images)DOMContentLoaded de HTML5 est plus adapté,
et fonctionne partout (sauf IE < 9…)Attention cependant : le HTML qui suit le script ne sera parsé et donc affiché qu'après l'exécution du script, et donc après son téléchargement si nécessaire.
avec un script externe, cette technique peut donc ralentir l'affichage de la page, potentiellement très fortement si le script est sur un autre serveur et que ce serveur rencontre des problèmes
Pour les script inclus, utiliser l'attribut defer de l'élément script (voir cours précédent)
TODO: démo avec tous les trucs. script normal dans head; script normal dans head + DOMContentLoaded; script normal dans head + load; script defer dans head; image longue à charger; script à la fin du body. TODO: parler de async. montrer ce qui se passe si DOMContentLoaded est lancé avant la fin du téléchargement du script; que faire contre ça : utiliser document.readystate, mais on dirait que c'est buggé sous IE 10 ? http://stackoverflow.com/questions/9237044/async-loaded-scripts-with-domcontentloaded-or-load-event-handlers-not-being-call#9237129
mouseover et mouseentermouseover est lancé lorsque la souris entre
sur la surface d'un élément, mouseout quand elle en sortmouseout
sur le parent et un mouseover sur le fils, et inversementmouseenter et mouseleave,
qui ne remontent pas et ne sont pas lancés quand la souris rentre et sort
d'un descendant:hover en CSSLes événements clavier ne sont pas implémentés de la même façon sur tous les navigateurs et OS, et les spécs sont encore assez instables
La spéc actuelle ne définit que deux événements, keydown et keyup
event.key contient une chaîne qui représente le caractère auquel correspond la touche pressée (ou relâchée)."a", "A" (les majuscules et minuscules sont distinctes), "é", "[", Control, "ArrowLeft"…event.code contient une chaîne qui représente la touche physique que l'internaute a pressée (ou relâchée), indépendamment de la disposition du clavier (qwerty, azerty, bépo…)."KeyQ", "Digit3", "BracketLeft", "ControlRight"…Malheureusement, event.key n'est pas encore supporté partout, et event.code encore moins
Quand event.key n'est pas supporté, si on veut simplement tester l'appui sur une touche alphanumérique (sans accent), on peut utiliser
String.fromCharCode(event.which || event.keyCode), qui devrait marcher à peu près partout… (Quelques détails)
Autre possibilité : on peut utiliser un polyfill, c'est-à-dire une librairie JS qui ajoute au navigateur l'implémentation de event.key — celui-ci par exemple