Dans ce chapitre, nous verrons plus en détails les événements de la souris et leurs propriétés.
Remarque: Ces Ă©vĂ©nements peuvent provenir non seulement de âpĂ©riphĂ©riques de sourisâ, mais Ă©galement de pĂ©riphĂ©riques, tels que les tĂ©lĂ©phones et les tablettes, oĂč ils sont Ă©mulĂ©s pour des raisons de compatibilitĂ©.
Les types dâĂ©vĂšnements de Souris
Nous avons déjà vu certains de ces événements :
mousedown/mouseup- Le bouton de la souris est appuyé puis relùché sur un élément.
mouseover/mouseout- Le pointeur de la souris entre ou sort dâun Ă©lĂ©ment.
mousemove- Chaque déplacement de la souris sur un élément déclenche cet évÚnement.
click- est déclenché aprÚs un évÚnement
mousedownet suite Ă unmouseupsur le mĂȘme Ă©lĂ©ment, si le bouton gauche de la souris a Ă©tĂ© utilisĂ© dblclick- Se dĂ©clenche aprĂšs deux clics sur le mĂȘme Ă©lĂ©ment dans un court laps de temps. Rarement utilisĂ© de nos jours.
contextmenu- Se dĂ©clenche lorsque le bouton droit de la souris est enfoncĂ©. Il existe dâautres façons dâouvrir un menu contextuel, par ex. en utilisant une touche spĂ©ciale du clavier, il se dĂ©clenche dans ce cas Ă©galement, donc ce nâest pas exactement lâĂ©vĂ©nement de la souris.
⊠Il y a aussi plusieurs autres événements, nous les couvrirons plus tard.
Ordre des événements
Comme vous pouvez le voir dans la liste ci-dessus, une action utilisateur peut déclencher plusieurs événements.
Par exemple, un clic gauche dĂ©clenche dâabord mousedown, lorsque le bouton est enfoncĂ©, puis mouseup et click lorsquâil est relĂąchĂ©.
Au cas oĂč une action unique initialise plusieurs Ă©vĂšnements, leur ordre est fixĂ©. Câest-Ă -dire que les gestionnaires sont appelĂ©s dans lâordre mousedown â mouseup â click.
Clique sur le bouton en bas et vous verrez les Ă©vĂšnements. Essayez lâĂ©vĂšnement double clic aussi. Dans TestStand en bas tous les Ă©vĂšnements de la souris sont enregistrĂ©s, et si il y a plus dâune seconde de retard entre eux, ils sont alors sĂ©parĂ©s par une ligne horizontale.
Sur le banc de test ci-dessous, tous les Ă©vĂ©nements de souris sont enregistrĂ©s et sâil y a un dĂ©lai de plus dâune seconde entre eux, ils sont sĂ©parĂ©s par une rĂšgle horizontale.
Nous pouvons Ă©galement voir la propriĂ©tĂ© button qui permet de dĂ©tecter le bouton de la souris, câest expliquĂ© ci-dessous.
Bouton de la souris
Les Ă©vĂ©nements liĂ©s aux clics ont toujours la propriĂ©tĂ© button, qui permet dâobtenir le bouton exact de la souris.
Nous ne lâutilisons gĂ©nĂ©ralement pas pour les Ă©vĂ©nements click et contextmenu, car le premier se produit uniquement lors dâun clic gauche, et le second â uniquement lors dâun clic droit.
Dâun autre cĂŽtĂ©, les gestionnaires mousedown et mouseup peuvent avoir besoin de event.button, car ces Ă©vĂ©nements se dĂ©clenchent sur nâimporte quel bouton, donc button permet de faire la distinction entre âright-mousedownâ et âleft-mousedownâ.
Les valeurs possibles de event.button sont :
| Ătat du bouton | event.button |
|---|---|
| Bouton gauche (principal) | 0 |
| Bouton central (auxiliaire) | 1 |
| Bouton droit (secondaire) | 2 |
| X1 bouton (arriĂšre) | 3 |
| X2 bouton (avant) | 4 |
La plupart des souris nâont que les boutons gauche et droit, donc les valeurs possibles sont 0 ou 2. Les appareils tactiles gĂ©nĂšrent Ă©galement des Ă©vĂ©nements similaires lorsque lâon appuie dessus.
Il existe Ă©galement la propriĂ©tĂ© event.buttons qui a tous les boutons actuellement pressĂ©s sous forme dâentier, un bit par bouton. En pratique cette propriĂ©tĂ© est trĂšs rarement utilisĂ©e, vous pouvez trouver des dĂ©tails sur MDN si jamais vous en avez besoin.
event.which obsolĂšteLâancien code peut utiliser la propriĂ©tĂ© event.which qui est une ancienne maniĂšre non standard dâobtenir un bouton, avec des valeurs possibles :
event.which == 1â bouton gauche,event.which == 2â bouton du milieu,event.which == 3â bouton de droite.
DorĂ©navant, event.which est obsolĂšte, nous ne devrions pas lâutiliser.
Les Touches de Modifications: shift, alt, ctrl and meta
Tous les évÚnements de la souris contiennent des informations à propos des touches de modifications qui sont appuyées.
PropriĂ©tĂ©s dâĂ©vĂ©nement :
shiftKey: ShiftaltKey: Alt (or Opt for Mac)ctrlKey: CtrlmetaKey: Cmd for Mac
Ils sont true si la touche correspondante fut appuyĂ©e durant lâĂ©vĂšnement.
Par exemple le bouton en bas fonctionne seulement avec Alt+Shift+click:
<button id="button">Alt+Shift+Click on me!</button>
<script>
button.onclick = function(event) {
if (event.altKey && event.shiftKey) {
alert('Hooray!');
}
};
</script>
Cmd au lieu de CtrlSous Windows et Linux, il y a des touches modificatrices Alt, Shift et Ctrl. Sur Mac, il y en a une en plus : Cmd, correspondant à la propriété metaKey.
Dans la plupart des applications, lorsque Windows / Linux utilise Ctrl, sur Mac Cmd est utilisée.
Câest-Ă -dire : lorsquâun utilisateur Windows appuie sur Ctrl+Enter ou Ctrl+A, un utilisateur Mac presserait sur Cmd+Enter ou Cmd+A, etc.
Donc, si nous voulons supporter des combinaisons comme Ctrl+click, alors pour Mac, il est logique dâutiliser Cmd+click. Câest plus confortable pour les utilisateurs de Mac.
MĂȘme si nous aimerions forcer les utilisateurs de Mac Ă Ctrl+click â câest un peu difficile. Le problĂšme est: un clic gauche avec Ctrl est interprĂ©tĂ© comme un clic droit sur MacOS, et il gĂ©nĂšre lâĂ©vĂšnement menu contextuel, et non un click comme sur Windows/Linux.
Donc, si nous voulons que les utilisateurs de tous les systĂšmes dâexploitation se sentent Ă lâaise, alors avec ctrlKey nous devrions vĂ©rifier la metaKey.
Pour JS-code cela signifie que nous devons contrĂŽler si if (event.ctrlKey || event.metaKey).
Les combinaisons de clavier sont un bon complĂ©ment au flux de travail. Donc, si le visiteur utilise un clavier â ils fonctionnent.
Mais si leur appareil nâen a pas, il devrait y avoir un moyen de vivre sans touches de modification.
Cordonnées: clientX/Y, pageX/Y
Tous les événements de souris fournissent des coordonnées de deux maniÚres :
Nous avons déjà couvert la différence entre eux dans le chapitre Coordonnées.
En rĂ©sumĂ©, les coordonnĂ©es relatives au document pageX/Y sont comptĂ©es Ă partir du coin supĂ©rieur gauche du document, et ne changent pas lorsque la page dĂ©file, tandis que clientX/Y sont comptĂ©es Ă partir du coin supĂ©rieur gauche de la fenĂȘtre actuelle . Lorsque la page dĂ©file, ils changent.
Par exemple, si nous avons une fenĂȘtre de taille 500x500 et que la souris est dans le coin supĂ©rieur gauche, alors clientX et clientY sont 0, peu importe comment la page est dĂ©filĂ©e.
Et si la souris est au centre, alors clientX et clientY sont 250, quelle que soit la place dans le document. Ils sont similaires Ă position:fixed dans cet aspect.
DĂ©placez la souris sur le champ de saisie pour voir clientX/clientY (lâexemple est dans l iframe, ainsi les cordonnĂ©es sont relatives Ă cet iframe) :
<input onmousemove="this.value=event.clientX+':'+event.clientY" value="Mouse over me">
Les coordonnĂ©es relatives au document pageX, pageY sont comptĂ©es Ă partir du coin supĂ©rieur gauche du document, pas de la fenĂȘtre. Vous pouvez en savoir plus sur les coordonnĂ©es dans le chapitre CoordonnĂ©es.
EmpĂȘcher la sĂ©lection sur le mousedown
Le double clic de souris a un effet secondaire qui peut ĂȘtre dĂ©rangeant dans certaines interfaces: il sĂ©lectionne du texte.
par exemple, double-cliquer sur le texte ci-dessous le sélectionne en plus de notre gestionnaire :
<span ondblclick="alert('dblclick')">Double-click me</span>
Si on appuie sur le bouton gauche de la souris et, sans le relùcher, on déplace la souris, la sélection devient alors souvent indésirable.
Il existe plusieurs façons dâempĂȘcher la sĂ©lection, que vous pouvez lire dans le chapitre Selection et Range.
Dans ce cas particulier, le moyen le plus raisonnable consiste Ă empĂȘcher lâaction du navigateur lors du mousedown. Il empĂȘche ces deux sĂ©lections :
Avant...
<b ondblclick="alert('Click!')" onmousedown="return false">
Double-click sur moi
</b>
...Apres
DĂ©sormais, lâĂ©lĂ©ment en gras nâest pas sĂ©lectionnĂ© lors dâun double-clic, et si vous appuyez sur le bouton gauche de la souris, la sĂ©lection ne sera pas lancĂ©e.
Remarque: le texte Ă lâintĂ©rieur est toujours sĂ©lectionnable. Cependant, la sĂ©lection ne doit pas commencer sur le texte lui-mĂȘme, mais avant ou aprĂšs. Cela convient gĂ©nĂ©ralement aux utilisateurs.
Si nous voulons désactiver la sélection pour protéger le contenu de notre page du copier-coller, nous pouvons utiliser un autre événement : oncopy.
<div oncopy="alert('Copying forbidden!');return false">
Cher Utilisateur
Il vous est interdit de faire du copier-coller.
Si vous connaissez JS ou HTML, alors vous pouvez tout obtenir à partir de la page source néanmoins.
</div>
Si vous essayer de copier une partie de texte dans un <div>, cela ne va pas fonctionner, parce que lâaction par dĂ©faut oncopy est empĂȘchĂ©e.
Certes, lâutilisateur a accĂšs Ă la source HTML de la page et peut en extraire le contenu, mais tout le monde ne sait pas comment le faire.
Résumé
Les évÚnements de souris ont les propriétés suivantes :
-
Bouton:
button. -
Touches de modification (
truesi pressĂ©es):altKey,ctrlKey,shiftKeyetmetaKey(Mac).- Si vous voulez gĂ©rer Ctrl, alors nâoubliez pas les utilisateurs de Mac, ils utilisent gĂ©nĂ©ralement Cmd, il est donc prĂ©fĂ©rable de vĂ©rifier
if (e.metaKey || e.ctrlKey).
- Si vous voulez gĂ©rer Ctrl, alors nâoubliez pas les utilisateurs de Mac, ils utilisent gĂ©nĂ©ralement Cmd, il est donc prĂ©fĂ©rable de vĂ©rifier
-
CoordonnĂ©es relatives Ă la fenĂȘtre :
clientX/clientY. -
Coordonnées relatives au document :
pageX/pageY.
Lâaction par dĂ©faut du navigateur de mousedown est la sĂ©lection de texte. Si ce nâest pas bon pour lâinterface, alors il faut lâempĂȘcher.
Dans le chapitre suivant, nous verrons plus en dĂ©tails les Ă©vĂ©nements qui suivent le mouvement du pointeur et comment suivre les changements dâĂ©lĂ©ment sous ce dernier.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâŠ)