我有一个充当所见即所得编辑器的 div。它充当文本框,但在其中呈现 Markdown 语法,以显示实时更改。
问题:键入字母时,插入符号位置会重置为 div 的开头。
const editor = document.querySelector('div'); editor.innerHTML = parse('**dlob** *cilati*'); editor.addEventLis tener('input', () => { editor.innerHTML = parse(editor.innerText); }); function parse(text) { return text .replace(/**(.*)**/gm, '****') // bold .replace(/*(.*)*/gm, '**'); // italic }
div { height: 100vh; width: 100vw; }
Codepen:https://codepen.io/ADAMJR/pen/MWvPebK
像 QuillJS 这样的 Markdown 编辑器似乎可以编辑子元素而不编辑父元素。这避免了问题,但我现在确定如何使用此设置重新创建该逻辑。
问题:如何让插入符号位置在打字时不重置?
更新: 我已经设法在每个输入上将插入符号位置发送到 div 的末尾。然而,这本质上仍然重置了位置。 https://codepen.io/ADAMJR/pen/KKvGNbY
大多数富文本编辑器的做法是保持自己的内部状态,在按键事件上更新它并渲染自定义可视层。例如这样:
需要先获取光标的位置,然后对内容进行处理和设置。然后恢复光标位置。
当存在嵌套元素时,恢复光标位置是一个棘手的部分。此外,您每次都会创建新的
和
元素,旧的元素将被丢弃。