Come distinguere tra clic singoli e doppi clic su uno stesso elemento?
Se non hai bisogno di mescolarli, puoi fare affidamento su click
edblclick
e ognuno farà il lavoro bene.
Quando si cerca di combinarli, sorge un problema: un dblclick
evento in realtà attiverà anche un click
evento , quindi è necessario determinare se un singolo clic è un singolo clic "autonomo" o parte di un doppio clic.
Inoltre: non dovresti usare entrambi click
e dblclick
sullo stesso elemento :
Non è consigliabile associare i gestori agli eventi click e dblclick per lo stesso elemento. La sequenza degli eventi attivati varia da browser a browser, alcuni ricevono due eventi di clic prima del doppio clic e altri solo uno. La sensibilità del doppio clic (il tempo massimo tra i clic rilevato come doppio clic) può variare in base al sistema operativo e al browser ed è spesso configurabile dall'utente.
Fonte: https://api.jquery.com/dblclick/
Ora passiamo alla buona notizia:
È possibile utilizzare la detail
proprietà dell'evento per rilevare il numero di clic relativi all'evento. Questo fa doppi clic all'interno diclick
abbastanza facili da rilevare.
Resta il problema di rilevare i singoli clic e se fanno o meno parte di un doppio clic. Per questo, torniamo a utilizzare un timer e setTimeout
.
Mettendo tutto insieme, con l'uso di un attributo di dati (per evitare una variabile globale) e senza la necessità di contare noi stessi i clic, otteniamo:
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
Note sull'accessibilità e sulla velocità del doppio clic:
- Come dice Wikipedia "Il ritardo massimo richiesto per due clic consecutivi per essere interpretati come un doppio clic non è standardizzato".
- Nessun modo per rilevare la velocità del doppio clic del sistema nel browser.
- Sembra che il valore predefinito sia 500 ms e l'intervallo 100-900 mm su Windows ( sorgente )
- Pensa alle persone con disabilità che impostano, nelle impostazioni del loro sistema operativo, la velocità del doppio clic al minimo.
- Se la velocità del doppio clic del sistema è inferiore a quella predefinita di 500 ms sopra, verranno attivati entrambi i comportamenti del clic singolo e doppio.
- O non utilizzare fare affidamento sul singolo e doppio clic combinato su uno stesso elemento.
- Oppure: aggiungi un'impostazione nelle opzioni per avere la possibilità di aumentare il valore.
Ci è voluto un po 'per trovare una soluzione soddisfacente, spero che questo aiuti!