IOS показывает клавиатуру при фокусе ввода

У меня проблема, которую я не могу исправить.

Клавиатура не отображается на ввод.фокус() на IOS

 searchMobileToggle.addEventListener('click', function() {
       setTimeout(function(){
          searchField.focus();
       }, 300);
    });

Я искал решение безрезультатно, я знаю, что это часто нерешенный вопрос, но я вижу, что Найк (https://m.nike.com/fr/fr_fr/) и ПРОДОВОЛЬСТВЕННЫЙ ИСТОЧНИК (https://www.foodspring.fr/) делают это на мобильных устройствах.

Вот мне и интересно, как они?

это поможет?
Roy J 29.01.2019 16:49

Фокус — это когда вы щелкаете по элементу. Вы хотите вместо этого использовать функцию onclick?

Chillin' 29.01.2019 16:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
2
24 005
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Не существует способа законный сделать это, поскольку iOS хочет открывать клавиатуру только при взаимодействии с пользователем, однако вы все равно можете добиться этого либо с помощью prompt(), либо с помощью focus() из события click(), и оно появится.

«Изнутри события click()», то есть вы в основном говорите удалить тайм-аут, верно? Поскольку автор уже находится в событии клика

Gena Moroz 29.01.2019 17:11

Нет, ты можешь оставить это себе. В основном запускайте событие щелчка в поле ввода после его фокусировки.

oel 29.01.2019 17:18
Ответ принят как подходящий

Я нашел решение, click() не работал, но я разобрался.

searchMobileToggle.addEventListener('click', function() {
         if (mobileSearchblock.classList.contains('active')) {
            searchField.setAttribute('autofocus', 'autofocus');
            searchField.focus();
        }
        else {
            searchField.removeAttribute('autofocus');
        }
    });

Я работал с vue.js, который удалял входной атрибут autofocus при загрузке компонента. Так что у меня это было по клику, но была другая проблема, автофокус сработал только один раз, но в сочетании с focus() он теперь работает постоянно :)

Спасибо за вашу помощь !

У меня не работает ... я даже совместил это с запуском события щелчка после установки фокуса, все равно не работает: / Тестирование на Iphone11 iOS, v13 Safari

pashata 15.10.2020 13:01

Ни один из других ответов не работал для меня. В конце концов я изучил код javascript Nike, и вот что я придумал в качестве многократно используемой функции:

function focusAndOpenKeyboard(el, timeout) {
  if (!timeout) {
    timeout = 100;
  }
  if (el) {
    // Align temp input element approximately where the input element is
    // so the cursor doesn't jump around
    var __tempEl__ = document.createElement('input');
    __tempEl__.style.position = 'absolute';
    __tempEl__.style.top = (el.offsetTop + 7) + 'px';
    __tempEl__.style.left = el.offsetLeft + 'px';
    __tempEl__.style.height = 0;
    __tempEl__.style.opacity = 0;
    // Put this temp element as a child of the page <body> and focus on it
    document.body.appendChild(__tempEl__);
    __tempEl__.focus();

    // The keyboard is open. Now do a delayed focus on the target element
    setTimeout(function() {
      el.focus();
      el.click();
      // Remove the temp element
      document.body.removeChild(__tempEl__);
    }, timeout);
  }
}

// Usage example
var myElement = document.getElementById('my-element');
var modalFadeInDuration = 300;
focusAndOpenKeyboard(myElement, modalFadeInDuration); // or without the second argument

Обратите внимание, что это определенно хакерское решение, но тот факт, что Apple так долго не исправила это, оправдывает его.

@sandrina-p У меня это сработало в этой песочнице кода в ios v13: codeandbox.io/s/z33rnoy1nm

n8jadams 29.12.2019 15:20

@ n8jadams, можем ли мы сделать это, не нажимая кнопку «Показать модальное окно»?

Deepak 01.04.2020 11:44

@Дипак, конечно. Эта песочница кода просто использует обратный вызов onclick, который вызывает эту функцию. Всякий раз, когда вы хотите, чтобы все это произошло (по щелчку или нет), вызовите функцию focusAndOpenKeyboard.

n8jadams 01.04.2020 18:53

мой вариант использования - с contenteditable div. я думал, что поведение будет таким же, как и у div contenteditable. кажется это не так.

chitgoks 25.04.2020 01:59

@chitgoks Я никогда не пробовал это с редактируемым контентом div, но вы можете попробовать что-то из этого другого ответа SO: stackoverflow.com/questions/2388164/…

n8jadams 25.04.2020 21:06

Успешно использовал этот хак на iOS 13.3 с React и MUI. Спасибо, @n8jadams!

kenecaswell 10.06.2020 19:22

@ n8jadams Я пробовал, не работает. Не могли бы вы посмотреть на него (stackoverflow.com/questions/63652448/…) и ответить. Спасибо!

maverickosama92 30.08.2020 01:41

@maverickosama92 Этот хак зависит от нюансов веб-браузера. Он не будет работать в нативной мобильной среде, такой как Ionic framework, React Native и т. д.

n8jadams 01.09.2020 18:49

Я тоже пробовал в мобильном сафари. Я думаю, что ion-content overflow=true имеет некоторые проблемы, из-за которых не фокусируется ввод и, следовательно, клавиатура не появляется. В любом случае спасибо за этот код. Ваше здоровье!

maverickosama92 01.09.2020 18:58
offsetTop и offsetLeft не обязательно будут на расстоянии от верхней и левой части body. Я считаю, что лучшим подходом было бы добавить __tempEl__ к родительскому контейнеру el, чтобы вы не сравнивали яблоки и апельсины. developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetT‌​op
tylertrotter 16.02.2021 17:30

@tylertrotter Это хорошее решение, если вы знаете, что можете напрямую возиться с окружающими элементами DOM. Я использую это в React и не могу. Приблизительное расположение меня вполне устраивает.

n8jadams 16.02.2021 18:43

@ n8jadams, если по какой-то причине вы не можете добавить к тому же элементу, вы можете добавить к телу и использовать getBoundingClientRect().top, который измеряется из области просмотра. Расположение, вероятно, точно для вас, однако, если вы добавите CSS position: relative к любому предку между el и body, измерение может быть далеким. Это может не иметь значения для вас, но это имело значение в моем случае, поэтому я хотел сделать это предостережение для других в том же месте, что и я. developer.mozilla.org/en-US/docs/Web/API/Element/…

tylertrotter 17.02.2021 14:11

Другие вопросы по теме