上下文:MobileSafari/iPad 上的 Web 应用程序,全屏和嵌入 iframe
目标:为Press和Tap而不是 Pinch(缩放)或Drag(滚动/平移)提供自定义事件处理程序的技术。我们希望为 Press 提供自定义行为,但仍然让 Safari 处理 Scroll/Pan/Zoom。
问题:这两个目标似乎是相互排斥的。为了防止 Press 手势的默认行为,必须立即调用event.preventDefault以响应ontouchstart。但是,要让默认行为在 Drag 上继续进行,我们不能在初始 ontouchstart 上调用 event.preventDefault。一旦调用了 preventDefault,就无法在该手势序列期间恢复默认行为(即直到所有手指都松开)。在发生某些移动之前,无法识别拖动。
拖动是最简单的示例,但我们也关心获得捏合和双击的默认行为。我们从不想要“复制图像”或选择文本的默认 MobileSafari Press 行为。
迄今为止的尝试:
- 保存 ontouchstart 事件,并在timeout之后调用 preventDefault (就在 Press 被识别之前)。没有效果。
- 听“ oncontextmenu ”。不,默认的 Press 行为不会通过此事件发出信号或路由。
- 在我们所有的 ontouch* 处理程序中阻止默认设置,然后当我们识别到拖动/捏合手势时,使用initTouchEvent和/或initGestureEvent模拟新事件。以编程方式创建的事件会触发我们所有的回调,但 Safari 似乎没有注意到它们,不会触发任何默认行为。
- 用一个假动作破坏 Safari 的 Press 识别。Safari 会在最轻微的移动时取消按下,但我们允许有一点马虎。如果手指没有“真正”移动,则在 ontouchstart 之后模拟移动事件(如上)不会导致 Safari 无法识别 Press。
我们以 Apple原生 iOS 手势识别器的风格实现了一套功能齐全的手势识别器(在 Javascript,ontouch* 中)。我们识别任何手势都没有问题,我们只是不知道复制 Safari 免费提供的缩放/平移/双击行为的好方法。
我们不需要代码;我们正在寻找任何理论上的解决方案(除了“自己也可以实现平移/缩放”,但如果您有一种我们感兴趣的巧妙方法),可以带来合理的成功。我们也有兴趣了解其他类似的尝试——当然我们不可能是第一个尝试这个的人吗?
备用 TL;DR:除了在 touchstart 中,还有什么方法可以防止默认的 Press(也称为点击并按住)?