Używam jQuery.click
obsłużyć zdarzenie kliknięcia myszki na wykresie Raphael tymczasem muszę obsłużyć myszy drag
zdarzenie, przeciągnij mysz składa mousedown
, mouseup
a mousemove
w Raphael.
Jest trudny do rozróżnienia, click
a drag
ponieważ click
zawiera również mousedown
& mouseup
, Jak odróżnić „kliknięcie” i „przeciągnięcie” myszą niż w JavaScript?
javascript
dom-events
Leem
źródło
źródło
mousedown
imouseup
zamiast nasłuchiwaćmousemove
zdarzenia w celu ustawienia flagi. Ponadto, byłoby rozwiązać ten problem, o którym wspomina @mrjrdnthmsJeśli korzystasz już z jQuery:
źródło
drag
. Może być potrzebny dodatkowy zakres, jak mówią inne komentarze.evt
i porównywanie z pozycją drugiejevt
, czyli npif (evt.type === 'mouseup' || Math.abs(evt1.pageX - evt2.pageX) < 5 || Math.abs(evt1.pageY - evt2.pageY) < 5) { ...
. : ..on('mouseup mousemove touchend touchmove')
, a na dodatek nie ustawia zmiennych pozycji. Świetne rozwiązanie!Środek czyszczący ES2015
Nie wystąpiły żadne błędy, jak komentują inni.
źródło
To powinno działać dobrze. Podobna do zaakceptowanej odpowiedzi (choć przy użyciu jQuery), ale
isDragging
flaga jest resetowana tylko wtedy, gdy nowa pozycja myszy różni się od tej wmousedown
zdarzeniu. W przeciwieństwie do zaakceptowanej odpowiedzi, która działa na najnowszych wersjach Chrome, gdziemousemove
jest uruchamiana niezależnie od tego, czy mysz została przeniesiona, czy nie.Możesz również dostosować sprawdzanie współrzędnych,
mousemove
jeśli chcesz dodać trochę tolerancji (tj. Traktuj drobne ruchy jako kliknięcia, a nie przeciąganie).źródło
Jeśli masz ochotę użyć Rxjs :
Jest to bezpośredni klon tego, co @ wong2 zrobił w swojej odpowiedzi, ale przekonwertowany na RxJs.
Ciekawe użycie
sample
.sample
Operator weźmie ostatnią wartość z Źródła (merge
zmousedown
amousemove
) i wydzielają je, kiedy wewnętrzna zaobserwować (mouseup
) wytwarza.źródło
Jak mrjrdnthms wskazuje w swoim komentarzu do zaakceptowanej odpowiedzi, to już nie działa w Chrome (zawsze uruchamia ruch myszy), dostosowałem odpowiedź Gustavo (ponieważ używam jQuery), aby rozwiązać problem zachowania Chrome.
Array.prototype.equals
Funkcja pochodzi z tej odpowiedziźródło
[evt.pageX, evt.pageY].equals()
polecenia. Zastąpiłem to(evt.pageX === currentPos[0] && evt.pageY===currentPos[1])
i wszystko było dobrze. :)equals
potrzeby należy dodać kod z linku na dole mojego postucurrentPos
namousemove
? Czy to nie oznacza, że traktujesz niektóre przeciągnięcia jako kliknięcia?"mouseup"
nadal poruszasz myszą.Wszystkie te rozwiązania albo psują się przy niewielkich ruchach myszy, albo są nadmiernie skomplikowane.
Oto proste rozwiązanie, które można dostosować, wykorzystujące dwa detektory zdarzeń. Delta to odległość w pikselach, którą należy przesunąć w poziomie lub w pionie między zdarzeniami w górę iw dół, aby kod zaklasyfikował go jako przeciągnięcie, a nie kliknięcie. Dzieje się tak, ponieważ czasami przed podniesieniem przesuniesz mysz lub palec o kilka pikseli.
źródło
delta
jest do tego używane? ma to coś wspólnego z dotknięciem w urządzeniu mobilnym?delta
jest używany do określenia „Byłoby frustrujące, gdybyśmy spróbowali kliknąć i wykonać operację przeciągania z powodu jednego kliknięcia myszy”Używając jQuery z 5-pikselowym X / Y theshold do wykrywania przeciągnięcia:
źródło
Jeśli chcesz tylko odfiltrować przypadek przeciągania, zrób to w następujący sposób:
źródło
Czysty JS z DeltaX i DeltaY
To DeltaX i DeltaY, jak sugeruje komentarz w zaakceptowanej odpowiedzi, aby uniknąć frustrującego doświadczenia podczas próby kliknięcia i zamiast tego uzyskać operację przeciągania z powodu jednego kliknięcia myszą.
źródło
W przypadku akcji publicznej na mapie OSM (umieść znacznik po kliknięciu) pytanie brzmiało: 1) jak określić czas trwania ruchu myszy w dół -> w górę (nie możesz sobie wyobrazić tworzenia nowego znacznika dla każdego kliknięcia) i 2) tak ruch myszy w dół-> w górę (tj. użytkownik przeciąga mapę).
źródło
Inne rozwiązanie wykorzystujące klasowy waniliowy JS wykorzystujący próg odległości
I dodaj do klasy (SOMESLIDER_ELEMENT może być również dokumentem globalnym):
źródło
Jeśli chcesz sprawdzić zachowanie kliknięcia lub przeciągnięcia określonego elementu, możesz to zrobić bez konieczności słuchania treści.
źródło
z odpowiedzi @Przemek,
źródło