Es ist nicht ganz klar, was Ihre Frage ist, aber wenn Sie nur den Doppelklick beseitigen wollen, während der Hover-Effekt für die Maus beibehalten wird, ist mein Rat zu:
- Hover-Effekte hinzufügen auf
touchstart
y mouseenter
.
- Hover-Effekte entfernen bei
mouseleave
, touchmove
y click
.
Hintergrund
Um eine Maus zu simulieren, lösen Browser wie Webkit mobile die folgenden Ereignisse aus, wenn ein Benutzer einen Finger auf einem Touchscreen (wie dem iPad) berührt und loslässt (Quelle: Berührung und Maus auf html5rocks.com):
touchstart
touchmove
touchend
- 300 ms Verzögerung, wobei der Browser sicherstellt, dass es sich um einen einzelnen Tap und nicht um einen Doppeltap handelt
mouseover
mouseenter
- Hinweis : Wenn ein
mouseover
, mouseenter
o mousemove
Ereignis den Seiteninhalt ändert, werden die folgenden Ereignisse nie ausgelöst.
mousemove
mousedown
mouseup
click
Es scheint nicht möglich zu sein, dem Webbrowser einfach zu sagen, dass er die Mausereignisse überspringen soll.
Was noch schlimmer ist: Wenn ein Mouseover-Ereignis den Seiteninhalt ändert, wird das Click-Ereignis nie ausgelöst, wie auf Safari Web Content Guide - Handhabung von Ereignissen insbesondere die Abbildung 6.4 in Ein-Finger-Ereignisse . Was genau eine "Inhaltsänderung" ist, hängt vom Browser und der Version ab. Ich habe festgestellt, dass unter iOS 7.0 eine Änderung der Hintergrundfarbe keine Inhaltsänderung ist (oder nicht mehr?).
Die Lösung wird erklärt
Um es kurz zu machen:
- Hover-Effekte hinzufügen auf
touchstart
y mouseenter
.
- Hover-Effekte entfernen bei
mouseleave
, touchmove
y click
.
Beachten Sie, dass es keine Aktion auf touchend
!
Dies funktioniert eindeutig für Mausereignisse: mouseenter
y mouseleave
(leicht verbesserte Versionen von mouseover
y mouseout
) ausgelöst werden, und den Schwebezustand hinzufügen und entfernen.
Wenn der Benutzer tatsächlich click
s einen Link, wird auch der Hover-Effekt entfernt. Dadurch wird sichergestellt, dass er entfernt wird, wenn der Benutzer im Webbrowser auf die Schaltfläche "Zurück" drückt.
Dies funktioniert auch bei Berührungsereignissen: bei touchstart
wird der Schwebeeffekt hinzugefügt. Er wird '''nicht''' entfernt bei touchend
. Es wird wieder hinzugefügt am mouseenter
und da dies keine inhaltlichen Änderungen bewirkt (es wurde bereits hinzugefügt), wird die click
wird ebenfalls ausgelöst, und der Link wird weiterverfolgt, ohne dass der Benutzer erneut klicken muss!
Die 300 ms Verzögerung, die ein Browser zwischen einer touchstart
Veranstaltung und click
wird tatsächlich sinnvoll genutzt, denn während dieser kurzen Zeit wird der Hover-Effekt angezeigt.
Wenn der Benutzer beschließt, den Klick abzubrechen, geschieht dies ganz normal durch eine Bewegung des Fingers. Normalerweise ist dies ein Problem, da keine mouseleave
ausgelöst, und der Schwebeeffekt bleibt bestehen. Zum Glück kann dies leicht behoben werden, indem der Hover-Effekt auf touchmove
.
Das war's!
Beachten Sie, dass es möglich ist, die 300 ms Verzögerung zu entfernen, zum Beispiel mit der Option FastClick-Bibliothek aber das würde den Rahmen dieser Frage sprengen.
Alternative Lösungen
Ich habe die folgenden Probleme mit den folgenden Alternativen gefunden:
- Browser-Erkennung: Äußerst fehleranfällig. Geht davon aus, dass ein Gerät entweder über eine Maus oder einen Touchscreen verfügt, während eine Kombination aus beidem mit der zunehmenden Verbreitung von Touchscreens immer üblicher werden wird.
- CSS-Medienerkennung: Die einzige reine CSS-Lösung, die mir bekannt ist. Immer noch anfällig für Fehler, und immer noch davon ausgegangen, dass ein Gerät entweder Maus oder Touch hat, während beide möglich sind.
- Emulieren Sie das Klick-Ereignis in
touchend
: Dies führt dazu, dass der Link fälschlicherweise verfolgt wird, auch wenn der Benutzer nur scrollen oder zoomen wollte, ohne die Absicht, den Link tatsächlich anzuklicken.
- Verwenden Sie eine Variable, um Mausereignisse zu unterdrücken: Dies setzt eine Variable in
touchend
die als if-Bedingung in nachfolgenden Mausereignissen verwendet wird, um Zustandsänderungen zu diesem Zeitpunkt zu verhindern. Die Variable wird im Klick-Ereignis zurückgesetzt. Dies ist eine gute Lösung, wenn Sie wirklich keinen Hover-Effekt auf Touch-Oberflächen wünschen. Leider funktioniert dies nicht, wenn ein touchend
aus einem anderen Grund ausgelöst wird und kein Klick-Ereignis ausgelöst wird (z. B. weil der Benutzer gescrollt oder gezoomt hat) und anschließend versucht, dem Link mit der Maus zu folgen (d. h. auf einem Gerät mit Maus- und Touch-Oberfläche).
Weitere Lektüre
Siehe auch iPad/iPhone Doppelklick-Problem y Hover-Effekte auf mobilen Browsern deaktivieren .