🌐 AIæœçŽą & 代理 䞻饔
11 juillet 2023

Evenements de la souris

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 mousedown et suite Ă  un mouseup sur 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.

Le event.which obsolĂšte

L’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: Shift
  • altKey: Alt (or Opt for Mac)
  • ctrlKey: Ctrl
  • metaKey: 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>
Attention : Sur Mac c’est souvent Cmd au lieu de Ctrl

Sous 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).

Il y a aussi les appareils mobiles

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.

Prévenir la copie

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 (true si pressĂ©es): altKey, ctrlKey, shiftKey et metaKey (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).
  • 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.

Exercices

importance: 5

Créer une liste dont les éléments sont sélectionnables,comme dans les gestionnaire de fichiers

  • Un click sur un Ă©lĂ©ment de la liste sĂ©lectionne seulement cet Ă©lĂ©ment(ajoute la classe .selected), dĂ©sĂ©lectionne tous les autres.
  • Si un click est effectuĂ© avec Ctrl (Cmd sur Mac), alors la sĂ©lection est inversĂ©e sur l’élĂ©ment, mais les autres Ă©lĂ©ments ne sont pas modifiĂ©s

La demo:

P.S. Pour cette tùche on peut assumer que les éléments de cette liste sont uniquement du texte.Pas de tags imbriqués.

P.P.S. EmpĂȘcher la sĂ©lĂ©ction des textes dĂ©clenchĂ©e par dĂ©faut par le navigateur lors d’un click.

Open a sandbox for the task.

Carte du tutoriel

Commentaires

lire ceci avant de commenter

  • Si vous avez des amĂ©liorations Ă  suggĂ©rer, merci de soumettre une issue GitHub ou une pull request au lieu de commenter.
  • Si vous ne comprenez pas quelque chose dans l'article, merci de prĂ©ciser.
  • Pour insĂ©rer quelques bouts de code, utilisez la balise <code>, pour plusieurs lignes – enveloppez-les avec la balise <pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepen
)