![](/img/trans.png)
[英]Mobile Safari (iOS 9) Touch.clientX/Y not reified at time of dispatch?
[英]Includes Touch Events clientX/Y scrolling or not?
我正在嘗試從觸摸事件(例如touchstart )中獲取相對於瀏覽器視口的觸摸坐標。 我試圖從 clientX/Y 屬性中獲取它們,但實際上兩者都返回值,包括滾動。
這違反了規范,因為它說 clientX/Y 應該返回坐標而不滾動。
我做錯了什么?
謝謝
你沒有做錯什么。 這是滾動頁面時發生的舊版本 webkit 中的錯誤。 我在 iOS4 中看到了這個錯誤,在 Android 4.0 中看到了另一個錯誤。
我找到了一種檢測錯誤並計算正確值的方法。 希望這對其他人有用:
function fixTouch (touch) {
var winPageX = window.pageXOffset,
winPageY = window.pageYOffset,
x = touch.clientX,
y = touch.clientY;
if (touch.pageY === 0 && Math.floor(y) > Math.floor(touch.pageY) ||
touch.pageX === 0 && Math.floor(x) > Math.floor(touch.pageX)) {
// iOS4 clientX/clientY have the value that should have been
// in pageX/pageY. While pageX/page/ have the value 0
x = x - winPageX;
y = y - winPageY;
} else if (y < (touch.pageY - winPageY) || x < (touch.pageX - winPageX) ) {
// Some Android browsers have totally bogus values for clientX/Y
// when scrolling/zooming a page. Detectable since clientX/clientY
// should never be smaller than pageX/pageY minus page scroll
x = touch.pageX - winPageX;
y = touch.pageY - winPageY;
}
return {
clientX: x,
clientY: y
};
}
這個 function 必須為 event.touches 數組中的每個觸摸調用。
嘗試這個
event.touches[0].pageX
請注意,即使您這樣定義事件,它也始終是 event.touches(在此處使用 jquery)
$("body").bind('touchmove', function(e){
//stops normal scrolling with touch
e.preventDefault();
console.log(event.touches[0].pageX)
})
;
Safari 指南提供了更多詳細信息
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.