Предотвратить нажатие по умолчанию, но не перетаскивание по умолчанию в iOS MobileSafari?

Контекст : веб-приложение на MobileSafari / iPad, как полноэкранное, так и встроенное в iframe

Цель : Метод, который предоставляет настраиваемые обработчики событий для Нажмите и Коснитесь , но не , но не Сожмите (масштабирование) или Перетащите (прокрутка / панорамирование). Мы хотим предоставить настраиваемое поведение для Press, но позволить Safari по-прежнему обрабатывать прокрутку / панорамирование / масштабирование.

Проблема : две цели кажутся взаимоисключающими. Чтобы предотвратить поведение по умолчанию для жеста нажатия, необходимо вызвать event.preventDefault в ответ на ontouchstart . Однако, чтобы позволить поведение по умолчанию продолжаться при перетаскивании, мы должны не вызывать event.preventDefault при начальном ontouchstart. После вызова preventDefault невозможно вернуть поведение по умолчанию во время этой последовательности жестов (т. Е. Пока все пальцы не оторвутся). Перетаскивание не распознается, пока не произойдет какое-либо движение.

Перетаскивание показано как простейший пример, но мы также заботимся о том, чтобы получить поведение по умолчанию для сжатия и двойного касания. Нам никогда не понадобится стандартное поведение MobileSafari Press «Копировать изображение» или выделение текста.

На данный момент попытки:

  • Сохраните событие ontouchstart и после тайм-аута вызовите для него preventDefault позже (непосредственно перед тем, как Press будет распознано). Нет эффекта.
  • Слушайте " oncontextmenu ". Нет, поведение нажатия по умолчанию не передается или не маршрутизируется через это событие.
  • Предотвратите значение по умолчанию во всех наших обработчиках ontouch *, а затем, когда мы распознаем жест перетаскивания / сжатия, имитируем новые события с помощью initTouchEvent и / или initGestureEvent . Программно созданные события попадают во все наши обратные вызовы, но Safari, похоже, не обращает на них внимания, не вызывая поведения по умолчанию.
  • Преодоление распознавания Safari Press поддельным ходом. Safari отменяет нажатие при малейшем движении, но мы допускаем небольшую задержку. Имитация события перемещения (как указано выше) сразу после ontouchstart не приводит к тому, что Safari не может распознать Press, если палец не перемещается «по-настоящему».

У нас реализован полнофункциональный набор распознавателей жестов (в Javascript, ontouch *) в стиле собственных распознавателей жестов Apple iOS . У нас нет проблем с распознаванием каких-либо жестов, мы просто не знаем хорошего способа воспроизвести поведение Zoom / Pan / Double-tap, которое Safari предоставляет бесплатно.

Нам не нужен код; мы ищем любое теоретическое решение (помимо «просто реализовать панорамирование / масштабирование самостоятельно», хотя, если у вас есть отличный способ сделать это, мы заинтересованы), которое приведет к разумному успеху. Нам также интересно узнать о других подобных попытках сделать это - конечно мы можем » t были первыми, кто попробовал это ?

Альтернативный TL; DR: Есть ли способ предотвратить нажатие по умолчанию (также известное как нажатие и удержание), кроме как при сенсорном запуске?

14
задан James Baker 30 March 2011 в 18:31
поделиться