Entendendo eventos de toque
Estou tentando fazer com que algumas das minhas bibliotecas funcionem com dispositivos de toque, mas estou tendo dificuldades para descobrir como elas são suportadas e como funcionam.
Basicamente, existem5 eventos de toque, mas parece que há consenso entre os navegadores móveis apenas notouchstart
evento (duh). Eu criei umviolino como um caso de teste.
Eu testei isso no meu Galaxy Note com Android 4 a bordo, mas você pode verificar o link com um navegador de desktop também.
O objetivo é tentar descobrir como lidar com torneiras, torneiras duplas e torneiras longas. Nada chique.
Basicamente, isso é o que acontece:
oNavegador de ações Android não dispara eventos de toque. Ele apenas tenta emular cliques do mouse com toques, disparandomousedown
, mouseup
eclick
eventos consecutivamente, mas os toques duplos aumentam e diminuem a página.
cromada para Android aciona o evento touchstart quando o dedo toca na tela. Se for liberado em breve, ele disparamousedown
, mouseup
, touchend
e finalmenteclick
eventos.
No caso detoque longo, depois de meio segundo, ele disparamousedown
emouseup
etouchend
quando o dedo é levantado, semclick
evento no final.
Se vocêsmova seu dedo, dispara umtouchmove
evento um par de vezes, então ele dispara umtouchcancel
evento, e nada acontece depois, nem mesmo umtouchend
evento ao levantar o dedo.
A toque duplo aciona os recursos de zoom in / out, mas o evento dispara o combotouchstart
-touchevent
duas vezes, sem eventos de mouse disparados.
Raposa de fogo para Android corretamente dispara otouchstart
evento, e em caso de toques curtosmousedown
, mouseup
, touchend
eclick
depois.
No caso detoque longo, ele atiramousedown
, mouseup
e finalmentetouchend
eventos. É o mesmo do Chrome para essas coisas.
Mas se vocêmova seu dedo, se fogotouchmove
continuamente (como se pode esperar), mas nãonão disparar otouchleave
evento quando o dedo deixa o elemento com o ouvinte de evento e não disparatouchcancel
evento quando o dedo sai da janela de visualização do navegador.
Paratorneiras duplas, se comporta como o Chrome.
Opera Mobile faz o mesmo do Chrome e do Firefox para um toque curto, mas em caso de pressionamento longo ativa algum tipo de recurso de compartilhamento que eu realmente quero desabilitar. Se você mover seu dedo ou tocar duas vezes, ele se comportará como o Firefox.
Beta do Chrome faz o habitual para torneiras curtas, mas no caso de torneiras longas não disparamouseup
mais, apenastouchstart
, entãomousedown
depois de meio segundo, entãotouchend
quando o dedo é levantado. Quando o dedo é movido, agora ele se comporta como o Firefox e o Opera Mobile.
No caso detorneiras duplas, não dispara eventos de toqueao diminuir o zoom, mas apenas ao aumentar o zoom.
O Chrome beta mostra o comportamento mais estranho, mas não posso reclamar, pois é uma versão beta.
A questão é: existe uma maneira simples de tentar detectar toques curtos, toques longos e toques duplos nos navegadores mais comuns de dispositivos de toque?
Pena que não posso testá-lo em dispositivos iOS com Safari, ou IE para Windows Phone 7 / Phone 8 / RT, mas se algum de vocês puder, seu feedback será muito apreciado.