Estoy tratando de hacer que algunas de mis bibliotecas funcionen con dispositivos táctiles, pero me cuesta trabajo averiguar cómo son compatibles y cómo funcionan.
Básicamente, hay 5 eventos táctiles , pero parece que hay consenso entre los navegadores móviles solo sobre el touchstart
evento (duh). He creado un violín como caso de prueba.
Probé esto en mi Galaxy Note con Android 4 a bordo, pero también puede verificar el enlace con un navegador de escritorio.
El objetivo es tratar de descubrir cómo manejar los grifos, los dobles y largos. Nada sofisticado.
Básicamente, esto es lo que sucede:
El navegador de valores de Android no activa eventos táctiles. Simplemente trata de emular los clics del ratón con grifos, disparando mousedown
, mouseup
y click
eventos de forma consecutiva, pero los grifos dobles simplemente acercar y alejar tha página.
Chrome para Android dispara el evento de inicio táctil cuando el dedo toca la pantalla. Si es liberado muy pronto, se despide a continuación mousedown
, mouseup
, touchend
y finalmente click
eventos.
En caso de golpe largo , después de aproximadamente medio segundo se dispara mousedown
y mouseup
, touchend
cuando se levanta el dedo, sin ningún click
evento al final.
Si mueve el dedo , dispara un touchmove
evento un par de veces, luego dispara un touchcancel
evento y no pasa nada después, ni siquiera un touchend
evento al levantar el dedo.
Un doble toque activa las funciones de acercar / alejar, pero en cuanto a los eventos, activa el combo touchstart
, touchevent
dos veces, sin que se activen los eventos del mouse.
Firefox para Android dispara correctamente el touchstart
evento, y en caso de incendios de tomas cortas mousedown
, mouseup
, touchend
y click
después.
En caso de mucho toque , dispara mousedown
, mouseup
y finalmente touchend
eventos. Es lo mismo que Chrome para estas cosas.
Pero si mueve el dedo , se dispara touchmove
continuamente (como es de esperar) pero no dispara el touchleave
evento cuando el dedo deja el elemento con el detector de eventos, y no dispara el touchcancel
evento cuando el dedo sale de la ventana del navegador. .
Para toques dobles , se comporta como Chrome.
Opera Mobile hace lo mismo que Chrome y Firefox con un toque corto, pero en caso de una pulsación larga, activa algún tipo de función para compartir que realmente quiero desactivar. Si mueve el dedo o toca dos veces, se comporta como Firefox.
Chrome beta hace lo habitual para toques cortos, pero en caso de toques largos, ya no activa el mouseup
evento, solo touchstart
, luego de mousedown
medio segundo, luego touchend
cuando se levanta el dedo. Cuando se mueve el dedo, ahora se comporta como Firefox y Opera Mobile.
En caso de grifos dobles , que no se dispara eventos de toque cuando el zoom se aleja , pero sólo cuando se hace zoom en.
Chrome beta muestra el comportamiento más extraño, pero realmente no puedo quejarme ya que es una versión beta.
La pregunta es : ¿existe una forma simple y sencilla de intentar detectar toques cortos, toques largos y toques dobles en los navegadores más comunes de dispositivos táctiles?
Lástima que no pueda probarlo en dispositivos iOS con Safari, o IE para Windows Phone 7 / Phone 8 / RT, pero si algunos de ustedes pueden, sus comentarios serán muy apreciados.
fuente
Respuestas:
Si aún no lo ha hecho, le sugiero que lea el código fuente de Hammer.js
https://github.com/hammerjs/hammer.js/blob/master/hammer.js
Entre los comentarios y el código hay unas 1400 líneas, hay una gran documentación y el código es fácil de entender.
Puede ver cómo el autor ha decidido resolver muchos de los eventos táctiles comunes:
Creo que después de leer el código fuente, comprenderá mucho mejor cómo funcionan los eventos táctiles y cómo identificar qué eventos el navegador es capaz de manejar.
http://eightmedia.github.io/hammer.js/
fuente
Hay un recurso realmente excelente https://patrickhlauke.github.io/touch/tests/results/ que detalla el orden de los eventos en un número asombroso de navegadores. También parece actualizarse periódicamente (en septiembre de 2016, se actualizó por última vez en agosto de 2016).
La esencia es, esencialmente todo lo que desencadena
mouseover
y los eventos relacionados; la mayoría también desencadenan eventos táctiles, que generalmente se completan (alcanzantouchend
) antesmouseover
y luego continúanclick
(a menos que un cambio en el contenido de la página cancele esto). Esas raras excepciones son afortunadamente relativamente raras (navegadores de Android de terceros y libro de jugadas de Blackberry).Ese recurso vinculado entra en un nivel de detalle impresionante, aquí hay una muestra de las tres primeras de muchas, muchas pruebas de sistema operativo, dispositivo y navegador:
Para resumir algunos de los puntos clave:
Navegadores móviles
mouseover
con el primer toque. Solo algunos navegadores de Windows Phone lo activan con un segundo toque.click
. No especifica qué cancelarclick
simouseover
cambia la página (creo que la mayoría lo hace)mouseover
después detouchstart
ytouchend
. Esto incluye iOS7.1 Safari, Android estándar, Chrome, Opera y Firefox para Android, y algunos (no todos los navegadores de teléfonos con Windows)mouseover
despuéstouchstart
ytouchend
.mouseover
entretouchstart
ytouchend
touchstart
otouchend
.Navegadores de escritorio
touchstart
ytouchend
seguidas demouseover
.touchstart
ytouchend
.touchstart
ytouchend
dada la escasez de interfaces de pantalla táctil Mac.También hay una cantidad increíble de datos en los navegadores combinados con tecnologías de asistencia.
fuente
Sí, puede iniciar un temporizador en
touchstart
y finalizarlotouchend
y hacer sus elecciones desde allí.También puede hacer ... digamos deslizar, mi activación
touchmove
puede obtener las coordenadas del "dedo" y ver cuánto viajé antes de quetouchend
se active.No sé si hay alguna forma más simple en lugar de usar una biblioteca de eventos táctiles, pero supongo que podría escribir una para eventos simples de 'toque', 'doble toque', 'deslizar' con bastante facilidad.
fuente
touchleave
que nunca se dispara.e.target
(creo) en touchstart, ¿es igual al elemento en touchstart? Si no, entonces no es un grifo válido, es una trampa. No estoy diciendo que codificar una biblioteca sea fácil, pero no es realmente "difícil", la clasificaría como "media" + ¿qué es lo divertido si no es un desafío y nos hace regresar a stackoverflow? XDtouchstart
evento? ¿Qué sucede sitouchstart
mientras tanto se dispara un segundo evento (pantalla multitáctil)? ¿Cómo maneja los grifos largos? UsandosetTimeout
, pero ¿y si el dedo deja el elemento mientras tanto? ¿Cómo se detecta si no se disparan eventos táctiles? Y así sucesivamente ... Lo intentaré, por supuesto, pero esperaba encontrar un análisis profundo de los eventos táctiles.touchstart
antes de quetouchend
ocurra el primero . Además, pensar nuevamente en su respuesta lleva a la conclusión de que no ayudará, porque latarget
propiedad deltouchend
evento siempre es igual al elemento en el que comenzó el toque, ¡ incluso cuando el dedo se movió fuera del elemento!Aquí está mi última observación sobre eventos táctiles y de mouse en Android 4.3
Opera, Firefox y Chrome parecen tener un comportamiento estándar
Al deslizar (tocar inicio-tocar mover-tocar y):
Al tocar (toque inicio-toque final):
El navegador predeterminado de Android tiene algunos comportamientos no estándar :
fuente