Подтвердить что ты не робот

Какое обходное решение для Chrome для Android неправильного поведения clientX и customerY?

В Chrome для Android версии 16 и 18 (по крайней мере) есть ошибка, которая сообщает об ошибках 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-браузер), но Chrome для Android, похоже, сломал clientX/Y на (по крайней мере, некоторых) событиях при прокрутке.

Интересно, что clientX и clientY не разбиваются на событие click, как на touchstart.

Мой вопрос заключается в том, что наилучшим способом решения проблемы с клиентом и клиентом я работаю последовательно в браузерах? Похоже, что смещение с помощью window.scrollX и window.scrollY "решит" проблему, но хорошее обходной путь:

  • Определите, что браузер страдает или нет, предпочтительно, не делая пользователя ничего и не прибегая к проверке userAgent (поэтому не делайте никаких предположений о конкретных версиях браузера). Другими словами, , как определить, какие браузеры имеют плохие значения для clientX и clientY?
  • Решите проблему надежно и только в тех браузерах, где она нуждается в решении (предположительно, только для Chrome для Android и только для определенных версий, поскольку будущие версии могут быть точными). По-видимому, смещение window.scrollX/Y - единственное, что необходимо сделать здесь.
4b9b3361

Ответ 1

Просто используйте e.pageY - window.scrollY вместо e.clientY (или X, соответственно).

e.pageY предоставит вам, где произошло событие, и смещение window.scrollY будет "удалять пустое пространство", которое отключено из-за прокрутки. Вы МОЖЕТЕ условно проверить, что e.pageY - window.scrollY === e.clientY, но так как обходной путь дает вам правильное значение, и вы должны его вычислить, чтобы проверить его в любом случае, это было бы противоинтуитивно.

Ответ 2

Я бы начал с проверки того, что

<meta name="viewport" content="width=device-width, initial-scale=1">

. Это зафиксировало много позиционных проблем в мобильных браузерах, особенно с Android. Не уверен, что это поможет вашей конкретной проблеме, но стоит сделать снимок.

Ответ 3

Вы можете подписаться на событие 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
        }
    });
});