79 votes

Comprendre les événements tactiles

J'essaie de faire fonctionner certaines de mes bibliothèques avec des dispositifs tactiles, mais j'ai du mal à comprendre comment ils sont pris en charge et comment ils fonctionnent.

En gros, il y a 5 événements tactiles mais il semble qu'il n'y ait un consensus parmi les navigateurs mobiles que sur l'élément de base. touchstart événement (duh). J'ai créé un violon comme un cas de test.

Je l'ai testé sur mon Galaxy Note avec Android 4, mais vous pouvez aussi vérifier le lien avec un navigateur de bureau.

L'objectif est d'essayer de comprendre comment gérer les taps, les doubles taps et les longs taps. Rien d'extraordinaire.

En gros, voilà ce qui se passe :

El Navigateur Android stock ne déclenche pas d'événements de contact. Il essaie juste d'émuler les clics de souris avec des tapotements, en déclenchant mousedown , mouseup y click consécutivement, mais les doubles tapotements ne font que zoomer en avant et en arrière sur une page.

Chrome pour Android déclenche l'événement touchstart lorsque le doigt touche l'écran. S'il est libéré assez tôt, il déclenche alors mousedown , mouseup , touchend et enfin click événements.

En cas de long robinet après environ une demi-seconde, il se déclenche mousedown y mouseup y touchend quand le doigt est levé, sans click l'événement à la fin.

Si vous déplacez votre doigt il tire un touchmove quelques fois, puis il déclenche un événement touchcancel et rien ne se passe par la suite, pas même une touchend en levant le doigt.

A double tapotement déclenche les fonctions de zoom avant/arrière, mais sur le plan événementiel, il déclenche le combo touchstart - touchevent deux fois, sans qu'aucun événement de souris ne soit déclenché.

Firefox pour Android déclenche correctement la touchstart et en cas d'incendie de robinet court mousedown , mouseup , touchend y click après.

En cas de long robinet il tire mousedown , mouseup et enfin touchend événements. C'est la même chose avec Chrome pour ces choses-là.

Mais si vous déplacez votre doigt si les feux touchmove continuellement (comme on peut s'y attendre) mais elle ne no tirer le touchleave lorsque le doigt quitte l'élément avec l'écouteur d'événements, et ne déclenche pas l'événement touchcancel lorsque le doigt sort de la fenêtre du navigateur.

Para robinets doubles il se comporte exactement comme Chrome.

Opera Mobile fait la même chose que Chrome et Firefox pour un appui court, mais en cas d'appui long, il active une sorte de fonction de partage que je veux vraiment désactiver. Si vous déplacez votre doigt, ou si vous appuyez deux fois, il se comporte comme Firefox.

Chrome bêta fait ce qui est habituel pour les tapotements courts, mais dans le cas de tapotements longs, il ne déclenche pas l'option mouseup plus d'événement, juste touchstart alors mousedown après une demi-seconde, puis touchend quand le doigt est levé. Lorsque le doigt est déplacé, il se comporte maintenant comme Firefox et Opera Mobile.

En cas de robinets doubles il ne déclenche pas d'événements de contact lors d'un zoom arrière mais uniquement lors d'un zoom avant.

La version bêta de Chrome présente le comportement le plus étrange, mais je ne peux pas vraiment me plaindre puisqu'il s'agit d'une version bêta.

La question est Pour les navigateurs les plus courants des appareils tactiles, existe-t-il un moyen simple et efficace d'essayer de détecter les tapotements courts, les tapotements longs et les doubles tapotements ?

Dommage que je ne puisse pas le tester sur les appareils iOS avec Safari, ou IE pour Windows Phone 7/Phone 8/RT, mais si certains d'entre vous le peuvent, vos commentaires seraient très appréciés.

26voto

vrtis Points 126

Si vous ne l'avez pas encore fait, je vous suggère de lire le code source de Hammer.js.

https://github.com/hammerjs/hammer.js/blob/master/hammer.js

Entre les commentaires et le code, il y a environ 1400 lignes, la documentation est excellente et le code est facile à comprendre.

Vous pouvez voir comment l'auteur a choisi de résoudre un grand nombre d'événements tactiles courants :

maintenir, tapoter, double-tapoter, glisser, dragstart, dragend, dragup, dragdown, dragleft, dragright, swipe, swipeup, swipedown, swipeleft, swiperight, transformer, transformerdébut, transformerfin, tourner, pincer, pincer, pinchout, touch (début de la détection du geste), release (fin de la détection du geste), etc. fin)

Je pense qu'après avoir lu le code source, vous comprendrez beaucoup mieux comment fonctionnent les événements tactiles et comment identifier les événements que le navigateur est capable de gérer.

http://eightmedia.github.io/hammer.js/

11voto

Gianluca Guarini Points 176

Avez-vous essayé Tocca.js ? http://gianlucaguarini.github.io/Tocca.js/ Il permet d'activer tous les événements tactiles manquants sur n'importe quel type d'appareil et il ne fait qu'environ 1kb.

3voto

Semra Points 371

Voici ma dernière observation sur les événements liés au toucher et à la souris sur Android 4.3

Opera, Firefox, et Chrome semblent avoir un comportement standard

  1. Sur Swipe (touchstart-touchmove-touchend) :

    1. Aucun événement de souris (à l'exception du mouseover) ne se déclenche.
    2. Le passage de la souris ne se déclenche que si touchstart et touchend se produisent sur le même élément. (touchstart-touchmove-touchend-mouseover)
    3. Si le défaut est empêché au démarrage par contact : le comportement de balayage par défaut ne fonctionne pas. Aucun changement ne se produit concernant le déclenchement des événements de la souris.
  2. On Tap(touchstart-touchend) :

    1. Tous les événements souris (mouseover-mousemove-mousedown-mouseup-click) se déclenchent après un délai.
    2. Si le défaut est empêché au démarrage du toucher : seul le survol de la souris se déclenche.

Le navigateur par défaut d'Android a des comportements non standardisés :

  1. Le passage de la souris se déclenche avant le début du contact, ce qui signifie que le passage de la souris se déclenche toujours.
  2. Tous les événements de la souris se déclenchent au moment de la frappe, même si, par défaut, ils sont empêchés au moment du démarrage de la frappe.

2voto

Alexandru Calin Points 155

Oui, vous pouvez démarrer une minuterie à touchstart et le terminer sur touchend et faites vos choix à partir de là.

Vous pouvez aussi faire... disons glisser, mon déclenchement touchmove vous pouvez obtenir les coordonées du "doigt" et voir combien j'ai voyagé auparavant touchend se déclenche.

Je ne sais pas s'il existe un moyen plus simple que d'utiliser une bibliothèque d'événements tactiles, mais je suppose que vous pourriez en écrire une pour les simples événements " tap ", " double tap ", " swipe " assez facilement.

0voto

Barrett Points 301

Pourquoi ne pas utiliser jquery mobile. Ils ont bien compris tout ce qui concerne les événements. http://jquerymobile.com/demos/1.2.0/docs/api/events.html et pour le double tapotement http://forum.jquery.com/topic/doubletap-event

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X