Включает прокрутку кликов TouchXXXX или нет?

Я пытаюсь получить сенсорные координаты относительно просмотра браузера от событий касания (например, touchstart). Я попытался получить их из свойств clientX/Y, но оба действительно возвращают значения, включая прокрутку.

Это против spec, так как он говорит, что clientX/Y должен возвращать координаты без прокрутки.

  • Я попытался добавить/удалить мета-тег viewport - без успеха.
  • Я тестировал его в iOS 4.3 на iPhone и Fennec в ночное время - оба возвращали значения с прокруткой.

Что я делаю неправильно?

Спасибо

Ответ 1

Ты не делаешь ничего плохого. Это ошибка в старых версиях 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
    };
}

Эта функция должна вызываться для каждого касания в массиве event.touches.

Ответ 2

Попробуйте это

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 содержит более подробную информацию