¿Cómo puede detectar que un usuario deslizó su dedo en alguna dirección sobre una página web con JavaScript?
Me preguntaba si había una solución que funcionara para sitios web tanto en el iPhone como en un teléfono Android.
¿Cómo puede detectar que un usuario deslizó su dedo en alguna dirección sobre una página web con JavaScript?
Me preguntaba si había una solución que funcionara para sitios web tanto en el iPhone como en un teléfono Android.
Respuestas:
Ejemplo simple de código JS de vainilla:
Probado en Android.
fuente
touchstart
,touchmove
?Basado en la respuesta de @ givanse, así es como podría hacerlo con
classes
:Puedes usarlo así:
fuente
.bind
a indefinido porque enhandleTouchMove
realidad no devolvió nada. También es inútil llamar al enlace cuando se llama a la funciónthis.
porque ya está vinculado al contexto actual.bind(this);
y funcionó con gracia. gracias @nicholas_rtouches[0]
dechangedTouches[0]
y el tipo de controlador de eventoshandleTouchMove
ahandleTouchEnd
run()
dos veces y obtienes una pérdida de memoria desagradableCombiné algunas de las respuestas aquí en un script que usa CustomEvent para disparar eventos deslizados en el DOM. Agregue el script 0.7k swiped -events.min.js a su página y escuche los eventos swiped :
deslizado hacia la izquierda
deslizado hacia la derecha
arrebatado
deslizado hacia abajo
También puede adjuntar directamente a un elemento:
Configuración opcional
Se pueden especificar los siguientes atributos para modificar cómo funciona la interacción magnética en su página (estos son opcionales) .
El código fuente está disponible en Github
fuente
lo que he usado antes es que tiene que detectar el evento de mousedown, registrar su ubicación x, y (lo que sea relevante) luego detectar el evento de mouseup y restar los dos valores.
fuente
jQuery Mobile también incluye soporte de deslizamiento: http://api.jquerymobile.com/swipe/
Ejemplo
fuente
He encontrado que @givanse la respuesta brillante es la más confiable y compatible en múltiples navegadores móviles para registrar acciones de deslizamiento.
Sin embargo, hay un cambio en su código requerido para que funcione en los navegadores móviles modernos que están utilizando
jQuery
.event.touches
no existirá sijQuery
se usa y da como resultadoundefined
y debe reemplazarse porevent.originalEvent.touches
. SinjQuery
,event.touches
debería funcionar bien.Entonces la solución se convierte,
Probado en:
fuente
event.originalEvent
. La cosaevent.touches
ha dejado de existir ahora y da como resultadoundefined
.event.originalEvent
. Actualizaré mi respuesta. ¡Gracias! :)He reempaquetado
TouchWipe
como un breve complemento de jquery:detectSwipe
fuente
Algún mod de respuesta superior (no puedo comentar ...) para lidiar con golpes cortos
fuente
trashold, timeipe swipe, swipeBlockElems add.
fuente
Si alguien está tratando de usar jQuery Mobile en Android y tiene problemas con la detección de deslizamiento JQM
(Tenía algunos en Xperia Z1, Galaxy S3, Nexus 4 y algunos teléfonos Wiko también) esto puede ser útil:
El deslizamiento en Android no se detectó a menos que fuera un deslizamiento muy largo, preciso y rápido.
Con estas dos líneas funciona correctamente.
fuente
$.event.special.swipe.scrollSupressionThreshold = 8;
pero me pusiste en la dirección correcta! ¡Gracias!Tuve problemas con el controlador táctil disparando continuamente mientras el usuario arrastraba un dedo. No sé si eso se debe a algo que estoy haciendo mal o no, pero volví a cablear esto para acumular movimientos con touchmove y touchchend en realidad dispara la devolución de llamada.
También necesitaba tener una gran cantidad de estas instancias, así que agregué métodos de habilitación / deshabilitación.
Y un umbral donde un golpe corto no se dispara. Touchstart cero son los contadores cada vez.
Puede cambiar el target_node sobre la marcha. Habilitar en la creación es opcional.
fuente
También fusioné algunas de las respuestas, principalmente la primera y la segunda con las clases, y aquí está mi versión:
Luego puede usarlo de la siguiente manera:
Ayuda a evitar errores de consola cuando desea llamar solo digamos el método "onLeft".
fuente
Usó dos:
jQuery mobile: funciona en la mayoría de los casos y especialmente cuando está desarrollando una aplicación que usa otro complemento jQuery, y es mejor usar controles móviles jQuery para esto. Visítelo aquí: https://www.w3schools.com/jquerymobile/jquerymobile_events_touch.asp
Hora del martillo ! Una de las mejores, ligera y rápida biblioteca basada en JavaScript. Visítelo aquí: https://hammerjs.github.io/
fuente
Si solo necesita deslizar, es mejor usar el tamaño que necesita. Esto debería funcionar en cualquier dispositivo táctil.
Esto es ~ 450 bytes 'después de la compresión gzip, minificación, babel, etc.
Escribí la clase a continuación en base a las otras respuestas, usa porcentaje movido en lugar de píxeles, y un patrón de despachador de eventos para enganchar / desenganchar cosas.
Úselo así:
fuente
Solo quería detectar el deslizamiento hacia la izquierda y la derecha, pero activar la acción solo cuando finaliza el evento táctil , por lo que modifiqué ligeramente la gran respuesta de @ givanse para hacerlo.
¿Por qué hacer eso? Si, por ejemplo, al deslizar, el usuario se da cuenta de que finalmente no quiere deslizar, puede mover el dedo en la posición original (una aplicación de teléfono "de citas" muy popular hace esto;)), y luego "deslizar hacia la derecha" El evento se cancela.
Entonces, para evitar un evento de "deslizar hacia la derecha" solo porque hay una diferencia de 3px horizontalmente, agregué un umbral por debajo del cual se descarta un evento: para tener un evento de "deslizar hacia la derecha", el usuario debe deslizar al menos 1/3 del ancho del navegador (por supuesto, puede modificar esto).
Todos estos pequeños detalles mejoran la experiencia del usuario. Aquí está el código (Vanilla JS):
fuente
Ejemplo simple de vanilla JS para deslizar horizontalmente:
Puede usar la misma lógica para deslizar verticalmente.
fuente
Agregando a esta respuesta aquí . Este agrega soporte para eventos de mouse para probar en el escritorio:
fuente
I reelaborado @givanse solución 's de funcionar como un Reaccionar gancho. La entrada es algunos oyentes de eventos opcionales, la salida es una referencia funcional (debe ser funcional para que el gancho pueda volver a ejecutarse cuando / si la referencia cambia).
También se agrega en el parámetro de umbral de deslizamiento vertical / horizontal, para que pequeños movimientos no activen accidentalmente a los oyentes del evento, pero estos se pueden establecer en 0 para imitar la respuesta original más de cerca.
Consejo: para obtener el mejor rendimiento, las funciones de entrada del oyente de eventos deben ser memorizadas.
fuente
Un ejemplo de cómo usar con desplazamiento.
fuente
Puede que le resulte más fácil implementarlo primero con los eventos del mouse para crear un prototipo.
Aquí hay muchas respuestas, incluida la parte superior, debe usarse con precaución, ya que no consideran los casos límite, especialmente alrededor de los cuadros delimitadores.
Ver:
Deberá experimentar para detectar casos y comportamientos extremos, como el puntero que se mueve fuera del elemento antes de finalizar.
Un deslizamiento es un gesto muy básico que es un nivel más alto de procesamiento de interacción con el puntero de la interfaz, aproximadamente entre el procesamiento de eventos sin procesar y el reconocimiento de escritura a mano.
No existe un método exacto único para detectar un deslizamiento o un lanzamiento, aunque prácticamente todos generalmente siguen un principio básico de detectar un movimiento a través de un elemento con un umbral de distancia y velocidad o velocidad. Simplemente puede decir que si hay un movimiento en el 65% del tamaño de la pantalla en una dirección determinada dentro de un tiempo determinado, entonces es un deslizamiento. Exactamente dónde dibuja la línea y cómo la calcula depende de usted.
Algunos también pueden mirarlo desde la perspectiva del impulso en una dirección y qué tan lejos de la pantalla ha sido empujado cuando se suelta el elemento. Esto es más claro con deslizamientos adhesivos donde el elemento puede arrastrarse y luego al soltarse rebotará o saldrá volando de la pantalla como si el elástico se rompiera.
Probablemente sea ideal tratar de encontrar una biblioteca de gestos que pueda portar o reutilizar y que se use comúnmente para mantener la coherencia. Muchos de los ejemplos aquí son excesivamente simplistas, registrando un deslizamiento como el toque más leve en cualquier dirección.
Android sería la opción obvia, aunque tiene el problema opuesto, es demasiado complejo.
Muchas personas parecen haber malinterpretado la pregunta como cualquier movimiento en una dirección. Un deslizamiento es un movimiento amplio y relativamente breve abrumadoramente en una sola dirección (aunque puede ser arqueado y tener ciertas propiedades de aceleración). Un lanzamiento es similar, aunque tiene la intención de impulsar casualmente un elemento a una distancia considerable bajo su propio impulso.
Los dos son lo suficientemente similares como para que algunas bibliotecas solo proporcionen lanzamiento o deslizamiento, que se pueden usar indistintamente. En una pantalla plana, es difícil separar realmente los dos gestos y, en general, las personas están haciendo ambas cosas (deslizando la pantalla física pero arrojando el elemento UI que se muestra en la pantalla).
Tu mejor opción es no hacerlo tú mismo. Ya hay una gran cantidad de bibliotecas JavaScript para detectar gestos simples .
fuente