Ich versuche, einige meiner Bibliotheken mit Touch-Geräten zum Laufen zu bringen, aber es fällt mir schwer, herauszufinden, wie sie unterstützt werden und wie sie funktionieren.
Grundsätzlich gibt es 5 Touch-Ereignisse , aber es scheint, dass es unter mobilen Browsern nur einen Konsens über das touchstart
Ereignis gibt (duh). Ich habe eine Geige als Testfall erstellt.
Ich habe dies auf meinem Galaxy Note mit Android 4 an Bord getestet, aber Sie können den Link auch mit einem Desktop-Browser überprüfen.
Das Ziel ist es, herauszufinden, wie man mit Wasserhähnen, Doppelhähnen und langen Wasserhähnen umgeht. Nichts Besonderes.
Grundsätzlich passiert Folgendes:
Der Android-Aktienbrowser löst keine Touch-Ereignisse aus. Es wird versucht , nur Mausklicks mit Hähnen zu emulieren, Brennen mousedown
, mouseup
und click
Ereignissen hintereinander, aber doppelt Taps einzoomen nur in und out tha Seite.
Chrome für Android löst das Touchstart-Ereignis aus, wenn der Finger den Bildschirm berührt. Wenn es früh genug freigegeben ist, feuert es dann mousedown
, mouseup
, touchend
und schließlich click
Ereignisse.
Im Fall einer langen Hahn , nach etwa einer halben Sekunde es feuert , mousedown
und mouseup
, und , touchend
wenn der Finger angehoben wird, ohne click
Ereignis am Ende.
Wenn Sie Ihren Finger bewegen , wird ein touchmove
Ereignis ein paar Mal ausgelöst, dann wird ein touchcancel
Ereignis ausgelöst, und danach passiert nichts, nicht einmal ein touchend
Ereignis beim Anheben des Fingers.
Durch zweimaliges Tippen werden die Funktionen zum Vergrößern / Verkleinern ausgelöst , aber in Bezug auf das Ereignis wird die Kombination ausgelöst touchstart
- touchevent
zweimal, ohne dass Mausereignisse ausgelöst werden.
Firefox für Android feuert richtig die touchstart
Veranstaltung, und bei kurzem Hahn Feuer mousedown
, mouseup
, touchend
und click
danach.
Im Fall einer langen Hahn , feuert sie mousedown
, mouseup
und schließlich touchend
Ereignisse. Für diese Dinge ist es dasselbe wie für Chrome.
Wenn Sie jedoch Ihren Finger bewegen , wenn er touchmove
kontinuierlich ausgelöst wird (wie zu erwarten ist), das Ereignis jedoch nicht ausgelöst wird, touchleave
wenn der Finger das Element mit dem Ereignis-Listener verlässt, und das Ereignis nicht ausgelöst wird, touchcancel
wenn der Finger das Browser-Ansichtsfenster verlässt .
Bei Doppelklicks verhält es sich wie Chrome.
Opera Mobile macht das Gleiche wie Chrome und Firefox für ein kurzes Tippen, aktiviert jedoch bei langem Drücken eine Freigabefunktion, die ich wirklich deaktivieren möchte. Wenn Sie Ihren Finger bewegen oder zweimal tippen, verhält es sich wie Firefox.
Chrome Beta macht das Übliche für kurze Taps, aber bei langen Taps wird das mouseup
Ereignis nicht mehr ausgelöst, nur touchstart
dann, mousedown
nach einer halben Sekunde, dann, touchend
wenn der Finger angehoben wird. Wenn der Finger bewegt wird, verhält er sich jetzt wie Firefox und Opera Mobile.
Bei doppeltem Tippen werden beim Verkleinern keine Berührungsereignisse ausgelöst , sondern nur beim Vergrößern.
Chrome Beta zeigt das seltsamste Verhalten, aber ich kann mich nicht wirklich beschweren, da es sich um eine Beta handelt.
Die Frage ist : Gibt es eine einfache Möglichkeit, kurze, lange und doppelte Taps in den gängigsten Browsern von Touch-Geräten zu erkennen?
Schade, dass ich es nicht auf iOS-Geräten mit Safari oder IE für Windows Phone 7 / Phone 8 / RT testen kann, aber wenn einige von Ihnen dies können, wäre Ihr Feedback sehr dankbar.
quelle
Antworten:
Wenn Sie es noch nicht getan haben, würde ich empfehlen, den Quellcode für Hammer.js zu lesen
https://github.com/hammerjs/hammer.js/blob/master/hammer.js
Zwischen Kommentaren und Code sind es ungefähr 1400 Zeilen, es gibt eine großartige Dokumentation und der Code ist leicht zu verstehen.
Sie können sehen, wie der Autor viele der häufigsten Berührungsereignisse gelöst hat:
Ich denke, nachdem Sie den Quellcode gelesen haben, werden Sie viel besser verstehen, wie Berührungsereignisse funktionieren und wie Sie identifizieren können, welche Ereignisse der Browser verarbeiten kann.
http://eightmedia.github.io/hammer.js/
quelle
Es gibt eine wirklich hervorragende Ressource https://patrickhlauke.github.io/touch/tests/results/ , die die Reihenfolge der Ereignisse in einer erstaunlichen Anzahl von Browsern beschreibt. Es scheint auch regelmäßig aktualisiert zu werden (im September 2016 wurde es zuletzt im August 2016 aktualisiert).
Das Wesentliche ist, im Wesentlichen alles , was auslöst
mouseover
und verwandte Ereignisse; Die meisten lösen auch Berührungsereignisse aus, die normalerweisetouchend
vorher abgeschlossen (erreicht )mouseover
und dann fortgesetzt werdenclick
(es sei denn, eine Änderung des Seiteninhalts hebt dies auf). Diese unangenehmen Ausnahmen sind glücklicherweise relativ selten (Android-Browser von Drittanbietern und Blackberry-Playbook).Diese verknüpfte Ressource weist eine beeindruckende Detailgenauigkeit auf. Hier ein Beispiel der ersten drei von vielen, vielen Betriebssystem-, Geräte- und Browsertests:
Um einige der wichtigsten Punkte zusammenzufassen:
Mobile Browser
mouseover
beim ersten Tippen ausgelöst . Nur einige Windows Phone-Browser lösen es bei einem zweiten Tippen aus.click
. Es wird nicht angegeben, welcher Abbruch erfolgt,click
wennmouseover
die Seite geändert wird (ich glaube, die meisten tun dies).mouseover
nachtouchstart
und ausgelösttouchend
. Dies umfasst iOS7.1 Safari, Android, Chrome, Opera und Firefox für Android sowie einige (nicht alle Windows Phone-Browser)mouseover
nachtouchstart
und ausgelösttouchend
.mouseover
zwischentouchstart
und ausgelösttouchend
touchstart
odertouchend
.Desktop-Browser
touchstart
undtouchend
anschließendmouseover
.touchstart
undtouchend
Ereignisse.touchstart
undtouchend
angesichts der Knappheit an Mac-Touchscreen-Schnittstellen.Es gibt auch eine unglaubliche Datenmenge in Browsern, kombiniert mit unterstützenden Technologien.
quelle
Ja, Sie können einen Timer um starten
touchstart
und beendentouchend
und von dort aus Ihre Auswahl treffen.Sie können auch ... sagen wir, wischen, meine Auslösung
touchmove
Sie können die Koordinaten des "Fingers" erhalten und sehen, wie viel ich gereist bin, bevortouchend
ausgelöst wird.Ich weiß nicht, ob es einen einfacheren Weg gibt, als eine Touch-Ereignisbibliothek zu verwenden, aber ich nehme an, Sie könnten ganz einfach einen für einfache "Tap" -, "Double Tap" - und "Swipe" -Ereignisse schreiben.
quelle
touchleave
es nie abgefeuert wird.e.target
Ist es bei richtiger Codierung, wie wir, das Element (glaube ich) beim Touchstart zu erfassen, gleich dem Element am Touchend? Wenn nein, dann ist es kein gültiger Tipp, es ist eine Falle. Ich sage nicht, dass das Codieren einer Bibliothek einfach wäre, aber es ist nicht wirklich "schwer", ich würde es als "mittel" einstufen + was macht es Spaß, wenn es nicht herausfordernd ist und uns dazu bringt, auf stackoverflow xD zurückzukehrentouchstart
Veranstaltung auf? Was ist, wenntouchstart
währenddessen ein zweites Ereignis ausgelöst wird (Multitouch-Anzeige)? Wie geht man mit langen Wasserhähnen um? VerwendensetTimeout
, aber was ist, wenn der Finger das Element währenddessen verlässt? Wie erkennt man es, wenn keine Berührungsereignisse ausgelöst werden? Und so weiter ... Ich werde es natürlich versuchen, aber ich hatte gehofft, eine tiefe Analyse von Berührungsereignissen zu finden.touchstart
bevor die erstetouchend
auftritt. Darüber hinaus führt das erneute Nachdenken über Ihre Antwort zu dem Schluss, dass dies nicht hilfreich ist, da dietarget
Eigenschaft destouchend
Ereignisses immer dem Element entspricht, in dem die Berührung begonnen hat, selbst wenn der Finger außerhalb des Elements bewegt wurde!Hier ist meine neueste Beobachtung zu Berührungs- und Mausereignissen unter Android 4.3
Opera, Firefox und Chrome scheinen ein Standardverhalten zu haben
Beim Wischen (touchstart-touchmove-touchend):
On Tap (Touchstart-Touchend):
Der Android-Standardbrowser weist einige nicht standardmäßige Verhaltensweisen auf :
quelle