Non è del tutto chiaro quale sia la tua domanda, ma se vuoi semplicemente eliminare il doppio clic, pur mantenendo l'effetto hover per il mouse, il mio consiglio è di:
- Aggiungi effetti hover su
touchstart
e mouseenter
.
- Rimuovere hover effetti su
mouseleave
, touchmove
e click
.
sfondo
Per simulare un mouse, browser come Webkit mobile generano i seguenti eventi se un utente tocca e rilascia un dito sul touchscreen (come iPad) (fonte: Touch And Mouse su html5rocks.com):
touchstart
touchmove
touchend
- Ritardo di 300 ms, in cui il browser si assicura che si tratti di un singolo tocco, non di un doppio tocco
mouseover
mouseenter
- Nota : se una
mouseover
, mouseenter
o mousemove
evento cambia il contenuto della pagina, i seguenti eventi vengono mai sparato.
mousemove
mousedown
mouseup
click
Non sembra possibile semplicemente dire al browser web di saltare gli eventi del mouse.
Quel che è peggio, se un evento di passaggio del mouse modifica il contenuto della pagina, l'evento di clic non viene mai generato, come spiegato nella Guida al contenuto Web di Safari - Gestione degli eventi , in particolare la figura 6.4 in Eventi con un dito . Che cosa sia esattamente una "modifica del contenuto", dipenderà dal browser e dalla versione. Ho scoperto che per iOS 7.0, un cambiamento nel colore di sfondo non è (o non più?) Un cambiamento di contenuto.
Spiegazione della soluzione
Per ricapitolare:
- Aggiungi effetti hover su
touchstart
e mouseenter
.
- Rimuovere hover effetti su
mouseleave
, touchmove
e click
.
Nota che non c'è azione touchend
!
Questo funziona chiaramente per gli eventi del mouse: mouseenter
e mouseleave
(versioni leggermente migliorate di mouseover
e mouseout
) vengono attivate e aggiungono e rimuovono il passaggio del mouse.
Se l'utente in realtà è click
un collegamento, anche l'effetto hover viene rimosso. Ciò garantisce che venga rimosso se l'utente preme il pulsante Indietro nel browser Web.
Questo funziona anche per eventi touch: touchstart
viene aggiunto l'effetto hover. È '' 'non' '' rimosso touchend
. Viene nuovamente aggiunto mouseenter
e, poiché ciò non provoca modifiche al contenuto (era già stato aggiunto), click
viene anche generato l' evento e il collegamento viene seguito senza che l'utente debba fare nuovamente clic!
Il ritardo di 300 ms che un browser ha tra un touchstart
evento e click
viene effettivamente utilizzato perché l'effetto hover verrà mostrato in questo breve periodo.
Se l'utente decide di annullare il clic, una mossa del dito lo farà normalmente. Normalmente, questo è un problema poiché nessun mouseleave
evento viene generato e l'effetto hover rimane attivo. Per fortuna, questo può essere facilmente risolto rimuovendo l'effetto hover su touchmove
.
Questo è tutto!
Si noti che è possibile rimuovere il ritardo di 300 ms, ad esempio utilizzando la libreria FastClick , ma questo non rientra nell'ambito di questa domanda.
Soluzioni alternative
Ho riscontrato i seguenti problemi con le seguenti alternative:
- rilevamento del browser: estremamente soggetto a errori. Presuppone che un dispositivo abbia il mouse o il tocco, mentre una combinazione di entrambi diventerà sempre più comune quando i display tattili proliferano.
- Rilevamento di supporti CSS: l'unica soluzione solo CSS di cui sono a conoscenza. È ancora soggetto a errori e presume che un dispositivo abbia il mouse o il tocco, mentre entrambi sono possibili.
- Emula l'evento click in
touchend
: Questo seguirà erroneamente il link, anche se l'utente volesse solo scorrere o ingrandire, senza l'intenzione di fare effettivamente clic sul link.
- Usa una variabile per sopprimere gli eventi del mouse: imposta una variabile
touchend
che viene utilizzata come una condizione if negli eventi successivi del mouse per impedire cambiamenti di stato in quel momento. La variabile viene ripristinata nell'evento click. Questa è una soluzione decente se davvero non vuoi un effetto hover sulle interfacce touch. Sfortunatamente, questo non funziona se un touchend
viene attivato per un altro motivo e nessun evento di clic viene generato (ad esempio l'utente ha fatto scorrere o ingrandito), e successivamente sta cercando di seguire il collegamento con un mouse (cioè su un dispositivo con mouse e interfaccia touch ).
Ulteriori letture
Vedi anche il problema del doppio clic di iPad / iPhone e disabilita gli effetti hover sui browser mobili .