J'utilise jQuery.click
pour gérer l'événement de clic de souris sur le graphique de Raphael, en attendant, je dois gérer l' drag
événement de souris, le glissement de la souris se compose de mousedown
, mouseup
et mousemove
dans Raphael.
Il est difficile de distinguer click
et drag
parce qu'il click
contient également mousedown
& mouseup
, Comment puis-je distinguer le "clic" de la souris et le "glisser" de la souris puis en Javascript?
mousedown
etmouseup
au lieu d'écouter l'mousemove
événement pour définir un indicateur. De plus, cela résoudrait le problème mentionné par @mrjrdnthmsSi vous utilisez déjà jQuery:
la source
drag
. Une portée supplémentaire comme d'autres commentaires le disent peut être nécessaire ici.evt
et la comparaison avec la position du secondevt
, ainsi, par exemple:if (evt.type === 'mouseup' || Math.abs(evt1.pageX - evt2.pageX) < 5 || Math.abs(evt1.pageY - evt2.pageY) < 5) { ...
..on('mouseup mousemove touchend touchmove')
, et en plus de cela, ne définit pas de variables de position. Excellente solution!Nettoyant ES2015
Je n'ai rencontré aucun bogue, comme d'autres l'ont commenté.
la source
Cela devrait bien fonctionner. Similaire à la réponse acceptée (bien qu'en utilisant jQuery), mais l'
isDragging
indicateur n'est réinitialisé que si la nouvelle position de la souris diffère de celle sur l'mousedown
événement. Contrairement à la réponse acceptée, cela fonctionne sur les versions récentes de Chrome, oùmousemove
se déclenche, que la souris ait été déplacée ou non.Vous pouvez également ajuster la vérification des coordonnées
mousemove
si vous souhaitez ajouter un peu de tolérance (c'est-à-dire traiter les petits mouvements comme des clics et non des traînées).la source
Si vous avez envie d'utiliser Rxjs :
Ceci est un clone direct de ce que @ wong2 a fait dans sa réponse, mais converti en RxJs.
Utilisation également intéressante de
sample
. L'sample
opérateur prendra la dernière valeur de la source (lemerge
ofmousedown
etmousemove
) et l'émettra lorsque l'observable interne (mouseup
) émettra.la source
Comme le souligne mrjrdnthms dans son commentaire sur la réponse acceptée, cela ne fonctionne plus sur Chrome (il déclenche toujours la suppression de la souris), j'ai adapté la réponse de Gustavo (puisque j'utilise jQuery) pour traiter le comportement de Chrome.
La
Array.prototype.equals
fonction vient de cette réponsela source
[evt.pageX, evt.pageY].equals()
commande. J'ai remplacé cela par(evt.pageX === currentPos[0] && evt.pageY===currentPos[1])
, et tout était bon. :)equals
code doit être ajouté à partir du lien au bas de mon messagecurrentPos
surmousemove
? Cela ne signifie-t-il pas que vous traiteriez certains traînées comme des clics?"mouseup"
déplacez toujours la souris.Toutes ces solutions s'interrompent avec de minuscules mouvements de souris ou sont trop compliquées.
Voici une solution simple et adaptable utilisant deux écouteurs d'événements. Delta est la distance en pixels que vous devez déplacer horizontalement ou verticalement entre les événements haut et bas pour que le code le classe comme un glissement plutôt que comme un clic. C'est parce que parfois vous déplacerez la souris ou votre doigt de quelques pixels avant de le soulever.
la source
delta
est utilisé pour cela? c'est quelque chose à voir avec le robinet dans un appareil mobile?delta
sont utilisées pour "Ce serait frustrant d'essayer de cliquer et d'obtenir une opération de glissement à la place en raison d'une souris à un tick"Utilisation de jQuery avec une prise de 5 pixels x / y pour détecter la traînée:
la source
Si juste pour filtrer le cas de glissement, faites-le comme ceci:
la source
Pure JS avec DeltaX et DeltaY
Ce DeltaX et DeltaY comme suggéré par un commentaire dans la réponse acceptée pour éviter l'expérience frustrante lorsque vous essayez de cliquer et d'obtenir une opération de glissement à la place en raison d'un déplacement de la souris à un tick.
la source
Pour une action publique sur une carte OSM (positionner un marqueur sur clic), la question était: 1) comment déterminer la durée de la souris vers le bas -> vers le haut (vous ne pouvez pas imaginer créer un nouveau marqueur pour chaque clic) et 2) le déplacement de la souris vers le bas -> vers le haut (c'est-à-dire que l'utilisateur fait glisser la carte).
la source
Une autre solution utilisant pour le JS vanille basé sur les classes utilisant un seuil de distance
Et ajoutez à la classe (SOMESLIDER_ELEMENT peut également être un document pour être global):
la source
Si vous souhaitez vérifier le comportement de clic ou de glissement d'un élément spécifique, vous pouvez le faire sans avoir à écouter le corps.
la source
de la réponse de @Przemek,
la source