Como diferenciar entre cliques únicos e cliques duplos em um mesmo elemento?
Se você não precisa misturá-los, você pode confiar em click
e dblclick
e cada um fará o trabalho perfeitamente.
Surge um problema ao tentar misturá-los: um dblclick
evento irá, na verdade, disparar um click
evento também , então você precisa determinar se um único clique é um clique único "independente" ou parte de um clique duplo.
Além disso: você não deve usar ambos click
e dblclick
em um e o mesmo elemento :
Não é aconselhável vincular os manipuladores aos eventos click e dblclick para o mesmo elemento. A sequência de eventos disparados varia de navegador para navegador, alguns recebendo dois eventos de clique antes do dblclick e outros apenas um. A sensibilidade do clique duplo (tempo máximo entre os cliques detectado como um clique duplo) pode variar de acordo com o sistema operacional e o navegador, e geralmente é configurável pelo usuário.
Fonte: https://api.jquery.com/dblclick/
Agora vamos às boas notícias:
Você pode usar a detail
propriedade do evento para detectar o número de cliques relacionados ao evento. Isso torna os cliques duplos dentro do click
razoavelmente fáceis de detectar.
O problema continua em detectar cliques únicos e se eles fazem parte de um clique duplo ou não. Para isso, voltamos a usar um cronômetro e setTimeout
.
Empacotando tudo junto, com o uso de um atributo de dados (para evitar uma variável global) e sem a necessidade de contarmos nós mesmos, obtemos:
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>
Demo:
JSfiddle
Observações sobre acessibilidade e velocidades de clique duplo:
- Como afirma a Wikipedia, "O atraso máximo necessário para que dois cliques consecutivos sejam interpretados como um clique duplo não é padronizado."
- Nenhuma maneira de detectar a velocidade de clique duplo do sistema no navegador.
- Parece que o padrão é 500 ms e o intervalo de 100-900mms no Windows ( fonte )
- Pense nas pessoas com deficiência que definem, nas configurações do sistema operacional, a velocidade do clique duplo para a mais lenta.
- Se a velocidade de clique duplo do sistema for mais lenta do que nosso padrão 500 ms acima, os comportamentos de clique único e duplo serão acionados.
- Não use depender de cliques simples e duplos combinados em um mesmo item.
- Ou: adicione uma configuração nas opções para poder aumentar o valor.
Demorou um pouco para encontrar uma solução satisfatória, espero que isso ajude!