Verhindern Standard-Presse, aber nicht standardmäßig Ziehen in iOS MobileSafari?
Kontext: Web-app auf MobileSafari/iPad, sowohl full-screen und eingebettet in einem iframe
Ziel: Technik, bietet benutzerdefinierte Ereignis-Handler für Drücken und Tippen aber nicht Prise (zoom) oder Ziehen (scroll/pan). Wir wollen benutzerdefiniertes Verhalten für die Presse, sondern lassen Sie Safari Griff Scroll/Pan/Zoom noch.
Problem: Die beiden Ziele zu sein scheinen, die sich gegenseitig ausschließen. Um zu verhindern, dass das Verhalten für die Press-Geste, event.preventDefault muss einberufen werden, in der unmittelbaren Reaktion auf ontouchstart. Jedoch, um das Standard-Verhalten begeben Sie sich auf eine Ziehen, wir müssen nicht Aufruf-Ereignis.preventDefault auf den ersten ontouchstart. Einmal preventDefault heißt, es gibt keinen Weg, um das Standard-Verhalten zurück, während diese Geste Sequenz (D. H. bis alle Finger kommen). Ziehen Sie nicht erkannt, bis eine Bewegung stattgefunden hat.
Ziehen ist dargestellt, wie das einfachste Beispiel, aber wir kümmern uns darum, das Verhalten für Pinch und Doppel-Tippen Sie auf als auch. Wir wollen nie die Standard MobileSafari Drücken Sie das Verhalten von "Bild Kopieren" oder markieren Sie text.
Versuche so weit:
- Speichern Sie die ontouchstart Ereignis und nach einer timeout, preventDefault es zu einem späteren Zeitpunkt (kurz vor dem Drücken erkannt werden würde). Keine Wirkung.
- Hören für 'oncontextmenu'. NÖ, die Standard-Press-Verhalten wird nicht signalisiert oder werden über dieses Ereignis.
- Verhindern, dass der Standard in allen unseren ontouch* Handler, und dann, wenn wir erkennen, Drag/Pinch-Geste simulieren, neue Ereignisse, die mit initTouchEvent und/oder initGestureEvent. Die programmatisch erzeugte events Treffer alle unsere Rückrufe, aber Safari scheint zu zahlen keine Aufmerksamkeit auf Sie, die Auslösung kein Standard-Verhalten.
- Brechen Safari Drücken Sie die Erkennung mit einem fake bewegen. Safari bricht ein Druck auf die geringste Bewegung, aber wir lassen für ein bisschen Suppe. Simulation der ein move-Ereignis (wie oben) nur nach dem ontouchstart nicht zu Safari nicht zu erkennen, Drücken Sie, wenn der finger nicht bewegt "for real".
Wir haben ein voll funktionsfähiges set of gesture recognizers umgesetzt (in Javascript, ontouch*) im Stil von apples native iOS-gesture recognizers. Wir haben kein problem erkennen, keine gestik, wir wissen nur noch nicht von einer guten Weise zu replizieren, die Zoom - /Pan - /Double-tap Verhalten, dass Safari bietet für kostenlos.
Brauchen wir nicht code auf, wir sind auf der Suche nach einer theoretischen Lösung (jenseits von "einfach umzusetzen pan/zoom dich zu", aber wenn Sie haben eine glatte Art und Weise zu tun, dass wir interessiert sind), dass führt zum Erfolg. Wir sind auch daran interessiert, lernen über andere ähnliche versuche, dies zu tun - können wir sicher nicht der erste gewesen zu versuchen, diese?
Alternativen TL;DR: gibt es eine Möglichkeit zu verhindern, dass eine Standard-Presse (auch bekannt als Tippen-und-halten) andere als in touchstart?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erfolg: Vermeiden Sie den "Standard-Taste" - Verhalten vollständig über CSS anstelle von " preventDefault. Diese Antwort wurde von der Safari-Technologien Evangelist Vicki Murley über hier (Anmeldung erforderlich)
Kommentar: Wir gingen davon aus, dass Safari Drücken Sie das Verhalten war bei der Ereignis-basierten, nicht getrieben von CSS. Aufrufen von preventDefault ontouchstart nicht Abbrechen, die Presse Verhalten (das ist, was führte uns in die Irre, wirklich), aber dass scheint zu sein, eine unbeabsichtigte Nebenwirkung. Wirklich, Mobile Safari nicht ausführen "Presse-event" so viel wie "CSS auf-Presse".
Deaktivieren der Presse Verhalten mit CSS hat uns erlaubt, noch einmal preventDefault nur, wo und wenn wir es wirklich benötigen.
Hässliche Möglichkeit: nicht verhindern, dass ein drücken - stellen Sie eine Standard-Presse nichts zu tun. Versuchen Sie, ein Glas-Fenster-div fängt alle Nuancen und kann nicht verhindern, dass alles auf touchstart.
Divs haben Standard-Press-Verhalten (eine Art Auswahl), aber vielleicht kann ausgeschaltet werden, nicht über preventDevault aber über
<body style="-webkit-user-select:none">
? refDies würde bedeuten, wir müssten unsere eigene Treffer-Tests, um festzustellen, was-DOM-Knoten übergeben unsere anerkannte Veranstaltungen zu, da können wir nicht einfach lassen die Ereignisse sprudeln die DOM-Vorfahr Kette.