Предотвращение по умолчанию Нажмите, но не по умолчанию Перетащите в iOS MobileSafari?
Контекст: веб-приложение на 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?
Ответы
Ответ 1
Успех. Предотвратите "по умолчанию" поведение полностью через CSS, а не preventDefault. Этот ответ был предоставлен Safari Technologies Evangelist Вики Мурли над здесь (требуется регистрация)
Я вижу в вашей статье stackoverflow, что вы говорите, что ваша конечная цель состоит в том, что:
"Мы никогда не хотим, чтобы по умолчанию Поведение MobileSafari Press" Копировать Изображение "или выбор текста."
Эти поведения могут быть отключены в CSS (+ одно бонусное свойство, так как люди часто хотят отключить подсветку если они отключили эти другие поведения):
/* behavior */
-webkit-user-select: none; /* disable cut copy paste */
-webkit-touch-callout: none; /* disable callout, image save panel */
-webkit-tap-highlight-color: transparent; /* "turn off" link highlight */
Комментарий. Мы предположили, что поведение Safari Press было основано на событиях, а не на основе CSS. Вызов preventDefault ontouchstart действительно отменяет поведение пресса (что на самом деле привело нас в заблуждение), но это кажется непреднамеренным побочным эффектом. Действительно, Mobile Safari не выполняет "пресс-событие" так же, как "CSS на прессе".
Отключение поведения Press с помощью CSS позволило нам еще раз вызвать preventDefault только там, где он нам действительно нужен.
Ответ 2
Уродливая возможность. Не помешайте прессе - сделайте сообщение по умолчанию, ничего не делайте. Попытайтесь использовать стеклянную панель, которая улавливает все касания и не мешает чему-либо прикосновению.
У divs есть значение по умолчанию. Поведение при нажатии (какой-то выбор), но, возможно, это можно отключить, а не через preventDevault, но через <body style="-webkit-user-select:none">
? ref
Это означало бы, что нам нужно было бы провести собственное тестирование на предмет того, чтобы определить, какие узлы DOM передают наши распознанные события, поскольку мы не можем просто позволить событиям пузыриться в цепочке предков DOM.