Ich verwende jQuery.click
das Mausklickereignis im Raphael-Diagramm. In der Zwischenzeit muss ich das Mausereignis behandeln drag
, aus dem das Ziehen der Maus besteht mousedown
, mouseup
und mousemove
in Raphael.
Es ist schwer zu unterscheiden click
und drag
weil click
auch mousedown
& enthalten mouseup
, wie kann ich Mausklick & Mauszug dann in Javascript unterscheiden?
javascript
dom-events
Leem
quelle
quelle
mousedown
undmouseup
anstelle des Abhörens desmousemove
Ereignisses zum Setzen eines Flags enthalten. Darüber hinaus würde es das von @mrjrdnthmsFalls Sie jQuery bereits verwenden:
quelle
drag
. Ein zusätzlicher Bereich, wie andere Kommentare sagen, kann hier erforderlich sein.evt
und das Vergleichen mit der Position der zweitenevt
, also zum Beispiel :if (evt.type === 'mouseup' || Math.abs(evt1.pageX - evt2.pageX) < 5 || Math.abs(evt1.pageY - evt2.pageY) < 5) { ...
..on('mouseup mousemove touchend touchmove')
, und außerdem werden keine Positionsvariablen festgelegt. Tolle Lösung!Reiniger ES2015
Ich habe keine Fehler festgestellt, wie andere kommentieren.
quelle
Das sollte gut funktionieren. Ähnlich wie die akzeptierte Antwort (obwohl mit jQuery), aber das
isDragging
Flag wird nur zurückgesetzt, wenn sich die neue Mausposition von der beimousedown
Ereignis unterscheidet. Im Gegensatz zur akzeptierten Antwort funktioniert dies bei neueren Chrome-Versionen, bei denenmousemove
unabhängig davon, ob die Maus bewegt wurde oder nicht , eine Abgabe erfolgt.Sie können auch das Einchecken der Koordinaten anpassen,
mousemove
wenn Sie ein wenig Toleranz hinzufügen möchten (dh winzige Bewegungen als Klicks behandeln, nicht als Schleppen).quelle
Wenn Sie Rxjs verwenden möchten :
Dies ist ein direkter Klon dessen, was @ wong2 in seiner Antwort getan hat, aber in RxJs konvertiert.
Auch interessante Verwendung von
sample
. Dersample
Operator nimmt den neuesten Wert aus der Quelle (merge
vonmousedown
undmousemove
) und gibt ihn aus, wenn das innere Observable (mouseup
) ausgegeben wird.quelle
Wie mrjrdnthms in seinem Kommentar zur akzeptierten Antwort hervorhebt, funktioniert dies in Chrome nicht mehr (es wird immer die Mausbewegung ausgelöst). Ich habe Gustavos Antwort (da ich jQuery verwende) angepasst, um das Chrome-Verhalten zu beheben.
Die
Array.prototype.equals
Funktion ergibt sich aus dieser Antwortquelle
[evt.pageX, evt.pageY].equals()
Befehl erhalten. Ich habe das durch ersetzt(evt.pageX === currentPos[0] && evt.pageY===currentPos[1])
und alles war gut. :)equals
Code muss über den Link am Ende meines Beitrags hinzugefügt werdencurrentPos
aufmousemove
? Bedeutet das nicht, dass Sie einige Drags als Klicks behandeln würden?"mouseup"
die Maus noch bewegen.Alle diese Lösungen brechen entweder bei winzigen Mausbewegungen oder sind zu kompliziert.
Hier ist eine einfache anpassbare Lösung mit zwei Ereignis-Listenern. Delta ist der Abstand in Pixel, den Sie horizontal oder vertikal zwischen den Aufwärts- und Abwärtsereignissen verschieben müssen, damit der Code ihn als Ziehen und nicht als Klicken klassifiziert. Dies liegt daran, dass Sie manchmal die Maus oder Ihren Finger einige Pixel bewegen, bevor Sie sie anheben.
quelle
delta
dafür verwendet wird? hat es etwas mit tippen auf mobilen gerät zu tun?Verwenden von jQuery mit einem 5-Pixel-x / y-Schwellenwert zum Erkennen des Widerstands:
quelle
Wenn Sie nur den Drag-Fall herausfiltern möchten, gehen Sie folgendermaßen vor:
quelle
Pure JS mit DeltaX und DeltaY
Dies DeltaX und DeltaY, wie durch einen Kommentar in der akzeptierten Antwort vorgeschlagen, um die frustrierende Erfahrung zu vermeiden, wenn versucht wird, zu klicken und stattdessen eine Ziehoperation aufgrund einer Mausbewegung mit einem Tick auszuführen.
quelle
Für eine öffentliche Aktion auf einer OSM-Karte (Positionieren eines Markers beim Klicken) lautete die Frage: 1) Wie wird die Dauer der Maus nach unten-> nach oben bestimmt (Sie können sich nicht vorstellen, für jeden Klick einen neuen Marker zu erstellen) und 2) Die Maus bewegt sich während des Abwärts-> Aufwärtsfahrens (dh der Benutzer zieht die Karte).
quelle
Eine andere Lösung für klassenbasiertes Vanille-JS unter Verwendung eines Abstandsschwellenwerts
Und zur Klasse hinzufügen (SOMESLIDER_ELEMENT kann auch ein globales Dokument sein):
quelle
Wenn Sie das Klick- oder Ziehverhalten eines bestimmten Elements überprüfen möchten, können Sie dies tun, ohne auf den Körper hören zu müssen.
quelle
aus der Antwort von @Przemek,
quelle