Проблемы с contenteditable | IOS

Рейтинг: 2Ответов: 1Опубликовано: 08.05.2023

Если на IOS внутри contenteditable вписать что-то, то проверка правописания выделит содержимое и предложит замену. Проблема в то, что если в этот момент очистить содержимое инпута, то выделение остается, а дальнейшие подсказки ломаются.

Как воспроизвести?

  1. Введите любое слово, чтобы началась автозамена

введите сюда описание изображения

  1. Очистите инпут

введите сюда описание изображения

  1. Удалите пару символов и снова введите что-то

Элемент списка

Как видно на скринах, залипает выделение и ломается автозамена. Как я выяснил, причиной тому является e.preventDefault() (сломанные подсказки, про выделение не знаю), но без него я не могу сохранить фокус внутри div'a при очистке. Сталкивался ли кто-нибудь с такой проблемой и знает, как её решить.

const ref = document.querySelector('#editor');
const button = document.querySelector('#button');
const clickEditable = (e) => {
  console.log(ref);
  e.preventDefault();
  ref.innerHTML = '';
}
button?.addEventListener('touchstart', clickEditable);
button?.addEventListener('mousedown', clickEditable);
<button id="button" style="height: 40px">SUBMIT</button>
<div style="border: 1px solid #333; padding: 4px;" id="editor" contentEditable="true" />

Ответы

▲ 2Принят

Решение оказалось очень простым. Нужно создать второй инпут за пределами страницы. После очистки основного инпута нужно перенести фокус на вторичный и сразу обратно. Тогда подсказки пересчитаются и выдадут правильные результаты. Скачков клавиатуры не будет. Также при keyDown - Backspace делать то же самое. Баг с выделением при таком варианте тоже исчезает.

При таком решении иногда вознакают проблемы с курсором. Нужно перед рефокусом сохранять значение позиции курсора и после фокуса ставить его туда же.