【发布时间】:2011-07-17 21:54:37
【问题描述】:
上下文:MobileSafari/iPad 上的网络应用,全屏和嵌入 iframe
目标:为 Press 和 Tap 但不 Pinch(缩放)或拖动(滚动/平移)。我们希望为 Press 提供自定义行为,但仍让 Safari 处理 Scroll/Pan/Zoom。
问题:这两个目标似乎是相互排斥的。为了防止按下手势的默认行为,必须立即调用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 的native iOS gesture recognizers 风格实现了一套功能齐全的手势识别器(使用 Javascript,ontouch*)。我们识别任何手势都没有问题,只是我们不知道复制 Safari 免费提供的缩放/平移/双击行为的好方法。
我们不需要代码;我们正在寻找任何理论上的解决方案(除了“自己也可以实现平移/缩放”,但如果您有一种我们感兴趣的巧妙方法)可以带来合理的成功。我们也有兴趣了解其他类似的尝试 - 我们肯定不可能是第一个尝试这个的人?
Alternate TL;DR: 除了 touchstart 之外,还有什么方法可以防止默认按下(也称为长按)?
【问题讨论】:
标签: ipad web-applications webkit mobile-safari touch-event