
Bug 无数的 Safari 又来困扰我了,就是一个 PWA WebApp,在 safari 浏览器里正常,但一但添加到主屏幕后,双击的后一击就没有了。
打开网址:
https://www.oxyry.com/test/safari-double-tap-bug/safari-double-tap-bug.html
双击那块黑色块,会有二条 pointerdown 记录或 touchstart 记录,这很正常。 但把这个网址添加个主屏幕作为 webapp 打开,双击就只有一击了???!!! Safari 能不能别这么离谱。
我发现唯一的办法只有釜底抽薪,在 touchstart 里 preventDefault 彻底屏蔽点击事件,但这个办法明显不能用在正常 App 里,因为我 App 里还要用双击事件呢。
html 源代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" cOntent="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"> <title>Safari double tap bug</title> <meta name="apple-mobile-web-app-capable" cOntent="yes"> <meta name="mobile-web-app-capable" cOntent="yes"> <meta name="apple-mobile-web-app-status-bar-style" cOntent="default"> <link rel="manifest" href="manifest.json"> <style> #rootEl { height: 70vh; overflow: auto; background: #000; color: #fff; /* touch-action: none; */ user-select: none; } </style> </head> <body> <div> <div id="rootEl"></div> <p id="btns"> <button id="clearBtn">Clear</button> <button id="reloadBtn">Reload</button> </p> </div> <script> clearBtn.Onclick= () => { rootEl.innerHTML = ''; } reloadBtn.Onclick= () => { location.reload(); } const log = (msg) => { const m = document.createElement('div') m.textCOntent= msg rootEl.appendChild(m) } let i = 0 rootEl.addEventListener('pointerdown', () => { log(`pointerdown #${i++}`) }) let j = 0 rootEl.addEventListener('touchstart', (ev) => { log(`touchstart #${j++}`) // ev.preventDefault() }) </script> </body> </html> 1 weijar OP 按理说双击事件这是再正常不过的手势事件了吧? 一开始我写的手势库没有双击事件我还没往浏览器 BUG 这方面想因为过于不可能,但没想到 Safari 下限如此之低,这么严重的 bug 总不可能是我第一个碰到? |
2 Lattez 2022-10-11 09:10:39 +08:00 Safari 总有各种各样神奇的兼容性问题,所以还是老实 Chrome 保平安... |
4 weijar OP 另外要说一点,在我的 App 里双击后整个界面还会更离谱地上移 100 多像素(不是容器滚动,是整体上移,往下扒一下后还会掉下来),我怀疑是因为这个导致双击后一击被界面上移弄没了。但这个最简 demo 里没有体现出会上移,我再想想怎么搞出来这个上移效果。 |
5 makelove 2022-10-11 11:14:20 +08:00 因为上一条原因,试着给 body 加个 overflow:hidden 禁滚动(虽然页面很小根本不可能滚动)竟然又能检测到双击了,看来似乎还是因为 Safari 会神奇地双击滚动导致不能双击。 但正常 App 显然不能禁了 body 滚动,所以不是个有效的解决方法。 |
6 yangzzzzzz 2022-10-11 13:44:42 +08:00 safari 自动填充验证码还会输两遍 |
7 YsHaNg 2022-10-11 22:28:29 +08:00 因为双击会检测 frame 宽度放大吧 |
8 neiltroyer849 2022-11-17 17:22:42 +08:00 @yangzzzzzz 对啊神烦。。。这个 bug 从 15 到 16.1 了都还没修,而且是整个 WebKit 都有,所以 iOS app 用了 WKWebview 的也会遭 |
9 weijar OP |