诀窍在于 Safari 11.1(捆绑到 iOS 11.3)如何处理触摸事件。
来自他们的release notes:
网络 API:
- 更新了根文档触摸事件侦听器以使用被动模式提高滚动性能并减少崩溃。
所以基本上改变了这个:
// Prevent scrolling when touching the canvas
document.body.addEventListener("touchstart", function (e) {
if (e.target == canvas) {
e.preventDefault();
}
}, false);
document.body.addEventListener("touchend", function (e) {
if (e.target == canvas) {
e.preventDefault();
}
}, false);
document.body.addEventListener("touchmove", function (e) {
if (e.target == canvas) {
e.preventDefault();
}
}, false);
进入这个:
// Prevent scrolling when touching the canvas
document.body.addEventListener("touchstart", function (e) {
if (e.target == canvas) {
e.preventDefault();
}
}, { passive: false });
document.body.addEventListener("touchend", function (e) {
if (e.target == canvas) {
e.preventDefault();
}
}, { passive: false });
document.body.addEventListener("touchmove", function (e) {
if (e.target == canvas) {
e.preventDefault();
}
}, { passive: false });
阅读 documentation for EventTarget.addEventListener 后阅读 Safari (iOS 11.3) 发行说明是有意义的
passive:一个布尔值,如果为真,则表明侦听器指定的函数永远不会调用 preventDefault()。如果被动侦听器确实调用了 preventDefault(),用户代理除了生成控制台警告之外什么都不做。请参阅使用被动侦听器提高滚动性能以了解更多信息。