在适用于Android的Chrome版本16和18(至少)中,存在一个错误地报告clientXclientY的错误。如果滚动页面,则至少对于clientX/Y事件,touchstart的值将是错误的,但对于click事件则不是。这里有一个错误:

https://code.google.com/p/chromium/issues/detail?id=117754

包含以下示例,您可以自己尝试:http://www.apprisant.com/tab/cd.html

我在这里用 Canvas 做了一个类似的例子:http://codepen.io/simonsarris/full/dJcvn

这些示例可在其他移动浏览器(包括普通的旧版Android浏览器)上运行,但Android版Chrome浏览器在滚动(至少某些)触摸事件时似乎破坏了clientX/Y。

有趣的是,clientX和clientY在click事件上并没有像在touchstart上那样被破坏。

我的问题是,要使clientX和clientY在浏览器之间一致工作的最佳解决方法是什么? 看来,用window.scrollXwindow.scrollY抵消将“解决”问题,但是一个好的解决方法需要:

  • 确定浏览器是否受苦,最好不要让用户做任何事情,也不要诉诸于检查userAgent(因此不要对特定浏览器版本做任何假设)。换句话说,我们如何分辨哪些浏览器的clientXclientY值不正确?
  • 只能在需要解决的浏览器上可靠地解决此问题(大概只有Android版Chrome和它的特定版本,因为将来的版本可能会更好),貌似,用window.scrollX/Y抵消是唯一需要做的事情这里。
  • 最佳答案

    只需使用e.pageY - window.scrollY代替e.clientY(或X,相应地)。
    e.pageY将为您提供事件发生的位置,并通过window.scrollY进行偏移将“删除由于滚动而在屏幕外显示的空白”。您可以有条件地检查e.pageY - window.scrollY === e.clientY,但是由于解决方法可以为您提供正确的值,因此无论如何都要对其进行计算以进行检查,这是违反直觉的。

    关于javascript - Chrome for Android的不正确的clientX和clientY行为如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13710610/

    10-12 06:13