在适用于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
我在这里用canvas做了一个类似的例子:http://codepen.io/simonsarris/full/dJcvn
这些示例适用于其他移动浏览器(包括普通的旧版Android浏览器),但Chrome for Android似乎在滚动时打破了(至少某些)触摸事件上的clientX / Y.
有趣的是,clientX和clientY在click
事件中没有像touchstart
上那样被打破。
我的问题是,让clientX和clientY在浏览器中保持一致的最佳解决方法是什么?似乎与window.scrollX
和window.scrollY
抵消会“解决”问题,但一个好的解决方法需要:
clientX
和clientY
值不正确? window.scrollX/Y
是唯一的需要在这里完成的事情。答案 0 :(得分:14)
只需使用e.pageY - window.scrollY
代替e.clientY
(或相应的X
)。
e.pageY
将为您提供事件发生的位置,并且window.scrollY
的偏移将“移除因滚动而屏幕外的空白”。您可以有条件地检查e.pageY - window.scrollY === e.clientY
,但由于解决方法为您提供了正确的值,并且您必须计算它以进行检查,这将是违反直觉的。
答案 1 :(得分:2)
我首先检查
<meta name="viewport" content="width=device-width, initial-scale=1">
被使用。这解决了移动浏览器应用程序中的大量位置问题,尤其是Android。不确定它是否会对您的特定问题有所帮助,但值得一试。
答案 2 :(得分:0)
您可以在画布上订阅touchstart
事件,并使用.offset()
和e.pageX
获取画布中的位置。
$('#my-canvas').on('touchstart', function (startEvent) {
var offset = $(this).offset();
$(this).on('touchmove', function (moveEvent) {
var pos = {
x: moveEvent.pageX - offset.left,
y: moveEvent.pageY - offset.top
}
});
});