Ответ 1
Пока этот поток довольно старый, я просто хотел подтвердить, что эта ошибка все еще сохраняется в последней версии iOS (8.4) на всех устройствах (iPhone/iPad).
После некоторого тестирования я могу подтвердить, что он всегда появляется при следующих обстоятельствах:
- При использовании HTML-тега iframe/object/embed для отображения содержимого HTML в сочетании с привязками событий javascript touch touch (touchstart/touchhend и т.д.) к элементам внутри этого содержимого HTML. Когда пользователь коснется входного элемента внутри этого тега iframe/object/embed во второй раз (иногда больше), все, что он пытается ввести с помощью экранной клавиатуры, больше не появляется внутри поля ввода. (интересно, что слова, предлагаемые над клавиатурой, все еще реагируют на все, что пользователь вводит, он больше не появляется в поле ввода). Иногда можно удалять содержимое через backspace внутри поля ввода, но ничего не добавлять.
Существуют следующие варианты:
-
Событие касания привязывается непосредственно к элементу ввода, ведущему к этой ошибке.
-
Событие касания привязывается к родительскому элементу с входным элементом внутри него (не обязательно быть прямым потомком).
-
Элемент ввода визуально сидит поверх элемента с привязкой события касания. Не имеет значения, где этот элемент находится внутри DOM, или если между элементом, связанным с касанием, и поля ввода есть наложения элементов. Элемент, связанный с касанием, также не должен быть видимым для этого (например, когда другие элементы находятся поверх него). Как только пользователь коснется области поля ввода, в которой находится элемент, связанный с касанием, появляется ошибка. Это интересно, потому что если элемент ввода лишь частично перекрывает элемент, связанный касанием, касание части входа, где элемент, связанный с касанием, не позади, не приведет к этой ошибке.
Решения: Во-первых: это не помогает, если вы экспериментируете с preventDefault/stopPropagation и другими вещами, подобными этому на элементе, связанным касанием. Неважно, что происходит с привязкой события/касания к связанному элементу (я его протестировал, он не вызван/вызван, когда появляется ошибка). Даже CSS-решения, такие как "указатели-события: нет" на элементе, связанный с касанием, не помогают. Итак, следующие решения - наша единственная надежда:
-
Динамически связывать события касания, подобные предложенным в этом потоке, чтобы вы только активировали их, когда они действительно нужны, и удалите их, когда нет, чтобы предотвратить все три случая, описанных выше.
-
Перемещайте элементы или контейнеры с привязками событий касания в сторону, когда элемент ввода находится спереди. Достаточно использовать CSS-преобразования и т.д., Так как даже визуально перемещая их от полей ввода работает. (см. вариант ошибки 3 выше). Поэтому в зависимости от вашего макета, например. если у вас есть боковая панель с полем поиска, которое перемещается со стороны вашей страницы и накладывается на основной контент, подумайте о том, чтобы не накладывать основное содержимое, а вместо этого перемещайте его в сторону.
-
Используйте "display: none" для элементов с привязкой события касания, когда они не используются. Это единственное свойство css, которое, кажется, решает вариант ошибки 3. "видимость: скрытая" не имела никакого эффекта в моих тестах. Элементы с "display: none" больше не влияют на элементы ввода с этой ошибкой. В случае, если вы создаете один пейджер, вы должны рассмотреть страницы настроек или "сенсорные связанные элементы", которые не отображаются, чтобы отобразить их. Это предотвратит вариант ошибки 3.
-
Конечно, лучше всего избегать использования тегов iframe/object/embed для отображения другого содержимого до тех пор, пока эта ошибка существует.