2010-09-08 4 views
6

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

Проблема, с которой я столкнулся, - это последний бит. Событие «коснуться» не срабатывает, когда я отпускаю последний палец? Значит, у меня нет способа подавить кнопку?

..также событие «touchhend» всегда имеет касание.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> 
+0

Обязательно укажите свою версию ОС. Это работает как ожидалось для меня в 3.1.3 (iPod touch первого поколения): «touchstart 1», «touchstart 2», «touchhend 1», «touchhend 0». –

+0

Конечно, извините. 3.2.1 на iPad. Это и некоторые другие, похоже, были исправлены в 4.2 –

ответ

3

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

1) В то время как событие «touchhend» javascript для iPhone имеет свойство «touchhes», оно всегда будет пустым, когда последний палец покидает экран, touchs "для iPhone представляет пальцы, которые в данный момент касаются экрана, а« коснулся »только огни после палец покидает экран. Таким образом, на «touchhend» «e.touches.length» всегда будет 0, когда последний палец будет поднят.

2) Вы можете получить доступ к тем изменениям, которые были изменены в событии «touchhend», используя свойство «changedTouches». Это проблематично, потому что поведение не очень последовательное.

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

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

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

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

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

+0

Отличная ссылка! При тестировании на Android я обнаружил, что объект event.touch не указан, но я бы рекомендовал поддерживать оба массива штрихов кода (event.touches и event.changedTouches), поскольку оба они кажутся надежными в Android и iOS. В моем случае (просто нужно x и y с одного пальца), я тестировал changeTouches, затем касался того, что не был неопределенным и имел длину === 1, в этом порядке –

0

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

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

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

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

Смежные вопросы