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
touchstarte mouseenter.
- Rimuovere hover effetti su
mouseleave, touchmovee 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, mouseentero mousemoveevento 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
touchstarte mouseenter.
- Rimuovere hover effetti su
mouseleave, touchmovee click.
Nota che non c'è azione touchend!
Questo funziona chiaramente per gli eventi del mouse: mouseentere mouseleave(versioni leggermente migliorate di mouseovere mouseout) vengono attivate e aggiungono e rimuovono il passaggio del mouse.
Se l'utente in realtà è clickun 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: touchstartviene aggiunto l'effetto hover. È '' 'non' '' rimosso touchend. Viene nuovamente aggiunto mouseentere, poiché ciò non provoca modifiche al contenuto (era già stato aggiunto), clickviene 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 touchstartevento e clickviene 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 mouseleaveevento 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
touchendche 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 touchendviene 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 .