¿Cómo diferenciar entre clics simples y clics dobles en un mismo elemento?
Si no es necesario mezclarlos, se puede confiar en click
y dblclick
y cada uno va a hacer el trabajo muy bien.
Surge un problema al intentar mezclarlos: un dblclick
evento también activará un click
evento , por lo que debe determinar si un solo clic es un solo clic "independiente" o parte de un doble clic.
Además: no debe usar ambos click
y dblclick
en el mismo elemento :
No es aconsejable vincular controladores a los eventos click y dblclick para el mismo elemento. La secuencia de eventos desencadenados varía de un navegador a otro, algunos reciben dos eventos de clic antes del dblclick y otros solo uno. La sensibilidad del doble clic (tiempo máximo entre los clics que se detecta como un doble clic) puede variar según el sistema operativo y el navegador, y a menudo es configurable por el usuario.
Fuente: https://api.jquery.com/dblclick/
Ahora pasemos a las buenas noticias:
Puede utilizar la detail
propiedad del evento para detectar la cantidad de clics relacionados con el evento. Esto hace que los clics dobles en el interior sean click
bastante fáciles de detectar.
El problema sigue siendo la detección de clics individuales y si forman parte de un doble clic o no. Para eso, volvemos a usar un temporizador y setTimeout
.
Envolviendo todo junto, con el uso de un atributo de datos (para evitar una variable global) y sin la necesidad de contar los clics nosotros mismos, obtenemos:
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>
Manifestación:
JSfiddle
Notas sobre accesibilidad y velocidades de doble clic:
- Como dice Wikipedia, "el retraso máximo requerido para que dos clics consecutivos se interpreten como un doble clic no está estandarizado".
- No hay forma de detectar la velocidad de doble clic del sistema en el navegador.
- Parece que el valor predeterminado es 500 ms y el rango 100-900 mms en Windows ( fuente )
- Piense en las personas con discapacidades que establecen, en la configuración de su sistema operativo, la velocidad de doble clic a su nivel más lento.
- Si la velocidad de doble clic del sistema es más lenta que los 500 ms anteriores predeterminados, se activarán los comportamientos de clic único y doble.
- O no utilice la función de hacer clic combinado simple y doble en un mismo elemento.
- O: agregue una configuración en las opciones para tener la capacidad de aumentar el valor.
Me tomó un tiempo encontrar una solución satisfactoria, ¡espero que esto ayude!