Pertanyaan Anda tidak sepenuhnya jelas, tetapi jika Anda hanya ingin menghilangkan klik dua kali, sambil mempertahankan efek hover untuk mouse, saran saya adalah:
- Tambahkan efek hover pada
touchstart
dan mouseenter
.
- Hapus efek hover pada
mouseleave
, touchmove
dan click
.
Latar Belakang
Untuk mensimulasikan mouse, browser seperti Webkit seluler mengaktifkan peristiwa berikut jika pengguna menyentuh dan melepaskan jarinya di layar sentuh (seperti iPad) (sumber: Touch And Mouse di html5rocks.com):
touchstart
touchmove
touchend
- Penundaan 300 md, saat browser memastikan ini adalah satu ketukan, bukan ketukan dua kali
mouseover
mouseenter
- Catatan : Jika sebuah
mouseover
, mouseenter
atau mousemove
peristiwa mengubah konten halaman, peristiwa berikut tidak pernah diaktifkan.
mousemove
mousedown
mouseup
click
Tampaknya tidak mungkin untuk hanya memberi tahu browser web untuk melewati acara mouse.
Yang lebih buruk, jika peristiwa gerakan mouse mengubah konten halaman, peristiwa klik tidak pernah diaktifkan, seperti yang dijelaskan di Panduan Konten Web Safari - Penanganan Peristiwa , khususnya gambar 6.4 di Peristiwa Satu Jari . Apa sebenarnya "perubahan konten" itu, bergantung pada browser dan versinya. Saya telah menemukan bahwa untuk iOS 7.0, perubahan warna latar belakang bukanlah (atau tidak lagi?) Perubahan konten.
Solusi Dijelaskan
Rangkuman:
- Tambahkan efek hover pada
touchstart
dan mouseenter
.
- Hapus efek hover pada
mouseleave
, touchmove
dan click
.
Perhatikan bahwa tidak ada tindakan touchend
!
Ini jelas berfungsi untuk peristiwa mouse: mouseenter
dan mouseleave
(versi yang sedikit lebih baik dari mouseover
dan mouseout
) diaktifkan, dan menambah serta menghapus hover.
Jika pengguna benar-benar click
link, efek hover juga dihapus. Ini memastikan bahwa itu dihapus jika pengguna menekan tombol kembali di browser web.
Ini juga berfungsi untuk acara sentuh: pada touchstart
efek hover ditambahkan. Ini '' 'tidak' '' dihapus pada touchend
. Itu ditambahkan lagi pada mouseenter
, dan karena ini tidak menyebabkan perubahan konten (itu sudah ditambahkan), click
acara juga diaktifkan, dan tautan diikuti tanpa perlu pengguna mengeklik lagi!
Penundaan 300 md yang dimiliki browser di antara touchstart
peristiwa dan click
sebenarnya digunakan dengan baik karena efek hover akan ditampilkan selama waktu yang singkat ini.
Jika pengguna memutuskan untuk membatalkan klik, gerakan jari akan melakukannya seperti biasa. Biasanya, ini menjadi masalah karena tidak ada mouseleave
peristiwa yang dipicu, dan efek hover tetap ada. Untungnya, ini dapat dengan mudah diperbaiki dengan menghilangkan efek hover touchmove
.
Itu dia!
Perhatikan bahwa penundaan 300 md dapat dihapus, misalnya menggunakan pustaka FastClick , tetapi hal ini di luar cakupan pertanyaan ini.
Solusi Alternatif
Saya telah menemukan masalah berikut dengan alternatif berikut:
- Deteksi browser: Sangat rentan terhadap kesalahan. Mengasumsikan bahwa perangkat memiliki mouse atau sentuhan, sedangkan kombinasi keduanya akan menjadi semakin umum saat layar sentuh berkembang biak.
- Deteksi media CSS: Satu-satunya solusi khusus CSS yang saya ketahui. Masih rentan terhadap kesalahan, dan masih menganggap bahwa perangkat memiliki mouse atau sentuhan, sementara keduanya memungkinkan.
- Tiru peristiwa klik dalam
touchend
: Ini akan mengikuti tautan secara tidak benar, meskipun pengguna hanya ingin menggulir atau memperbesar / memperkecil, tanpa bermaksud untuk benar-benar mengeklik tautan tersebut.
- Gunakan variabel untuk menekan peristiwa mouse: Ini menetapkan variabel
touchend
yang digunakan sebagai kondisi-jika dalam peristiwa mouse berikutnya untuk mencegah perubahan status pada saat itu. Variabel disetel ulang dalam acara klik. Ini adalah solusi yang layak jika Anda benar-benar tidak menginginkan efek hover pada antarmuka sentuh. Sayangnya, ini tidak berfungsi jika a touchend
diaktifkan karena alasan lain dan tidak ada peristiwa klik yang diaktifkan (mis. Pengguna menggulir atau memperbesar), dan kemudian mencoba mengikuti tautan dengan mouse (yaitu pada perangkat dengan mouse dan antarmuka sentuh ).
Bacaan lebih lanjut
Lihat juga masalah klik ganda iPad / iPhone dan Nonaktifkan efek hover di browser seluler .