Il n'est pas entièrement claire de ce que votre question est de savoir, mais si vous voulez juste pour éliminer le double-clic, tout en conservant l'effet hover pour la souris, mon conseil est de:
- Ajouter des effets de survol sur
touchstart
et mouseenter
.
- Supprimer les effets de survol sur
mouseleave
, touchmove
et click
.
Arrière-plan
Afin de simuler une souris, les navigateurs tels que Webkit mobile incendie, les événements suivants si un utilisateur touche et libère un doigt sur l'écran tactile (comme l'iPad) (source: Toucher Et de la Souris sur html5rocks.com):
touchstart
touchmove
touchend
- 300ms retard, d'où le navigateur assure que c'est un simple toucher, pas un double tap
mouseover
-
mouseenter
-
Remarque: Si un
mouseover
, mouseenter
ou mousemove
événement change le contenu de la page, les événements suivants sont jamais tiré.
mousemove
mousedown
mouseup
click
Il ne semble pas possible tout simplement de dire la webbrowser à ignorer les événements de souris.
Ce qui est pire, si un événement mouseover modifie le contenu de la page, cliquez sur l'événement n'est jamais tiré, comme expliqué sur le Web Safari Contenu du Guide de gestion des Événements, en particulier la figure 6.4 dans Un Doigt Événements. Ce qu'est exactement une "modifier le contenu" est, dépendra de navigateur et sa version. J'ai trouvé que pour iOS 7.0, un changement de couleur de fond n'est pas (ou plus?) une modification du contenu.
Solution Expliqué
Pour récapituler:
- Ajouter des effets de survol sur
touchstart
et mouseenter
.
- Supprimer les effets de survol sur
mouseleave
, touchmove
et click
.
Notez qu'il n'y a pas d'action sur touchend
!
Cela fonctionne bien pour les événements de la souris: mouseenter
et mouseleave
(légèrement versions améliorées de mouseover
et mouseout
) sont licenciés, et d'ajouter et de supprimer le hover.
Si l'utilisateur en fait click
s un lien, le hover effet est également supprimé. Ceci s'assurer qu'elle est supprimée si l'utilisateur appuie sur le bouton retour dans le navigateur web.
Cela fonctionne aussi pour les événements tactiles: sur touchstart
vol stationnaire effet est ajouté. Il est ""pas" " enlevé sur touchend
. Il est ajouté à nouveau sur mouseenter
, et puisque cela ne cause pas de changements de contenu (il a déjà été ajouté), l' click
événement est également déclenché, et le lien est suivi sans la nécessité pour l'utilisateur de cliquer à nouveau!
Les 300 ms délai d'un navigateur a entre un touchstart
événement et click
est effectivement mis en bon usage car le hover effet sera montré durant ce laps de temps.
Si l'utilisateur décide d'annuler le clic, déplacez le doigt ne suffit donc comme d'habitude. Normalement, c'est un problème car aucune mouseleave
événement est déclenché, et le hover effet reste en place. Heureusement, cela peut être facilement corrigé en supprimant l'effet hover sur touchmove
.
Ça y est!
Notez qu'il est possible de supprimer toutes les 300 ms délai, par exemple à l'aide de la FastClick de la bibliothèque, mais c'est hors de portée pour cette question.
Des Solutions Alternatives
J'ai constaté les problèmes suivants avec les options suivantes:
-
la détection du navigateur: Extrêmement sujettes à des erreurs. Suppose qu'un périphérique a la souris ou tactile, tandis qu'une combinaison des deux va devenir de plus en plus fréquente lorsque les écrans tactiles prolifirate.
-
CSS détection de médias: La seule CSS seule solution, je suis au courant. Encore sujette à des erreurs, et suppose encore que c'est un appareil tactile ou de souris, alors que les deux sont possibles.
-
Émuler l'événement click en
touchend
: Ce, à tort, suivez le lien, même si l'utilisateur ne voulait défiler ou de zoom, sans l'intention de les en cliquant sur le lien.
-
Utiliser une variable pour supprimer les événements de la souris: Ce set une variable en
touchend
qui est utilisé comme un si-condition dans la suite des événements de souris empêche les modifications de l'état à ce point dans le temps. La variable est réinitialisée dans l'événement click. C'est une solution décente si vous ne voulez vraiment pas un effet hover sur les interfaces tactiles. Malheureusement, cela ne fonctionne pas si un touchend
est déclenché pour une autre raison et non sur l'événement est déclenché (par exemple, l'utilisateur défilement ou zoom), et est par la suite essayer de suite le lien avec une souris (j'.e sur un appareil à la fois la souris et une interface tactile).
Lectures Complémentaires
Voir aussi iPad/iPhone double-cliquez problème et Désactiver les effets de survol sur les navigateurs mobiles.