Saya memiliki beberapa situs web yang saya buat beberapa waktu lalu, yang menggunakan acara mouse jquery ... Saya baru saja mendapat ipad dan saya perhatikan bahwa semua peristiwa mouse di atas diterjemahkan dalam klik ... jadi misalnya saya harus melakukan dua klik, bukan satu .. (arahkan kursor pertama, daripada klik sebenarnya)
apakah ada solusi yang siap untuk mengatasi ini? mungkin perintah jquery yang harus saya gunakan sebagai pengganti mouseover / out dll .. terima kasih!
Jawaban:
Belum menguji ini sepenuhnya tetapi karena iOS mengaktifkan peristiwa sentuh, ini dapat berfungsi, dengan asumsi Anda berada dalam pengaturan jQuery.
Idenya adalah WebKit Seluler mengaktifkan
touchend
peristiwa di akhir ketukan sehingga kami mendengarkannya dan kemudian mengarahkan ulang browser segera setelahtouchend
peristiwa diaktifkan di tautan.sumber
.on
lebih disukai.live
. Setelah membaca jawaban ini, saya menemukan bahwa mengubah kode saya$('a').on('click touchend', function(e) {...})
berfungsi dengan sangat baik.target="_blank"
maka link tersebut akan terbuka di jendela yang sama DAN di jendela baru.Pertanyaan Anda tidak sepenuhnya jelas, tetapi jika Anda hanya ingin menghilangkan klik dua kali, sambil mempertahankan efek hover untuk mouse, saran saya adalah:
touchstart
danmouseenter
.mouseleave
,touchmove
danclick
.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
mouseover
mouseenter
mouseover
,mouseenter
ataumousemove
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:
touchstart
danmouseenter
.mouseleave
,touchmove
danclick
.Perhatikan bahwa tidak ada tindakan
touchend
!Ini jelas berfungsi untuk peristiwa mouse:
mouseenter
danmouseleave
(versi yang sedikit lebih baik darimouseover
danmouseout
) 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 padatouchend
. Itu ditambahkan lagi padamouseenter
, 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 danclick
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 hovertouchmove
.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:
touchend
: Ini akan mengikuti tautan secara tidak benar, meskipun pengguna hanya ingin menggulir atau memperbesar / memperkecil, tanpa bermaksud untuk benar-benar mengeklik tautan tersebut.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 atouchend
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
mouseover
ataumousemove
peristiwa.Lihat juga masalah klik ganda iPad / iPhone dan Nonaktifkan efek hover di browser seluler .
sumber
Sepertinya ada solusi CSS. Alasan Safari menunggu sentuhan kedua adalah karena gambar latar belakang (atau elemen) yang biasanya Anda tetapkan pada acara: hover. Jika tidak ada untuk ditampilkan - Anda tidak akan mengalami masalah. Solusinya adalah menargetkan platform iOS dengan file CSS sekunder (atau gaya dalam kasus pendekatan JS) yang menimpa: arahkan kursor ke latar belakang untuk mewarisi misalnya dan tetap menyembunyikan elemen yang akan Anda tampilkan di atas mouse:
Berikut ini contoh CSS dan HTML - blok produk dengan label berbintang di atas mouse:
HTML:
CSS:
Solusi (CSS sekunder):
sumber
Tak perlu bikin ribet.
sumber
Apa yang berhasil bagi saya adalah apa yang dikatakan orang lain di sini:
Jangan tampilkan / sembunyikan elemen di hover atau mousemove (yang merupakan acara dalam kasus saya).
Inilah yang dikatakan Apple ( https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html ):
Jadi, Anda dapat menggunakan solusi @ woop: deteksi userAgent, periksa apakah itu dan perangkat iOS dan kemudian ikat acara tersebut. Saya akhirnya menggunakan teknik ini karena sesuai dengan kebutuhan saya dan lebih masuk akal untuk tidak mengikat peristiwa hover saat Anda tidak menginginkannya.
Tapi ... jika Anda tidak ingin main-main dengan userAgents dan masih menyembunyikan / menampilkan elemen di hover / mousemove, saya menemukan Anda dapat melakukannya dengan menggunakan javascript asli, seperti ini:
Ini akan berfungsi pada versi Desktop dan tidak akan melakukan apa pun pada versi seluler.
Dan untuk kompatibilitas yang lebih sedikit ...
sumber
Solusi cduruk cukup efektif, tetapi menyebabkan masalah di beberapa bagian situs saya. Karena saya sudah menggunakan jQuery untuk menambahkan kelas hover CSS, solusi termudah adalah dengan tidak menambahkan kelas hover CSS di perangkat seluler (atau lebih tepatnya, HANYA menambahkannya saat BUKAN di perangkat seluler).
Inilah gagasan umumnya:
* kode dikurangi untuk tujuan ilustrasi
sumber
Saya pikir akan bijaksana untuk mencoba
mouseenter
menggantikanmouseover
. Itu yang digunakan secara internal saat mengikat.hover(fn,fn)
dan biasanya yang Anda inginkan.sumber
Saya memiliki masalah berikut dengan solusi yang ada, dan menemukan sesuatu yang tampaknya menyelesaikan semuanya. Ini mengasumsikan Anda membidik sesuatu lintas browser, lintas perangkat, dan tidak ingin perangkat mengendus.
Masalah yang dipecahkan ini
Menggunakan hanya
touchstart
atautouchend
:Memicu
mouseover
acara ditouchstart
danmouseout
ditouchmove
memiliki konsekuensi kurang serius, tetapi tidak mengganggu perilaku browser biasa, misalnya:touchstart
sepertimouseover
, yang akanmouseout
diedit berikutnyatouchstart
. Oleh karena itu, salah satu cara untuk melihat konten gerakan mouse di Android adalah dengan menyentuh area yang diinginkan dan menggoyangkan jari Anda, menggulir laman sedikit. Memperlakukantouchmove
sebagaimouseout
istirahat ini.Solusinya
Secara teori, Anda bisa menambahkan bendera dengan
touchmove
, tetapi iPhone memicu gerakan sentuh meskipun tidak ada gerakan. Secara teori, Anda bisa membandingkantouchstart
dantouchend
acarapageX
danpageY
tapi di iPhone, tidak adatouchend
pageX
ataupageY
.Jadi sayangnya untuk mencakup semua pangkalan itu berakhir sedikit lebih rumit.
Secara teori, ada cara untuk mendapatkan waktu yang tepat yang digunakan untuk longpress daripada hanya menggunakan 1000 sebagai perkiraan, tetapi dalam praktiknya tidak sesederhana itu dan yang terbaik adalah menggunakan proxy yang masuk akal .
sumber
Jawaban MacFreak sangat membantu saya. Berikut beberapa kode praktis jika itu membantu Anda.
MASALAH - menerapkan sentuhan berarti setiap kali Anda menggulirkan jari Anda di atas suatu elemen, itu merespons seolah-olah Anda telah menekannya, bahkan jika Anda hanya mencoba untuk menggulir melewati.
Saya membuat efek dengan jQuery yang memudar baris di bawah beberapa tombol untuk "menyorot" tombol yang melayang. Saya tidak ingin ini berarti Anda harus menekan tombol dua kali pada perangkat sentuh untuk mengikuti tautan.
Berikut tombol-tombolnya:
Saya ingin div "menu_underline" memudar saat gerakan mouse dan menghilang saat mouseout. TAPI saya ingin perangkat sentuh dapat mengikuti tautan dengan satu klik, bukan dua.
SOLUSI - Inilah jQuery untuk membuatnya berfungsi:
Terima kasih banyak atas bantuan Anda di MacFreak ini.
sumber
Saya baru tahu bahwa ini berfungsi jika Anda menambahkan pendengar kosong, jangan tanya mengapa, tetapi saya mengujinya di iPhone dan iPad dengan iOS 9.3.2 dan berfungsi dengan baik.
sumber
Menurut saya, tautan Anda tidak memiliki acara onmouseover, di mana 1 ketuk mengaktifkan onmouseover dan ketuk dua kali mengaktifkan tautan. tapi tidak. Saya tidak punya iPad. Saya pikir ya harus menggunakan acara gerakan / sentuhan.
https://developer.apple.com/documentation/webkitjs
sumber
Saya memiliki masalah yang sama tetapi tidak pada perangkat sentuh. Peristiwa dipicu setiap kali Anda mengklik. Ada sesuatu tentang antrian acara atau lebih.
Namun, solusi saya seperti ini: Saat acara diklik (atau sentuh?) Anda menyetel pengatur waktu. Jika tautan diklik lagi dalam X ms, Anda hanya mengembalikan false.
Untuk mengatur per timer elemen, Anda dapat menggunakan
$.data()
.Ini juga dapat memperbaiki masalah @Ferdy yang dijelaskan di atas.
sumber
Jika Anda menggunakan Modernizr, sangat mudah untuk menggunakan Modernizr.touch seperti yang disebutkan sebelumnya.
Namun, saya lebih suka menggunakan kombinasi Modernizr.touch dan pengujian agen pengguna, agar aman.
Jika Anda tidak menggunakan Modernizr, Anda cukup mengganti
Modernizr.touch
fungsi di atas dengan('ontouchstart' in document.documentElement)
Perhatikan juga bahwa menguji iemobile agen pengguna akan memberi Anda perangkat seluler Microsoft yang terdeteksi lebih luas daripada Windows Phone.
sumber
Kamu bisa memakai
click touchend
,contoh:
Contoh di atas akan memengaruhi semua tautan pada perangkat sentuh.
Jika Anda hanya ingin menargetkan tautan tertentu, Anda dapat melakukannya dengan menetapkan kelas padanya, yaitu:
HTML:
<a href="example.html" class="prevent-extra-click">Prevent extra click on touch device</a>
Jquery:
Bersulang,
Jeroen
sumber
Saya mengalami situasi serupa di mana saya mengalami peristiwa yang terkait dengan status mouseenter / mouseleave / klik suatu elemen, namun pada iPhone, pengguna harus mengklik dua kali elemen tersebut untuk pertama-tama memicu peristiwa mouseenter, lalu mengaktifkan peristiwa klik .
Saya menyelesaikan ini menggunakan metode yang mirip seperti di atas, tetapi saya memanfaatkan plugin jQuery $ .browser (untuk jQuery 1.9>) dan menambahkan acara .trigger ke acara pengikatan mouseenter, sebagai berikut:
.Trigger mencegah kebutuhan untuk mengklik dua kali elemen dengan mengaktifkan .click event handler pada mouseenter (atau klik awal) elemen tersebut saat dilihat di iPhone atau iPad. Mungkin bukan solusi yang paling elegan, tetapi berfungsi dengan baik dalam kasus saya dan menggunakan plugin yang sudah saya miliki, dan meminta saya untuk menambahkan satu baris kode agar acara saya yang ada berfungsi di bawah perangkat ini.
Anda bisa mendapatkan plugin jQuery $ .browser di sini: https://github.com/gabceb/jquery-browser-plugin
sumber
Hanya perbaikan untuk menghindari pengalihan saat Anda menggeser jari Anda pada tautan secara tidak sengaja.
sumber
Dengan inspirasi dari MacFreak, saya mengumpulkan sesuatu yang berhasil untuk saya.
Metode js ini mencegah hover menempel pada ipad, dan mencegah klik terdaftar sebagai dua klik dalam beberapa kasus. Di CSS, jika Anda memiliki: hover kelas psudo di css Anda, ubah menjadi .hover Misalnya .some-class: hover ke .some-class.hover
Uji kode ini pada ipad untuk melihat bagaimana metode css dan js hover berperilaku berbeda (hanya dalam efek hover). Tombol CSS tidak memiliki peringatan klik mewah. http://jsfiddle.net/bensontrent/ctgr6stm/
sumber
Agar tautan berfungsi tanpa merusak scrolling sentuh, saya menyelesaikannya dengan acara "tap" jQuery Mobile:
sumber
Saya terlambat, saya tahu tetapi ini adalah salah satu solusi termudah yang saya temukan:
Ini tidak hanya berfungsi untuk tautan (tag jangkar) tetapi untuk elemen lain juga. Semoga ini membantu.
sumber
Cuplikan singkat ini sepertinya berhasil. Picu peristiwa klik saat tautan diketuk:
sumber
Tidak ada dari jawaban lain yang berhasil untuk saya. Aplikasi saya memiliki banyak pendengar acara, kotak centang dan tautan sendiri yang memiliki pendengar dan tautan tanpa pendengar.
Saya menggunakan ini:
sumber
Ini bekerja untuk saya ketika Anda memiliki dropdown jquery ui
sumber
Hindari mengubah gaya "tampilan" di dalam acara hover css. Saya memiliki "display: block" dalam keadaan hover. Setelah menghapus ios, lanjutkan dengan satu ketukan. Ngomong-ngomong, tampaknya pembaruan iOS terbaru memperbaiki "fitur" ini
sumber
Cara termudah untuk menyelesaikan klik dua kali pada iPad adalah membungkus css Anda untuk efek hover di kueri media
@media (pointer: fine)
:CSS yang dibungkus dalam kueri media ini hanya akan diterapkan di desktop.
Penjelasan solusi ini ada di sini https://css-tricks.com/annoying-mobile-double-tap-link-issue/
sumber
Anda bisa memeriksanya
navigator.userAgent
seperti ini:tetapi Anda harus memeriksa blackberry, droid, sekian perangkat layar sentuh lainnya. Anda juga dapat mengikat gerakan mouse hanya jika userAgent berisi Mozilla, IE, Webkit, atau Opera, tetapi Anda masih perlu menyaring beberapa perangkat karena Droid, misalnya, melaporkan string userAgent-nya sebagai:
Tali iPhone serupa. Jika Anda hanya menyaring untuk iPhone, iPod, iPad, Android dan Blackberry, Anda mungkin mendapatkan mayoritas perangkat genggam, tetapi tidak semuanya.
sumber
Cukup buat kueri media CSS yang mengecualikan tablet dan perangkat seluler, lalu arahkan kursor ke sana. Anda tidak benar-benar membutuhkan jQuery atau JavaScript untuk ini.
Dan pastikan untuk menambahkan ini ke kepala html Anda untuk memastikan bahwa itu menghitung dengan piksel sebenarnya dan bukan resolusinya.
sumber