В настоящее время я пытаюсь создать подсветку синтаксиса для Javascript, и в настоящее время я сталкиваюсь с проблемой, которая, как я обнаружил, часто встречается при создании чего-то подобного, который устанавливает позицию каретки до конца, пока пользователь вводит или редактирует содержимое редактируемого текста.
Я исследовал и нашел это и многие другие решения здесь, на SO, но ни одно из них не работает. Он получает позицию каретки, но никогда не сбрасывает ее, поэтому я пытаюсь найти обходной путь для этой проблемы.
Ниже приведен код, который я придумал.
html
<div id="editor" contentEditable="true" onkeyup="resetPosition(this)"></div>
<input type="text" onkeyup="resetPosition(this)" />
js
function getPos(e) {
// for contentedit field
if (e.isContentEditable) {
e.focus()
let _range = document.getSelection().getRangeAt(0)
let range = _range.cloneRange()
range.selectNodeContents(e)
range.setEnd(_range.endContainer, _range.endOffset)
return range.toString().length;
}
// for texterea/input element
return e.target.selectionStart
}
function setPos(pos, e) {
// for contentedit field
if (e.isContentEditable) {
e.focus()
document.getSelection().collapse(e, pos);
return
}
e.setSelectionRange(pos, pos)
}
function resetPosition(e) {
if(e.isContentEditable) {
let currentPosition = getPos(e);
e.innerHTML=e.innerHTML.replace(/[0-9]/g, "a");
setPos(currentPosition, e);
return;
}
e.value = e.value.replace(/[0-9]/g, "a");
setPos(currentPosition, e);
}
Это прекрасно работает для ввода текста, но не для contentEditable divs
.
Когда я набираю что-то вроде function
, я получаю otincfun
.
ОБНОВЛЕНИЕ: Мне удалось исправить функцию setPos
, изменив эту строку с document.getSelection().collapse(e, pos);
на document.getSelection().collapse(e.firstChild, pos);
, но возникла новая ошибка.
Когда я нажимаю клавишу ВВОД, каретка возвращается к первой строке и первому символу. Пожалуйста, как мне исправить?
Ниже находится ссылка на скрипку
https://jsfiddle.net/oketega/bfeh9nm5/35/
Спасибо.