Jak rozróżnić pojedyncze kliknięcia od podwójnych kliknięć tego samego elementu?
Jeśli nie trzeba ich mieszać, na której można polegać click
i dblclick
i każdy będzie wykonać zadanie dobrze.
Problem pojawia się, gdy próbuje je wymieszać: zdarzenie rzeczywiście wywołać zdarzenie jako dobrze , więc trzeba określić, czy jedno kliknięcie jest „stand-alone” jedno kliknięcie, lub część podwójnym kliknięciem.dblclick
click
Ponadto: nie powinieneś używać obu click
i dblclick
na jednym i tym samym elemencie :
Nie zaleca się wiązania programów obsługi zarówno ze zdarzeniami click, jak i dblclick dla tego samego elementu. Sekwencja wyzwalanych zdarzeń różni się w zależności od przeglądarki, przy czym niektóre otrzymują dwa zdarzenia kliknięcia przed dblclick, a inne tylko jedno. Czułość dwukrotnego kliknięcia (maksymalny czas między kliknięciami wykrywanymi jako podwójne kliknięcie) może się różnić w zależności od systemu operacyjnego i przeglądarki i często jest konfigurowalna przez użytkownika.
Źródło: https://api.jquery.com/dblclick/
A teraz dobra wiadomość:
Możesz użyć właściwości zdarzenia, detail
aby wykryć liczbę kliknięć związanych ze zdarzeniem. To sprawia, że podwójne kliknięcia wewnątrz są click
dość łatwe do wykrycia.
Pozostaje problem z wykrywaniem pojedynczych kliknięć i tym, czy są one częścią podwójnego kliknięcia. W tym celu wracamy do korzystania z timera i setTimeout
.
Pakując to wszystko razem, z użyciem atrybutu data (aby uniknąć zmiennej globalnej) i bez konieczności samodzielnego liczenia kliknięć, otrzymujemy:
HTML:
<div class="clickit" style="font-size: 200%; margin: 2em; padding: 0.25em; background: orange;">Double click me</div>
<div id="log" style="background: #efefef;"></div>
JavaScript:
<script>
var clickTimeoutID;
$( document ).ready(function() {
$( '.clickit' ).click( function( event ) {
if ( event.originalEvent.detail === 1 ) {
$( '#log' ).append( '(Event:) Single click event received.<br>' );
/** Is this a true single click or it it a single click that's part of a double click?
* The only way to find out is to wait it for either a specific amount of time or the `dblclick` event.
**/
clickTimeoutID = window.setTimeout(
function() {
$( '#log' ).append( 'USER BEHAVIOR: Single click detected.<br><br>' );
},
500 // how much time users have to perform the second click in a double click -- see accessibility note below.
);
} else if ( event.originalEvent.detail === 2 ) {
$( '#log' ).append( '(Event:) Double click event received.<br>' );
$( '#log' ).append( 'USER BEHAVIOR: Double click detected.<br>' );
window.clearTimeout( clickTimeoutID ); // it's a dblclick, so cancel the single click behavior.
} // triple, quadruple, etc. clicks are ignored.
});
});
</script>
Próbny:
JSfiddle
Uwagi dotyczące dostępności i szybkości podwójnego kliknięcia:
- Jak podaje Wikipedia „Maksymalne opóźnienie wymagane dla dwóch kolejnych kliknięć, aby zinterpretować je jako dwukrotne kliknięcie, nie jest znormalizowane”.
- Brak możliwości wykrycia szybkości dwukrotnego kliknięcia systemu w przeglądarce.
- Wydaje się, że wartość domyślna to 500 ms, a zakres 100-900 mm w systemie Windows ( źródło )
- Pomyśl o osobach niepełnosprawnych, które w ustawieniach swojego systemu operacyjnego ustawiły prędkość podwójnego kliknięcia na najniższą.
- Jeśli szybkość dwukrotnego kliknięcia w systemie jest mniejsza niż nasze domyślne 500 ms powyżej, uruchomione zostaną zachowania pojedynczego i podwójnego kliknięcia.
- Albo nie używaj polegać na połączonym pojedynczym i podwójnym kliknięciu tego samego przedmiotu.
- Lub: dodaj ustawienie w opcjach, aby mieć możliwość zwiększenia wartości.
Znalezienie satysfakcjonującego rozwiązania zajęło trochę czasu, mam nadzieję, że to pomoże!