Sorunuzun ne olduğu tam olarak belli değil, ancak farenin üzerine gelme etkisini korurken sadece çift tıklamayı ortadan kaldırmak istiyorsanız, tavsiyem şudur:
- Üzerindeki etkileri hover ekleyin
touchstart
ve mouseenter
.
- Üzerindeki etkileri hover çıkarın
mouseleave
, touchmove
ve click
.
Arka fon
Bir fareyi simüle etmek için, Webkit mobile gibi tarayıcılar, bir kullanıcı dokunmatik ekrana (iPad gibi) dokunur ve parmağını bırakırsa aşağıdaki olayları ateşler (kaynak: html5rocks.com'da Touch And Mouse ):
touchstart
touchmove
touchend
- 300 ms gecikme, tarayıcının bunun çift dokunuş değil, tek dokunuş olduğundan emin olduğu
mouseover
mouseenter
- Not : Bir ederse
mouseover
, mouseenter
ya da mousemove
olay sayfası içeriği değişir, aşağıdaki olaylar ateş asla.
mousemove
mousedown
mouseup
click
Web tarayıcısına fare olaylarını atlamasını söylemek mümkün görünmüyor.
Daha da kötüsü, fareyle üzerine gelme olayı sayfa içeriğini değiştirirse, tıklama olayı, Safari Web İçerik Kılavuzu - Olayları İşleme , özellikle de Tek Parmakla Etkinliklerde şekil 6.4'te açıklandığı gibi asla tetiklenmez . Tam olarak bir "içerik değişikliğinin" ne olduğu, tarayıcıya ve sürüme bağlı olacaktır. İOS 7.0 için arka plan rengindeki bir değişikliğin bir içerik değişikliği olmadığını (veya artık olmadığını) buldum.
Çözüm Açıklaması
Özetlemek için:
- Üzerindeki etkileri hover ekleyin
touchstart
ve mouseenter
.
- Üzerindeki etkileri hover çıkarın
mouseleave
, touchmove
ve click
.
Üzerinde herhangi bir işlem olmadığını unutmayın touchend
!
Bu açıkça fare olayları için çalışır: mouseenter
ve mouseleave
(biraz sürümlerini geliştirilmiş mouseover
ve mouseout
tetiklenmez) ve ekleyip hover kaldırın.
Kullanıcı gerçekten bir click
bağlantı varsa, fareyle üzerine gelme efekti de kaldırılır. Bu, kullanıcı web tarayıcısında geri düğmesine basarsa kaldırılmasını sağlar.
Bu, dokunma olayları için de geçerlidir: üzerine touchstart
gelme efekti eklenir. '' 'Üzerinde kaldırılmamış' '' touchend
. Tekrar eklenir mouseenter
ve bu herhangi bir içerik değişikliğine neden olmadığından (zaten eklenmiştir), click
olay da tetiklenir ve kullanıcının tekrar tıklamasına gerek kalmadan bağlantı izlenir!
Bir tarayıcının bir touchstart
olay arasında geçirdiği 300 ms'lik gecikme ve click
bu kısa süre içinde fareyle üzerine gelme efekti gösterileceği için aslında iyi bir şekilde kullanılır.
Kullanıcı tıklamayı iptal etmeye karar verirse, parmağınızı hareket ettirmek bunu normal bir şekilde yapacaktır. Normalde, bu bir sorundur çünkü hiçbir mouseleave
olay tetiklenmez ve gezinme efekti yerinde kalır. Neyse ki, bu kolayca hover efekti kaldırarak sabitlenebilir touchmove
.
Bu kadar!
Örneğin FastClick kitaplığını kullanarak 300 ms'lik gecikmeyi kaldırmanın mümkün olduğunu , ancak bunun bu soru için kapsam dışında olduğunu unutmayın.
Alternatif çözümler
Aşağıdaki alternatiflerde aşağıdaki sorunları buldum:
- tarayıcı algılama: Hatalara son derece eğilimlidir. Bir aygıtta fare veya dokunma olduğu varsayılırken, dokunmatik ekranlar çoğaldıkça ikisinin bir kombinasyonu giderek daha yaygın hale gelecektir.
- CSS medya algılama: Bildiğim yalnızca CSS'ye yönelik çözüm. Hâlâ hatalara meyillidir ve her ikisinin de mümkün olmasına rağmen, bir aygıtta fare veya dokunma olduğunu varsayar.
- Tıklama olayını şurada taklit edin
touchend
: Bu, kullanıcı bağlantıyı gerçekten tıklama niyeti olmadan yalnızca kaydırmak veya yakınlaştırmak istese bile bağlantıyı hatalı şekilde izleyecektir.
- Fare olaylarını bastırmak için bir değişken kullanın: Bu
touchend
, o andaki durum değişikliklerini önlemek için sonraki fare olaylarında if-koşulu olarak kullanılan bir değişken ayarlayın . Değişken, tıklama etkinliğinde sıfırlanır. Dokunmatik arayüzler üzerinde gerçekten bir gezinme efekti istemiyorsanız, bu iyi bir çözümdür. Maalesef, touchend
başka bir nedenden dolayı tetiklenirse ve tıklama olayı tetiklenmediyse (örn. Kullanıcı kaydırılmış veya yakınlaştırılmışsa) ve daha sonra bağlantıyı bir fare ile izlemeye çalışıyorsa (yani hem fare hem de dokunmatik arayüze sahip bir cihazda) bu işe yaramaz. ).
Daha fazla okuma
Ayrıca bkz. İPad / iPhone çift tıklama sorunu ve mobil tarayıcılarda fareyle üzerine gelme efektlerini devre dışı bırak .