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