TODO: voir plus bas. durée: une heure.
Event
elem
:
elem.addEventListener('click', maFonction);
addEventListener
prend deux arguments (ainsi qu'un troisième optionnel, voir plus loin) :
Event
Event
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 MouseEvent
key
, code
, etc. pour un KeyboardEvent
preventDefault()
: 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>
EventListener
Il 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 DOMContentLoaded
load
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 mouseenter
mouseover
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