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
touchstart
y mouseenter
.
- Eliminar los efectos de desplazamiento sobre
mouseleave
, touchmove
y 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
, mouseenter
o mousemove
acontecimiento 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
touchstart
y mouseenter
.
- Eliminar los efectos de desplazamiento sobre
mouseleave
, touchmove
y click
.
Tenga en cuenta que no hay acción en touchend
!
Esto claramente funciona para eventos de mouse: mouseenter
y mouseleave
(versiones ligeramente mejoradas de mouseover
y mouseout
) se disparan, y agregan y eliminan el cursor.
Si el usuario realmente tiene click
un 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 touchstart
el efecto de desplazamiento se agrega. Se '' 'no' '' se eliminó el touchend
. Se agrega nuevamente mouseenter
y, dado que esto no causa cambios en el contenido (ya se agregó), el click
evento 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 touchstart
evento y click
realmente 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 mouseleave
se 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
touchend
que 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 touchend
se 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 .