Sto cercando di far funzionare alcune delle mie librerie con dispositivi touch, ma sto facendo fatica a capire come sono supportate e come funzionano.
Fondamentalmente, ci sono 5 eventi touch , ma sembra che ci sia consenso tra i browser mobili solo sull'evento touchstart
(duh). Ho creato un violino come test case.
Ho provato questo sul mio Galaxy Note con Android 4 a bordo, ma puoi controllare il collegamento anche con un browser desktop.
L'obiettivo è cercare di capire come gestire i tocchi, i doppi tocchi e i tocchi lunghi. Nulla di bello.
Fondamentalmente, questo è ciò che accade:
Il browser stock Android non genera eventi touch. Cerca solo di emulare i clic del mouse con i tocchi, attivando mousedown
, mouseup
e click
consecutivamente, ma i doppi tocchi ingrandiscono e rimpiccioliscono la pagina.
Chrome per Android genera l'evento touchstart quando il dito tocca lo schermo. Se viene rilasciato abbastanza presto, si attiva quindi mousedown
, mouseup
, touchend
e infine click
eventi.
In caso di tocco lungo, dopo circa mezzo secondo spara mousedown
e mouseup
e touchend
quando si solleva il dito, con nessun evento click
alla fine.
Se muovi il dito, genera un evento touchmove
un paio di volte, quindi genera un evento touchcancel
e non succede nulla dopo, nemmeno un touchend
evento quando si solleva il dito.
A doppio tocco attiva le funzioni di ingrandimento/riduzione, ma per quanto riguarda gli eventi attiva la combinazione touchstart
-touchevent
due volte, senza eventi del mouse attivati.
Firefox per Android genera correttamente l'evento touchstart
e, in caso di tocco breve, viene attivato mousedown
, mouseup
, touchend
e click
in seguito.
In caso di tocco lungo, genera mousedown
, mouseup
e infine touchend
eventi. È lo stesso di Chrome per queste cose.
Ma se muovi il dito, se spara continuamente touchmove
(come ci si potrebbe aspettare) ma non fa no spara touchleave
evento quando il dito lascia l'elemento con il listener di eventi e non attiva l'evento touchcancel
quando il dito esce dalla finestra del browser.
Per doppi tocchi, si comporta proprio come Chrome.
Opera Mobile fa la stessa cosa di Chrome e Firefox per un tocco breve, ma in caso di pressione lunga attiva alcuni tipo di funzionalità di condivisione che voglio davvero disabilitare. Se muovi il dito o fai doppio tap, si comporta proprio come Firefox.
Chrome beta fa il solito per i tocchi brevi, ma in caso di tocchi lunghi non attiva più l'evento mouseup
, solo touchstart
, quindi mousedown
dopo mezzo secondo, quindi touchend
quando il dito viene sollevato. Quando si sposta il dito, ora si comporta come Firefox e Opera Mobile.
In caso di doppi tocchi, non genera eventi di tocco quando si esegue lo zoom indietro, ma solo quando si esegue lo zoom.
Chrome beta mostra il comportamento più strano, ma non posso davvero lamentarmi perché è una beta.
La domanda è : esiste un modo semplice e per provare a rilevare tocchi brevi, lunghi e doppi nei browser più comuni dei dispositivi touch?
Peccato che non riesco a testarlo su dispositivi iOS con Safari o IE per Windows Phone 7/Phone 8/RT, ma se alcuni di voi lo sapessero, il tuo feedback sarebbe molto apprezzato.
Se non lo hai già fatto, suggerirei di leggere il codice sorgente per Hammer.js
https://github.com/hammerjs/hammer.js/blob/master/hammer.js
Tra commenti e codice sono circa 1400 righe, c'è un'ottima documentazione e il codice è facile da capire.
Puoi vedere come l'autore ha scelto di risolvere molti degli eventi touch comuni:
tieni premuto, tocca, tasto doppio, trascina, trascina, trascina, trascina, trascina, trascina, trascina, dragright, scorri, scorri, scorri verso il basso, scorri, trascina, mirino, trasforma, avvia, trasforma, ruota, pizzica, pizzica, pizzica, tocca (inizia il rilevamento dei gesti) , rilascia (termina il rilevamento dei gesti)
Penso che dopo aver letto il codice sorgente avrai una comprensione molto migliore di come funzionano gli eventi tattili e come identificare quali eventi è in grado di gestire il browser.
C'è una risorsa davvero eccellente https://patrickhlauke.github.io/touch/tests/results/ che descrive in dettaglio l'ordine degli eventi attraverso un numero impressionante di browser. Sembra anche essere aggiornato regolarmente (a settembre 2016, è stato aggiornato l'ultima volta ad agosto 2016).
Il Gist è, essenzialmente tutto innesca mouseover
e gli eventi correlati; la maggior parte attiva anche eventi touch, che di solito completi (raggiungono touchend
) prima di mouseover
e poi continuano a click
(a meno che una modifica alla pagina il contenuto lo annulla). Queste eccezioni imbarazzanti sono fortunatamente relativamente rare (terze parti Android e playbook blackberry).
Quella risorsa collegata entra in un livello impressionante di dettagli, ecco un esempio dei primi tre di molti, molti test di sistema operativo, dispositivo e browser:
Per riassumere alcuni dei punti chiave:
mouseover
al primo tocco. Solo alcuni browser Windows Phone lo attivano al secondo tocco.click
. Non specifica quale annullare click
se mouseover
cambia pagina (credo che la maggior parte lo faccia)mouseover
dopo touchstart
e touchend
. Ciò include iOS7.1 Safari, stock Android, Chrome, Opera e Firefox per Android e alcuni (non tutti i browser per telefoni Windows)mouseover
aftertouchstart
e touchend
.mouseover
tra touchstart
e touchend
touchstart
o touchend
.touchstart
e touchend
seguite da mouseover
.touchstart
e touchend
.touchstart
e touchend
data la scarsità delle interfacce touchscreen del Mac.C'è anche un'incredibile quantità di dati sui browser combinati con tecnologie assistive.
Ecco la mia ultima osservazione sugli eventi touch e mouse su Android 4.3
Su Swipe (touchstart-touchmove-touchend):
Tocca (touchstart-touchend):
il browser predefinito Android presenta alcuni comportamenti non standard:
Sì, puoi avviare un timer su touchstart
e terminarlo su touchend
e fare le tue scelte da lì.
Inoltre puoi fare ... diciamo, scorri, il mio innesco touchmove
puoi ottenere i coordonati del "dito" e vedere quanto ho viaggiato prima che touchend
venga attivato.
Non so se ci sia un modo più semplice piuttosto che utilizzare una libreria di eventi touch, ma suppongo che potresti scriverne uno per semplici eventi "tap", "double tap", "swipe".