Mobile Safari - событие "touchend" не срабатывает при удалении последнего касания? - PullRequest
6 голосов
/ 08 сентября 2010

«Жест», который я пытаюсь уловить, - это касание, когда, но только когда элемент (другой или такой же) уже коснулся его.Таким образом, нажмите (1), нажмите кнопку вниз, в то время как нажмите (2), чтобы выбрать выбранные параметры, нажмите (1), чтобы отпустить кнопку, и нажать кнопку.

У меня проблема с последним битом.Событие "touchend" не запускается, когда я отпускаю последний палец?Так что я не могу нажать кнопку?

.. также у события "touchend" всегда есть touches.length = 0?

Вот код, чтобы вы могли понять, что я имею в виду.Я думаю, что это может быть ошибка в мобильном сафари?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
        <title>Multi-touch problem</title>
        <style>
            #touchpane{
                width:900px;
                height:500px;
                background-color:#333;
            }
        </style>
    </head>
    <body>
        <div id="touchpane" click="void();"></div>
        <script>
                var tp = document.getElementById("touchpane");
                tp.addEventListener('touchstart', function(e){
                    e.preventDefault();// to stop copy and paste
                    console.log("touchstart " + e.touches.length );
                }, false)
                tp.addEventListener('touchend', function(e){
                    console.log("touchend " + e.touches.length );
                                    // not called when last finger removed?
                }, false)
                tp.addEventListener('touchcancel', function(e){
                    console.log("touchcancel");
                }, false)
        </script>
    </body>
</html>

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Я могу помочь вам с одной проблемой, но я не знаю, почему «таченд» не срабатывает, когда оба пальца покидают экран, когда я запускаю ваш код выше, «таченд» срабатывает, когда любой палец покидает экран (на айфоне 4)

1) Хотя событие JavaScript «touchend» для iPhone имеет свойство «touch», оно всегда будет пустым, когда последний палец покинет экран, потому что «touch» для iPhone представляет пальцы, которые в данный момент касаются экрана, и "touchend" запускает только после того, как палец покидает экран. Таким образом, на «touchend» «e.touches.length» всегда будет 0, когда последний палец поднят.

2) Вы можете получить доступ к тем касаниям, которые были изменены в событии "touchend", используя свойство changeTouches. Это проблематично, потому что это поведение не очень последовательное.

Если коснуться экрана одним пальцем, затем другим, а затем убрать один палец, может произойти множество вещей.

Если после удаления второго пальца ничего не изменилось в отношении первого пальца, ваш объект события в "touchend" будет иметь "touches.length = 1" (палец все еще на экране) и "changeTouches.length" = 1 "(палец, который покинул экран).

Однако, если вы перемещаете первый палец (даже немного), когда убираете второй палец, то при «прикосновении» ваш объект события будет иметь «touch.length = 1» (палец все еще на экране) и "changeTouches.length = 2" (палец, который покинул экран + движение первого пальца).

Я нашел эту статью очень полезной:

http://m14i.wordpress.com/2009/10/25/javascript-touch-and-gesture-events-iphone-and-android/

0 голосов
/ 14 ноября 2010

TouchEvent типа touchend всегда имеет e.touches.length 0

Отсутствующее событие последнего касания может зависеть от целей касаний.Если оба пальца поднимаются одновременно и оба имеют одну и ту же цель, то срабатывает только один каскад, но он будет иметь оба касания в объекте e.changedTouches.Если цели различны, то вы увидите два события касания, каждое из которых связано с касанием в объекте changeTouches.

Более того, и самое загадочное то, что когда вы поднимите один из двух пальцев, вы получите такое же поведениекак будто вы подняли оба.Затем, когда оставшийся палец перемещается, он запускает другой сенсорный запуск, с оригинальным идентификатором этого пальца в касаниях.В результате во время касания невозможно определить, какое касание закончилось, до истечения произвольного промежутка времени (когда движется оставшийся палец).

Чтобы проверить это, вам нужно документировать списки контактов в каждом событии.Единственный обходной путь, который я нашел, - это кластер, где я кэширую события сенсорного запуска, setInterval на полсекунды, а затем надеюсь, что оставшийся палец запустил сенсорный запуск, который я могу использовать для согласования состояния.Боже мой!

...