Запретить по умолчанию Нажмите, но не по умолчанию Перетащите в iOS MobileSafari? - PullRequest
14 голосов
/ 18 марта 2011

Контекст : веб-приложение для 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: Есть ли какой-либо способ предотвратить нажатие по умолчанию (также известное как нажатие и удерживание), кроме сенсорного запуска?

Ответы [ 2 ]

19 голосов
/ 31 марта 2011

Успех : полностью запретить поведение при нажатии по умолчанию с помощью CSS, а не предотвращать дефолт.Этот ответ был предоставлен 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 в отношении прессы основано на событиях, а не обусловленоCSS.Вызов метода warnDefault ontouchstart отменяет поведение прессы (что на самом деле привело нас в заблуждение), но это, кажется, непреднамеренный побочный эффект.Действительно, Mobile Safari не выполняет «событие нажатия» столько, сколько «CSS при печати».

Отключение поведения «Нажатие» с помощью CSS позволило нам снова вызывать protectDefault только там, где оно нам действительно нужно.

0 голосов
/ 31 марта 2011

Уродливая возможность : не запрещать пресс - заставить пресс по умолчанию ничего не делать.Попробуйте использовать стеклопакет div, который улавливает все прикосновения и ничего не мешает при сенсорном запуске.

Div имеют стандартное поведение нажатия (какой-то выбор), но, возможно, его можно отключить, а не с помощьюпредотвратите, но через <body style="-webkit-user-select:none">? ref

Это означало бы, что нам нужно было бы провести собственное тестирование попаданий, чтобы определить, в какие узлы DOM передавать наши распознанные события, поскольку мы не можем просто позволить событиям пузыритьсяЦепочка предков DOM.

...