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ć clicki dblclicki 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.dblclickclick
Ponadto: nie powinieneś używać obu clicki dblclickna 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, detailaby wykryć liczbę kliknięć związanych ze zdarzeniem. To sprawia, że podwójne kliknięcia wewnątrz są clickdość ł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!