Nie jest do końca jasne, o co chodzi, ale jeśli chcesz po prostu wyeliminować podwójne kliknięcie, zachowując efekt najechania myszą, radzę:
- Dodaj efekty najechania na
touchstart
i mouseenter
.
- Usuń unosić skutki
mouseleave
, touchmove
i click
.
tło
Aby zasymulować mysz, przeglądarki, takie jak Webkit mobile, uruchamiają następujące zdarzenia, jeśli użytkownik dotknie i puści palec na ekranie dotykowym (takim jak iPad) (źródło: Touch And Mouse na html5rocks.com):
touchstart
touchmove
touchend
- 300 ms opóźnienia, gdy przeglądarka upewnia się, że jest to jedno dotknięcie, a nie podwójne dotknięcie
mouseover
mouseenter
- Uwaga : W przypadku
mouseover
, mouseenter
czy mousemove
zdarzenie zmienia zawartość strony, następujące zdarzenia nie są wypalane.
mousemove
mousedown
mouseup
click
Wydaje się, że nie jest możliwe po prostu nakazanie przeglądarce pominięcia zdarzeń myszy.
Co gorsza, jeśli zdarzenie najechania kursorem myszy zmieni zawartość strony, zdarzenie kliknięcia nigdy nie zostanie uruchomione, jak wyjaśniono w Przewodniku po treściach internetowych Safari - Obsługa zdarzeń , w szczególności na rysunku 6.4 w Zdarzeniach jednym palcem . Czym dokładnie jest „zmiana treści”, zależy od przeglądarki i wersji. Odkryłem, że w iOS 7.0 zmiana koloru tła nie jest (lub już nie?) Zmianą treści.
Wyjaśnienie rozwiązania
Przypomnę:
- Dodaj efekty najechania na
touchstart
i mouseenter
.
- Usuń unosić skutki
mouseleave
, touchmove
i click
.
Zauważ, że nie ma żadnej akcji touchend
!
To wyraźnie działa w przypadku zdarzeń myszy: mouseenter
i mouseleave
(nieco ulepszone wersje mouseover
imouseout
) są uruchamiane i dodają i usuwają dymek.
Jeśli użytkownik faktycznie click
linkiem, efekt najechania kursorem jest również usuwany. Zapewnia to, że zostanie usunięty, jeśli użytkownik naciśnie przycisk Wstecz w przeglądarce internetowej.
Działa to również w przypadku zdarzeń dotykowych: touchstart
dodawany jest efekt najechania kursorem. To jest '' 'nie' '' usunięte touchend
. Jest on ponownie dodawany mouseenter
, a ponieważ nie powoduje to żadnych zmian treści (zostało już dodane), click
zdarzenie jest również uruchamiane, a odsyłacz jest śledzony bez konieczności ponownego klikania przez użytkownika!
300 ms opóźnienia, które przeglądarka ma między touchstart
zdarzeniem i click
jest faktycznie dobrze wykorzystywane, ponieważ efekt najechania kursorem będzie wyświetlany w tym krótkim czasie.
Jeśli użytkownik zdecyduje się anulować kliknięcie, ruch palcem zrobi to normalnie. Zwykle jest to problem, ponieważ niemouseleave
zdarzenie jest uruchamiane, a efekt zawisu pozostaje na miejscu. Na szczęście można to łatwo naprawić, usuwając efekt najechania na touchmove
.
Otóż to!
Zwróć uwagę, że można usunąć opóźnienie 300 ms, na przykład za pomocą biblioteki FastClick , ale jest to poza zakresem tego pytania.
Alternatywne rozwiązania
Znalazłem następujące problemy z następującymi alternatywami:
- wykrywanie przeglądarki: wyjątkowo podatne na błędy. Zakłada się, że urządzenie ma mysz lub dotyk, podczas gdy kombinacja obu będzie coraz bardziej powszechna, gdy wyświetlacze dotykowe będą się rozprzestrzeniać.
- Wykrywanie mediów CSS: jedyne znane mi tylko rozwiązanie CSS. Wciąż podatny na błędy i nadal zakłada, że urządzenie ma mysz lub dotyk, podczas gdy oba są możliwe.
- Emuluj zdarzenie kliknięcia w
touchend
: Spowoduje to niepoprawne podążanie za linkiem, nawet jeśli użytkownik chciał tylko przewinąć lub powiększyć, bez zamiaru kliknięcia łącza.
- Użyj zmiennej, aby powstrzymać zdarzenia myszy: To ustawia zmienną w,
touchend
która jest używana jako warunek jeśli w kolejnych zdarzeniach myszy, aby zapobiec zmianom stanu w tym momencie. Zmienna jest resetowana w przypadku kliknięcia. To przyzwoite rozwiązanie, jeśli naprawdę nie chcesz efektu najechania na interfejsy dotykowe. Niestety, to nie działa, jeśli a touchend
jest uruchamiane z innego powodu i nie jest wywoływane żadne zdarzenie kliknięcia (np. Użytkownik przewinął lub powiększył), a następnie próbuje podążać za linkiem za pomocą myszy (tj. Na urządzeniu z myszą i interfejsem dotykowym ).
Dalsze czytanie
Zobacz także Problem podwójnego kliknięcia iPada / iPhone'a i Wyłącz efekty najechania kursorem w przeglądarkach mobilnych .