Existe-t-il un moyen de détecter si un bouton de la souris est actuellement enfoncé dans JavaScript?
Je connais l'événement "mousedown", mais ce n'est pas ce dont j'ai besoin. Quelques temps APRÈS avoir appuyé sur le bouton de la souris, je veux être en mesure de détecter s'il est toujours enfoncé.
Est-ce possible?
Réponses:
En ce qui concerne la solution de Pax: cela ne fonctionne pas si l'utilisateur clique sur plus d'un bouton intentionnellement ou accidentellement. Ne me demandez pas comment je sais :-(.
Le code correct devrait être comme ça:
Avec le test comme celui-ci:
Si vous voulez savoir sur quel bouton vous appuyez, préparez-vous à faire de mouseDown un tableau de compteurs et à les compter séparément pour des boutons séparés:
Vous pouvez maintenant vérifier quels boutons ont été appuyés exactement:
Sachez maintenant que le code ci-dessus ne fonctionnera que pour les navigateurs conformes à la norme qui vous transmettent un numéro de bouton à partir de 0. IE utilise un masque de bits des boutons actuellement enfoncés:
Alors ajustez votre code en conséquence! Je laisse ça comme un exercice.
Et rappelez-vous: IE utilise un objet événement global appelé… "événement".
Incidemment, IE a une fonctionnalité utile dans votre cas: lorsque d'autres navigateurs envoient un "bouton" uniquement pour les événements de bouton de la souris (onclick, onmousedown et onmouseup), IE l'envoie également avec onmousemove. Ainsi, vous pouvez commencer à écouter onmousemove lorsque vous avez besoin de connaître l'état du bouton et vérifier evt.button dès que vous l'avez - vous savez maintenant sur quels boutons de la souris ont été enfoncés:
Bien sûr, vous n'obtenez rien si elle joue la morte et ne bouge pas.
Liens pertinents:
Mise à jour n ° 1 : Je ne sais pas pourquoi j'ai repris le code de style document.body. Il sera préférable d'attacher des gestionnaires d'événements directement au document.
la source
event.buttons
à n'importe quel déclencheur d'événement que vous utilisez, sans variables enregistrées externes. J'ai posé une toute nouvelle question (parce que mon événement mouseup ne se déclenche pas toujours, donc cette solution ne fonctionne pas pour moi) et j'ai obtenu cette réponse dans peut-être 5 minutes.C'est une vieille question, et les réponses ici semblent principalement préconiser l'utilisation
mousedown
et lemouseup
suivi de la pression sur un bouton. Mais comme d'autres l'ont souligné,mouseup
ne se déclenche que lorsqu'il est exécuté dans le navigateur, ce qui peut entraîner la perte de trace de l'état du bouton.Cependant, MouseEvent (maintenant) indique quels boutons sont actuellement enfoncés:
MouseEvent.buttons
MouseEvent.which
(buttons
ne sera pas défini pour Safari) Remarque:which
utilise des nombres différents de ceuxbuttons
des clics droit et central.Lorsqu'il est enregistré sur
document
,mousemove
se déclenche immédiatement dès que le curseur rentre dans le navigateur, donc si l'utilisateur libère à l'extérieur, l'état sera mis à jour dès qu'il reviendra à l'intérieur de la souris.Une implémentation simple pourrait ressembler à:
Si des scénarios plus compliqués sont nécessaires (différents boutons / plusieurs boutons / touches de contrôle), consultez la documentation MouseEvent. Quand / si Safari lève son jeu, cela devrait devenir plus facile.
la source
e.buttons
sera le cas1+2=3
, cee.buttons === 1
sera faux). Si vous voulez vérifier si le bouton principal est en panne, mais que vous ne vous souciez pas des autres états de bouton, procédez comme suit:(e.buttons & 1) === 1
MouseEvent.buttons
, il semblerait que cela7
signifie qu'il pense que les boutons primaire, secondaire et auxiliaire sont tous pressés ensemble. Je ne sais pas pourquoi cela serait le cas - utilisez-vous une souris avancée? Si tel est le cas, cela vaut peut-être la peine d'essayer avec un modèle basique. Si vous avez juste besoin de le faire démarrer, vous pouvez utiliser une vérification au niveau du bit pour vous assurer que le bouton gauche est enfoncé et ignorer les autres. par exemple.MouseEvent.buttons & 1 === 1
.Je pense que la meilleure approche consiste à conserver votre propre enregistrement de l'état du bouton de la souris, comme suit:
puis, plus loin dans votre code:
la source
la solution n'est pas bonne. on pourrait "mousedown" sur le document, puis "mouseup" en dehors du navigateur, et dans ce cas le navigateur penserait toujours que la souris est en bas.
la seule bonne solution consiste à utiliser l'objet IE.event.
la source
Je sais que c'est un ancien article, mais je pensais que le suivi du bouton de la souris à l'aide de la souris haut / bas me semblait un peu maladroit, alors j'ai trouvé une alternative qui pourrait plaire à certains.
Le sélecteur: active gère bien mieux le clic de la souris que la souris haut / bas, vous avez juste besoin d'un moyen de lire cet état dans l'événement onmousemove. Pour cela, j'avais besoin de tricher et je me suis appuyé sur le fait que le curseur par défaut est "auto" et je l'ai juste changé en "default", qui est ce que sélectionne automatiquement par défaut.
Vous pouvez utiliser n'importe quoi dans l'objet renvoyé par getComputedStyle que vous pouvez utiliser comme indicateur sans perturber l'apparence de votre page, par exemple la couleur de la bordure.
J'aurais aimé définir mon propre style défini par l'utilisateur dans la section: active, mais je n'ai pas pu le faire fonctionner. Ce serait mieux si c'est possible.
la source
L'extrait de code suivant tentera d'exécuter la fonction «doStuff» 2 secondes après que l'événement mouseDown se produit dans document.body. Si l'utilisateur soulève le bouton, l'événement mouseUp se produira et annulera l'exécution différée.
Je vous conseillerais d'utiliser une méthode pour l'attachement d'événements entre navigateurs - la définition explicite des propriétés mousedown et mouseup a été effectuée pour simplifier l'exemple.
la source
Court et doux
Je ne sais pas pourquoi aucune des réponses précédentes n'a fonctionné pour moi, mais j'ai trouvé cette solution pendant un moment eureka. Cela fonctionne non seulement, mais c'est aussi le plus élégant:
Ajouter à la balise body:
Ensuite, testez et exécutez
myfunction()
sidown
égal1
:la source
Vous pouvez combiner @Pax et mes réponses pour obtenir également la durée pendant laquelle la souris est restée en panne:
Puis plus tard:
la source
Vous devez gérer MouseDown et MouseUp et définir un indicateur ou quelque chose pour le suivre "plus tard sur la route" ... :(
la source
Si vous travaillez dans une page complexe avec des gestionnaires d'événements de souris existants, je vous recommande de gérer l'événement lors de la capture (au lieu de la bulle). Pour ce faire, réglez simplement le 3ème paramètre
addEventListener
surtrue
.De plus, vous voudrez peut-être vérifier pour
event.which
vous assurer que vous gérez l'interaction réelle de l'utilisateur et non les événements de souris, par exempleelem.dispatchEvent(new Event('mousedown'))
.Ajoutez le gestionnaire au document (ou à la fenêtre) au lieu de document.body est important car il garantit que les événements de souris en dehors de la fenêtre sont toujours enregistrés.
la source
À l'aide de l' API MouseEvent , pour vérifier le bouton enfoncé, le cas échéant:
Retour :
la source
En utilisant jQuery, la solution suivante gère même le «glisser hors de la page puis relâcher le cas».
Je ne sais pas comment il gère plusieurs boutons de souris. S'il y avait un moyen de démarrer le clic en dehors de la fenêtre, puis d'amener la souris dans la fenêtre, cela ne fonctionnerait probablement pas correctement non plus.
la source
Ci-dessous l'exemple jQuery, lorsque la souris est sur $ ('. Element'), la couleur change en fonction du bouton de la souris enfoncé.
la source
Comme dit @Jack, lorsque
mouseup
cela se produit en dehors de la fenêtre du navigateur, nous n'en sommes pas conscients ...Ce code a (presque) fonctionné pour moi:
Malheureusement, je n'obtiendrai pas l'
mouseup
événement dans l'un de ces cas:la source
Eh bien, vous ne pouvez pas vérifier s'il est en panne après l'événement, mais vous pouvez vérifier s'il est en hausse ... S'il est en hausse ... cela signifie qu'il n'est plus en panne: P lol
Ainsi, l'utilisateur appuie sur le bouton vers le bas (événement onMouseDown) ... et après cela, vous vérifiez s'il est activé (onMouseUp). Même si ce n'est pas le cas, vous pouvez faire ce dont vous avez besoin.
la source
cette version multi-navigateurs fonctionne très bien pour moi.
la source