Контекст : веб-приложение для MobileSafari / iPad, как полноэкранное, так и встроенное в iframe
Цель : метод, обеспечивающий пользовательские обработчики событий для Нажмите и Нажмите , но не Сжатие (увеличение ) или Перетащите (прокрутка / панорамирование). Мы хотим обеспечить собственное поведение для Press, но позволить Safari по-прежнему обрабатывать Scroll / Pan / Zoom.
Задача : две цели кажутся взаимоисключающими. Чтобы предотвратить поведение по умолчанию для жеста «Пресс», event.preventDefault должен быть вызван в немедленном ответе на ontouchstart . Однако, чтобы поведение по умолчанию продолжалось при перетаскивании, мы должны , а не , вызывать event.preventDefault при первоначальном запуске ontouchstart. После того как вы будете вызывать protectDefault, вы не сможете вернуть поведение по умолчанию во время этой последовательности жестов (т.е. пока все пальцы не оторвутся). Перетаскивание не распознается, пока не произойдет какое-либо движение.
Перетаскивание проиллюстрировано в качестве простейшего примера, но мы также заботимся о том, чтобы получить поведение по умолчанию для Pinch и Double-tap. Мы никогда не хотим, чтобы стандартное поведение MobileSafari Press было «Копировать изображение» или выделять текст.
Пока попыток:
- Сохраните событие ontouchstart и по истечении timeout вызовите на нем команду warnDefault позже (непосредственно перед распознаванием нажатия). Нет эффекта.
- Слушайте '1038 * oncontextmenu '. Нет, поведение нажатия по умолчанию не сигнализируется и не маршрутизируется через это событие.
- Предотвращение значения по умолчанию во всех наших обработчиках ontouch *, а затем, когда мы распознаем жест перетаскивания / сжатия, моделируем новые события, используя initTouchEvent и / или initGestureEvent . Программно созданные события затрагивают все наши обратные вызовы, но Safari, похоже, не обращает на них внимания, не вызывая поведения по умолчанию.
- Разбейте распознавание прессы в Safari с помощью фальшивого движения. Safari отменяет нажатие на малейшее движение, но мы допускаем небольшой спад. Имитация события перемещения (как описано выше) сразу после запуска ontouchstart не приводит к тому, что Safari не может распознать Нажмите, если палец не перемещается «по-настоящему».
У нас есть полнофункциональный набор распознавателей жестов, реализованных (в Javascript, ontouch *) в стиле встроенных в Apple распознавателей жестов iOS . У нас нет проблем с распознаванием каких-либо жестов, мы просто не знаем хорошего способа воспроизвести поведение «Масштаб / Панорамирование / Двойное касание», которое Safari предоставляет бесплатно.
Нам не нужен код; мы ищем любое теоретическое решение (кроме «просто внедрите панорамирование / масштабирование себя тоже», хотя, если у вас есть интересный способ сделать это, которое нас интересует), которое приведет к разумному успеху. Нам также интересно узнать о других подобных попытках сделать это - , конечно, мы не могли быть первыми, кто попробовал это ?
Альтернативный TL; DR: Есть ли какой-либо способ предотвратить нажатие по умолчанию (также известное как нажатие и удерживание), кроме сенсорного запуска?