Bagaimana Anda bisa mendeteksi bahwa pengguna menggesekkan jarinya ke suatu arah di atas halaman web dengan JavaScript?
Saya bertanya-tanya apakah ada satu solusi yang akan berfungsi untuk situs web di iPhone dan ponsel Android.
Bagaimana Anda bisa mendeteksi bahwa pengguna menggesekkan jarinya ke suatu arah di atas halaman web dengan JavaScript?
Saya bertanya-tanya apakah ada satu solusi yang akan berfungsi untuk situs web di iPhone dan ponsel Android.
Jawaban:
Contoh kode vanilla JS sederhana:
Diuji di Android.
sumber
touchstart
,touchmove
?Berdasarkan jawaban @ givanse, ini adalah bagaimana Anda dapat melakukannya dengan
classes
:Anda dapat menggunakannya seperti ini:
sumber
.bind
undefined karena AndahandleTouchMove
sebenarnya tidak mengembalikan apa pun. juga tidak ada gunanya untuk memanggil bind ketika memanggil fungsi denganthis.
karena sudah terikat dengan konteks saat ini.bind(this);
dan itu bekerja dengan anggun. terima kasih @nicholas_rtouches[0]
kechangedTouches[0]
dan tipe event handlerhandleTouchMove
kehandleTouchEnd
run()
dua kali dan Anda mendapatkan kebocoran memori yang tidak menyenangkanSaya menggabungkan beberapa jawaban di sini ke dalam skrip yang menggunakan CustomEvent untuk memecat acara yang digesek di DOM. Tambahkan skrip 0.7k swiped-events.min.js ke halaman Anda dan dengarkan acara swiped :
digesekkan ke kiri
digesekkan ke kanan
digesek
digesek ke bawah
Anda juga dapat melampirkan langsung ke elemen:
Konfigurasi opsional
Anda dapat menentukan atribut berikut untuk menyesuaikan bagaimana fungsi interaksi swipe di halaman Anda (ini adalah opsional) .
Kode sumber tersedia di Github
sumber
apa yang saya gunakan sebelumnya adalah Anda harus mendeteksi acara mousedown, merekam lokasi x, y (mana yang relevan) kemudian mendeteksi acara mouseup, dan kurangi dua nilai.
sumber
jQuery Mobile juga mencakup dukungan swipe: http://api.jquerymobile.com/swipe/
Contoh
sumber
Saya telah menemukan jawaban brilian @givanse sebagai yang paling dapat diandalkan dan kompatibel di beberapa browser seluler untuk mendaftarkan tindakan gesek.
Namun, ada perubahan dalam kodenya yang diperlukan untuk membuatnya berfungsi di browser seluler modern yang menggunakan
jQuery
.event.touches
tidak akan ada jikajQuery
digunakan dan menghasilkanundefined
dan harus diganti olehevent.originalEvent.touches
. TanpajQuery
,event.touches
seharusnya bekerja dengan baik.Jadi solusinya menjadi,
Diuji pada:
sumber
event.originalEvent
. Masalahnyaevent.touches
sudah tidak ada lagi sekarang dan menghasilkanundefined
.event.originalEvent
. Saya akan memperbarui jawaban saya. Terima kasih! :)Saya telah dikemas ulang
TouchWipe
sebagai plugin jquery pendek:detectSwipe
sumber
Beberapa mod jawaban uppest (tidak dapat mengomentari ...) untuk menangani gesekan singkat
sumber
trashold, sapuan timeout, tambahkan swipeBlockElems.
sumber
Jika ada yang mencoba menggunakan jQuery Mobile di Android dan memiliki masalah dengan deteksi gesek JQM
(Saya punya beberapa di Xperia Z1, Galaxy S3, Nexus 4 dan beberapa telepon Wiko juga) ini bisa berguna:
Gesek pada android tidak terdeteksi kecuali itu gesekan yang sangat panjang, tepat dan cepat.
Dengan dua garis ini berfungsi dengan benar
sumber
$.event.special.swipe.scrollSupressionThreshold = 8;
tetapi Anda menempatkan saya di arah yang benar! Terima kasih!Saya mengalami masalah dengan handler touchend menembak terus menerus sementara pengguna menyeret jari. Saya tidak tahu apakah itu karena sesuatu yang saya lakukan salah atau tidak, tetapi saya mengembalikan ini untuk mengumpulkan gerakan dengan touchmove dan touchend benar-benar memicu callback.
Saya juga perlu memiliki banyak contoh ini dan saya menambahkan metode aktifkan / nonaktifkan.
Dan ambang batas di mana gesekan singkat tidak menyala. Touchstart nol adalah penghitung setiap kali.
Anda dapat mengubah target_node dengan cepat. Mengaktifkan penciptaan adalah opsional.
sumber
Saya telah menggabungkan beberapa jawaban juga, sebagian besar yang pertama dan yang kedua dengan kelas, dan inilah versi saya:
Setelah itu dapat menggunakannya sebagai berikut:
Ini membantu untuk menghindari kesalahan konsol ketika Anda ingin memanggil hanya katakanlah metode "onLeft".
sumber
Digunakan dua:
jQuery mobile: bekerja di sebagian besar kasus dan khususnya ketika Anda sedang mengembangkan aplikasi yang menggunakan plugin jQuery lainnya maka lebih baik menggunakan kontrol jQuery mobile untuk ini. Kunjungi di sini: https://www.w3schools.com/jquerymobile/jquerymobile_events_touch.asp
Waktu palu! salah satu perpustakaan berbasis javascript terbaik, ringan dan cepat. Kunjungi di sini: https://hammerjs.github.io/
sumber
Jika Anda hanya perlu menggesek, Anda lebih baik dari ukuran bijaksana hanya menggunakan bagian yang Anda butuhkan. Ini harus bekerja pada perangkat sentuh apa pun.
Ini ~ 450 byte setelah kompresi gzip, minifikasi, babel dll.
Saya menulis kelas di bawah ini berdasarkan jawaban yang lain, menggunakan persentase yang dipindahkan alih-alih piksel, dan pola dispatcher acara untuk mengaitkan / melepas kaitan sesuatu.
Gunakan seperti ini:
sumber
Saya ingin mendeteksi geser ke kiri dan kanan saja, tetapi memicu tindakan hanya ketika acara sentuh berakhir , jadi saya sedikit mengubah jawaban hebat @ givanse untuk melakukan itu.
Kenapa melakukan itu? Jika misalnya, saat menggesekkan, pengguna melihat ia akhirnya tidak ingin menggesek, ia dapat menggerakkan jarinya di posisi semula. (aplikasi telepon "kencan" yang sangat populer melakukan ini;)), dan kemudian "geser ke kanan" acara dibatalkan.
Jadi untuk menghindari peristiwa "gesek ke kanan" hanya karena ada perbedaan 3px secara horizontal, saya menambahkan ambang di mana peristiwa dibuang: untuk memiliki peristiwa "gesek ke kanan", pengguna harus menggesek setidaknya 1/3 dari lebar browser (tentu saja Anda dapat memodifikasi ini).
Semua detail kecil ini meningkatkan pengalaman pengguna. Berikut adalah kode (Vanilla JS):
sumber
Contoh vanilla JS sederhana untuk sapuan horizontal:
Anda dapat menggunakan logika yang hampir sama untuk sapuan vertikal.
sumber
Menambah jawaban ini di sini . Yang ini menambahkan dukungan untuk acara mouse untuk pengujian di desktop:
sumber
Saya mengerjakan ulang solusi @givanse agar berfungsi sebagai hook React. Input adalah beberapa pendengar acara opsional, output adalah ref fungsional (perlu fungsional sehingga kait dapat dijalankan kembali ketika / jika ref berubah).
Juga ditambahkan di param ambang geseran vertikal / horizontal, sehingga gerakan kecil tidak secara tidak sengaja memicu acara pendengar, tetapi ini dapat diatur ke 0 untuk meniru jawaban asli lebih dekat.
Kiat: untuk kinerja terbaik, fungsi input pendengar acara harus ditulis memo.
sumber
Contoh cara menggunakan dengan offset.
sumber
Anda mungkin memiliki waktu yang lebih mudah untuk menerapkannya terlebih dahulu dengan acara mouse ke prototipe.
Ada banyak jawaban di sini, termasuk bagian atas, harus digunakan dengan hati-hati karena mereka tidak mempertimbangkan kasus tepi terutama di sekitar kotak pembatas.
Lihat:
Anda perlu bereksperimen untuk menangkap kasus dan perilaku tepi seperti penunjuk yang bergerak di luar elemen sebelum berakhir.
Babatan adalah gerakan yang sangat dasar yang merupakan tingkat yang lebih tinggi dari pemrosesan interaksi penunjuk antarmuka kira-kira duduk antara memproses peristiwa mentah dan pengenalan tulisan tangan.
Tidak ada metode tunggal yang tepat untuk mendeteksi gesekan atau gesekan meskipun hampir semua umumnya mengikuti prinsip dasar mendeteksi gerakan melintasi elemen dengan ambang jarak dan kecepatan atau kecepatan. Anda mungkin hanya mengatakan bahwa jika ada gerakan melintasi 65% dari ukuran layar dalam arah tertentu dalam waktu tertentu maka itu adalah swipe. Tepat di mana Anda menggambar garis dan bagaimana Anda menghitungnya, itu terserah Anda.
Beberapa orang mungkin juga melihatnya dari perspektif momentum ke arah dan seberapa jauh dari layar telah didorong ketika elemen dilepaskan. Ini lebih jelas dengan gesekan lengket di mana elemen dapat diseret dan kemudian pada rilis akan bangkit kembali atau terbang dari layar seolah-olah elastis pecah.
Mungkin ideal untuk mencoba menemukan perpustakaan gerakan yang dapat Anda porting atau gunakan kembali yang biasa digunakan untuk konsistensi. Banyak contoh di sini terlalu sederhana, mendaftarkan gesekan sebagai sentuhan sedikit ke segala arah.
Android akan menjadi pilihan yang jelas meskipun memiliki masalah yang berlawanan, itu terlalu rumit.
Banyak orang tampaknya salah mengartikan pertanyaan itu sebagai gerakan ke arah mana pun. Babatan adalah gerakan yang luas dan relatif singkat yang sangat dalam satu arah (meskipun dapat melengkung dan memiliki sifat percepatan tertentu). Serupa adalah serupa meskipun bermaksud untuk dengan santai mendorong item jauh jarak yang adil di bawah momentumnya sendiri.
Keduanya cukup mirip bahwa beberapa perpustakaan hanya menyediakan fling atau swipe, yang dapat digunakan secara bergantian. Pada layar datar, sulit untuk benar-benar memisahkan kedua gerakan dan secara umum orang melakukan keduanya (menggesekkan layar fisik tetapi melemparkan elemen UI yang ditampilkan di layar).
Pilihan terbaik Anda adalah tidak melakukannya sendiri. Sudah ada banyak perpustakaan JavaScript untuk mendeteksi gerakan sederhana .
sumber