【发布时间】:2012-11-22 12:48:39
【问题描述】:
在 Android 版本 16 和 18 的 Chrome 中(至少)存在错误报告 clientX 和 clientY 的错误。如果页面被滚动,clientX/Y 的值至少对于 touchstart 事件是不正确的,但不是 click 事件。这里有一个错误:
https://code.google.com/p/chromium/issues/detail?id=117754
里面有这个例子,你可以自己试试:http://www.apprisant.com/tab/cd.html
我在这里用画布做了一个类似的例子:http://codepen.io/simonsarris/full/dJcvn
这些示例适用于其他移动浏览器(包括普通的旧版 Android 浏览器),但 Android 版 Chrome 似乎在滚动时(至少在某些)触摸事件上破坏了 clientX/Y。
有趣的是,clientX 和 clientY 在 click 事件上并没有像在 touchstart 上那样被破坏。
我的问题是,让 clientX 和 clientY 在浏览器中一致工作的最佳解决方法是什么? 似乎用 window.scrollX 和 window.scrollY 进行偏移将“解决”这个问题,但是一个好的解决方法需要:
- 确定浏览器是否受到影响,最好不要让用户做任何事情,也不要求助于检查 userAgent(因此不要对特定浏览器版本做出任何假设)。换句话说,我们如何判断哪些浏览器的
clientX和clientY值不正确? - 仅在需要解决的那些浏览器上可靠地解决问题(大概只有适用于 Android 的 Chrome 和它的特定版本,因为未来的版本可能会很好),看起来,由
window.scrollX/Y抵消是唯一的事情需要在这里完成。
【问题讨论】:
-
我不确定,但我发现这个问题的讨论,也许它会帮助你:code.google.com/p/chromium/issues/detail?id=141840#c19
-
除了使用正确的值来判断哪些浏览器有这种行为之外,您还有什么理由吗?与仅使用不同的方法计算 clientX/Y 相比,该解决方法使条件检查的效率更低。
标签: javascript android google-chrome touch dom-events