No está del todo claro cuál es su pregunta, pero si solo desea eliminar el doble clic, mientras mantiene el efecto de desplazamiento del mouse, mi consejo es:
- Añadir efectos de desplazamiento sobre
touchstarty mouseenter.
- Eliminar los efectos de desplazamiento sobre
mouseleave, touchmovey click.
Antecedentes
Para simular un mouse, los navegadores como Webkit mobile activan los siguientes eventos si un usuario toca y suelta un dedo en la pantalla táctil (como iPad) (fuente: Touch And Mouse en html5rocks.com):
touchstart
touchmove
touchend
- 300 ms de retraso, donde el navegador se asegura de que esto sea un solo toque, no un doble toque
mouseover
mouseenter
- Nota : Si una
mouseover, mouseentero mousemoveacontecimiento cambia el contenido de la página, los siguientes eventos no son despedidos.
mousemove
mousedown
mouseup
click
No parece posible decirle simplemente al navegador web que omita los eventos del mouse.
Lo que es peor, si un evento de mouseover cambia el contenido de la página, el evento de clic nunca se activa, como se explica en la Guía de contenido web de Safari - Manejo de eventos , en particular la figura 6.4 en Eventos de un dedo . Lo que es exactamente un "cambio de contenido" dependerá del navegador y la versión. Descubrí que para iOS 7.0, un cambio en el color de fondo no es (¿o ya no?) Un cambio de contenido.
Solución explicada
Recordar:
- Añadir efectos de desplazamiento sobre
touchstarty mouseenter.
- Eliminar los efectos de desplazamiento sobre
mouseleave, touchmovey click.
Tenga en cuenta que no hay acción en touchend!
Esto claramente funciona para eventos de mouse: mouseentery mouseleave(versiones ligeramente mejoradas de mouseovery mouseout) se disparan, y agregan y eliminan el cursor.
Si el usuario realmente tiene clickun enlace, el efecto de desplazamiento también se elimina. Esto garantiza que se elimine si el usuario presiona el botón Atrás en el navegador web.
Esto también funciona para eventos táctiles: en touchstartel efecto de desplazamiento se agrega. Se '' 'no' '' se eliminó el touchend. Se agrega nuevamente mouseentery, dado que esto no causa cambios en el contenido (ya se agregó), el clickevento también se activa y se sigue el enlace sin necesidad de que el usuario haga clic nuevamente.
El retraso de 300 ms que tiene un navegador entre un touchstartevento y clickrealmente se usa bien porque el efecto de desplazamiento se mostrará durante este corto tiempo.
Si el usuario decide cancelar el clic, un movimiento del dedo lo hará de la forma habitual. Normalmente, esto es un problema ya que no mouseleavese dispara ningún evento y el efecto de desplazamiento permanece en su lugar. Afortunadamente, esto se puede solucionar fácilmente eliminando el efecto de desplazamiento touchmove.
¡Eso es!
Tenga en cuenta que es posible eliminar el retraso de 300 ms , por ejemplo, utilizando la biblioteca FastClick , pero esto está fuera del alcance de esta pregunta.
Soluciones alternativas
He encontrado los siguientes problemas con las siguientes alternativas:
- detección del navegador: extremadamente propenso a errores. Asume que un dispositivo tiene mouse o touch, mientras que una combinación de ambos se volverá cada vez más común cuando touch muestre prolifirate.
- Detección de medios CSS: la única solución solo CSS que conozco. Aún propenso a errores, y aún asume que un dispositivo tiene mouse o touch, mientras que ambos son posibles.
- Emule el evento de clic en
touchend: Esto seguirá incorrectamente el enlace, incluso si el usuario solo desea desplazarse o hacer zoom, sin la intención de hacer clic en el enlace.
- Use una variable para suprimir los eventos del mouse: esto establece una variable
touchendque se usa como condición if en eventos posteriores del mouse para evitar cambios de estado en ese momento. La variable se restablece en el evento click. Esta es una solución decente si realmente no desea un efecto de desplazamiento en las interfaces táctiles. Desafortunadamente, esto no funciona si touchendse dispara a por otra razón y no se dispara ningún evento de clic (por ejemplo, el usuario se desplaza o hace zoom), y posteriormente intenta seguir el enlace con un mouse (es decir, en un dispositivo con mouse e interfaz táctil) )
Otras lecturas
Consulte también el problema de doble clic del iPad / iPhone y Desactivar los efectos de desplazamiento en los navegadores móviles .