Es ist nicht ganz klar, was Ihre Frage ist, aber wenn Sie nur den Doppelklick eliminieren möchten, während Sie den Hover-Effekt für die Maus beibehalten, ist mein Rat:
- Fügen Sie Hover-Effekte auf
touchstart
und hinzu mouseenter
.
- Entfernen Sie Hover - Effekte auf
mouseleave
, touchmove
und click
.
Hintergrund
Um eine Maus zu simulieren, lösen Browser wie Webkit Mobile die folgenden Ereignisse aus, wenn ein Benutzer einen Finger auf dem Touchscreen (wie dem iPad) berührt und loslässt (Quelle: Touch And Mouse auf html5rocks.com):
touchstart
touchmove
touchend
- 300 ms Verzögerung, wobei der Browser sicherstellt, dass es sich um ein einfaches Tippen handelt, nicht um ein doppeltes Tippen
mouseover
mouseenter
- Hinweis : Wenn ein
mouseover
, mouseenter
oder mousemove
Ereignis den Seiteninhalt ändert, werden die folgenden Ereignisse nie gebrannt.
mousemove
mousedown
mouseup
click
Es scheint nicht möglich zu sein, den Webbrowser einfach anzuweisen, die Mausereignisse zu überspringen.
Was noch schlimmer ist: Wenn ein Mouseover-Ereignis den Seiteninhalt ändert, wird das Klickereignis niemals ausgelöst, wie im Safari Web Content Guide - Behandeln von Ereignissen erläutert , insbesondere in Abbildung 6.4 unter Ein-Finger-Ereignisse . Was genau eine "Inhaltsänderung" ist, hängt vom Browser und der Version ab. Ich habe festgestellt, dass für iOS 7.0 eine Änderung der Hintergrundfarbe keine Inhaltsänderung ist (oder nicht mehr?).
Lösung erklärt
Um es noch einmal zusammenzufassen:
- Fügen Sie Hover-Effekte auf
touchstart
und hinzu mouseenter
.
- Entfernen Sie Hover - Effekte auf
mouseleave
, touchmove
und click
.
Beachten Sie, dass keine Aktion aktiviert ist touchend
!
Dies funktioniert eindeutig für Mausereignisse: mouseenter
und mouseleave
(leicht verbesserte Versionen von mouseover
und mouseout
) werden ausgelöst und fügen den Hover hinzu und entfernen ihn.
Wenn der Benutzer tatsächlich einen click
Link hat, wird auch der Hover-Effekt entfernt. Dadurch wird sichergestellt, dass es entfernt wird, wenn der Benutzer die Zurück-Taste im Webbrowser drückt.
Dies funktioniert auch bei Berührungsereignissen: Beim touchstart
Hover wird der Effekt hinzugefügt. Es wird am nicht entfernt touchend
. Es wird am erneut hinzugefügt mouseenter
, und da dies keine Inhaltsänderungen verursacht (es wurde bereits hinzugefügt), wird das click
Ereignis ebenfalls ausgelöst und der Link wird verfolgt, ohne dass der Benutzer erneut klicken muss!
Die Verzögerung von 300 ms, die ein Browser zwischen einem touchstart
Ereignis hat und click
die tatsächlich gut genutzt wird, da der Hover-Effekt in dieser kurzen Zeit angezeigt wird.
Wenn der Benutzer beschließt, den Klick abzubrechen, erfolgt eine Bewegung des Fingers wie gewohnt. Normalerweise ist dies ein Problem, da kein mouseleave
Ereignis ausgelöst wird und der Hover-Effekt bestehen bleibt. Zum Glück kann dies leicht behoben werden, indem der Hover-Effekt auf entfernt wird touchmove
.
Das ist es!
Beachten Sie, dass es möglich ist, die Verzögerung von 300 ms zu entfernen, z. B. mithilfe der FastClick-Bibliothek . Dies ist jedoch für diese Frage nicht zulässig .
Alternativlösungen
Ich habe die folgenden Probleme mit den folgenden Alternativen gefunden:
- Browsererkennung: Extrem fehleranfällig. Angenommen, ein Gerät verfügt entweder über eine Maus oder eine Berührung, während eine Kombination aus beiden immer häufiger wird, wenn sich die Anzeige von Berührungen vermehrt.
- CSS-Medienerkennung: Die einzige CSS-Lösung, die mir bekannt ist. Immer noch fehleranfällig und geht immer noch davon aus, dass ein Gerät entweder Maus oder Touch hat, während beide möglich sind.
- Emulieren Sie das Klickereignis in
touchend
: Dies folgt falsch dem Link, selbst wenn der Benutzer nur scrollen oder zoomen wollte, ohne die Absicht, tatsächlich auf den Link zu klicken.
- Verwenden Sie eine Variable, um Mausereignisse zu unterdrücken: Hiermit wird eine Variable festgelegt
touchend
, die als if-Bedingung in nachfolgenden Mausereignissen verwendet wird, um Statusänderungen zu diesem Zeitpunkt zu verhindern. Die Variable wird im Klickereignis zurückgesetzt. Dies ist eine anständige Lösung, wenn Sie wirklich keinen Hover-Effekt auf Touch-Interfaces wünschen. Leider funktioniert dies nicht, wenn a aus einem touchend
anderen Grund ausgelöst wird und kein Klickereignis ausgelöst wird (z. B. wenn der Benutzer gescrollt oder gezoomt hat) und anschließend versucht, dem Link mit einer Maus zu folgen (dh auf einem Gerät mit Maus- und Touch-Oberfläche) ).
Weiterführende Literatur
Siehe auch iPad / iPhone-Doppelklickproblem und Hover-Effekte in mobilen Browsern deaktivieren .