Приведенный ниже код решает одну часть вашей проблемы добавления разрывных строк вместо символов новой строки.
Проблема была в использовании textContent
для оценки.Давайте рассмотрим пример, скажем, ваш div
был инициализирован с содержанием ниже:
<div contenteditable>
abc
<br/>
def
</div>
Когда в первый раз кто-то инициирует изменение этого div, метод textContent
вернет
abc def
Поскольку информация о контенте, имеющем точку останова, утеряна, вы увидите, что ваши новые строки удаляются.Решением было заменить его на innerHTML
, что позволило бы вам манипулировать контентом без каких-либо потерь.
const div = document.querySelector('div')
div.addEventListener('input', () => {
let text = div.innerHTML
text = '<span>' + text.replace(/ /g, '</span> <span>').replace(/\n/g, '</span><br/><span>') + '</span>'
//console.log(text)
div.innerHTML = text
})
body {
background-color: white;
}
body > div {
background-color: black;
color: white;
font-family: Monospace;
padding: 0.5rem;
width: 20rem;
}
<div contenteditable="true">
Multiline text
<br />
Multiline
<br />
Text
</div>
Во второй части проблемы вы можете обратиться к ответам на аналогичные вопросы по SO: Как установить позицию курсора (курсора)в contenteditable элемент (div)?