У меня есть спорный див. После некоторых действий contenteditable перерисовывается. Перед повторным рендерингом div я сохраняю данные диапазона для объекта следующим образом:
this.rangeData = {
anchorNodeKey: null,
anchorOffset: null,
focusNodeKey: null,
focusOffset: null,
isCollapsed: null,
};
Я храню ключи узлов вместо anchorNode
. После повторного рендеринга div я получаю узлы по этому ключу и использую их для создания диапазона и восстановления выделения следующим образом:
const range = document.createRange();
const anchorNode = this.getNodeByKey(this.rangeData.anchorNodeKey);
range.setStart(anchorNode, this.rangeData.anchorOffset);
const focusNode = this.getNodeByKey(this.rangeData.focusNodeKey);
range.setEnd(focusNode, this.rangeData.focusOffset);
range.collapse(this.rangeData.isCollapsed);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
Каретка помещается после повторного рендеринга в соответствующее место, но я не могу восстановить выделение (например, выбранное слово становится невыбранным и в конце этого слова помещается каретка). Selection
объект имеет свойство type
(https://developer.mozilla.org/en-US/docs/Web/API/Selection/type), которое может иметь значение «Range», но я не могу найти, как его установить.
Что я пропустил?