Saya menggunakan jQuery.click
untuk menangani acara klik mouse pada grafik Raphael, sementara itu, saya perlu menangani drag
acara mouse, terdiri dari drag mouse mousedown
, mouseup
dan mousemove
dalam Raphael.
Sulit dibedakan click
dan drag
karena click
juga mengandung mousedown
& mouseup
, Bagaimana saya bisa membedakan "klik" & tarik "mouse" kemudian di Javascript?
javascript
dom-events
Leem
sumber
sumber
mousedown
danmouseup
alih-alih mendengarkanmousemove
acara untuk mengatur bendera. Selain itu, itu akan memperbaiki masalah yang disebutkan oleh @mrjrdnthmsJika Anda sudah menggunakan jQuery:
sumber
drag
. Ruang lingkup tambahan seperti komentar lain mungkin diperlukan di sini.evt
dan membandingkan dengan posisi keduaevt
, sehingga, misalnya:if (evt.type === 'mouseup' || Math.abs(evt1.pageX - evt2.pageX) < 5 || Math.abs(evt1.pageY - evt2.pageY) < 5) { ...
..on('mouseup mousemove touchend touchmove')
, dan di atas itu tidak menetapkan variabel posisi. Solusi bagus!Pembersih ES2015
Tidak mengalami bug, seperti komentar orang lain.
sumber
Ini harus bekerja dengan baik. Mirip dengan jawaban yang diterima (meskipun menggunakan jQuery), tetapi
isDragging
flag hanya direset jika posisi mouse baru berbeda dari yang dimousedown
acara. Berbeda dengan jawaban yang diterima, itu bekerja pada versi terbaru Chrome, di manamousemove
dipecat terlepas dari apakah mouse dipindahkan atau tidak.Anda juga dapat menyesuaikan check-in koordinat
mousemove
jika Anda ingin menambahkan sedikit toleransi (mis. Memperlakukan gerakan kecil sebagai klik, bukan menyeret).sumber
Jika Anda ingin menggunakan Rxjs :
Ini adalah tiruan langsung dari apa yang dilakukan @ wong2 dalam jawabannya, tetapi dikonversi ke RxJs.
Juga penggunaan menarik
sample
. Thesample
Operator akan mengambil nilai terbaru dari sumber (yangmerge
darimousedown
danmousemove
) dan memancarkan ketika batin diamati (mouseup
) memancarkan.sumber
Seperti yang ditunjukkan oleh mrjrdnthms dalam komentarnya tentang jawaban yang diterima, ini tidak lagi berfungsi pada Chrome (ini selalu memicu mousemove), saya telah mengadaptasi jawaban Gustavo (karena saya menggunakan jQuery) untuk mengatasi perilaku Chrome.
The
Array.prototype.equals
fungsi berasal dari ini jawabannyasumber
[evt.pageX, evt.pageY].equals()
perintah. Saya menggantinya dengan(evt.pageX === currentPos[0] && evt.pageY===currentPos[1])
, dan semuanya baik-baik saja. :)equals
kebutuhan kode yang akan ditambahkan dari link di bagian bawah posting sayacurrentPos
padamousemove
? Bukankah ini berarti bahwa Anda akan memperlakukan beberapa hambatan sebagai klik?"mouseup"
masih menggerakkan mouse.Semua solusi ini bisa pecah pada pergerakan mouse kecil, atau terlalu rumit.
Berikut ini adalah solusi mudah beradaptasi yang menggunakan dua pendengar acara. Delta adalah jarak dalam piksel yang harus Anda pindahkan secara horizontal atau vertikal antara peristiwa atas dan bawah untuk mengklasifikasikan kode sebagai seret alih-alih klik. Ini karena kadang-kadang Anda akan menggerakkan mouse atau jari Anda beberapa piksel sebelum mengangkatnya.
sumber
delta
yang digunakan untuk ini? itu ada hubungannya dengan keran di perangkat seluler?delta
digunakan untuk "Akan membuat frustasi untuk mencoba mengklik dan mendapatkan operasi drag bukan karena mouse satu tik"Menggunakan jQuery dengan 5 x x / y theshold untuk mendeteksi hambatan:
sumber
Jika hanya untuk menyaring kotak tarik, lakukan seperti ini:
sumber
JS murni dengan DeltaX dan DeltaY
DeltaX dan DeltaY ini seperti yang disarankan oleh komentar dalam jawaban yang diterima untuk menghindari pengalaman frustasi ketika mencoba mengklik dan mendapatkan operasi seret bukan karena gerakan satu centang.
sumber
Untuk tindakan publik pada peta OSM (posisikan penanda pada klik) pertanyaannya adalah: 1) bagaimana menentukan durasi mouse turun -> atas (Anda tidak dapat membayangkan membuat penanda baru untuk setiap klik) dan 2) melakukan mouse bergerak selama down-> atas (yaitu pengguna menyeret peta).
sumber
Solusi lain menggunakan untuk vanilla JS berbasis kelas menggunakan jarak ambang batas
Dan tambahkan ke kelas (SOMESLIDER_ELEMENT juga dapat menjadi dokumen global):
sumber
Jika Anda ingin memeriksa perilaku klik atau seret elemen tertentu, Anda dapat melakukan ini tanpa harus mendengarkan isi.
sumber
dari jawaban @Przemek,
sumber