我有一個充當所見即所得編輯器的 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, '**<strong></strong>**') // bold .replace(/*(.*)*/gm, '*<em></em>*'); // italic }
div { height: 100vh; width: 100vw; }
<div contenteditable />
Codepen:https://codepen.io/ADAMJR/pen/MWvPebK
像 QuillJS 這樣的 Markdown 編輯器似乎可以編輯子元素而不編輯父元素。這避免了問題,但我現在確定如何使用此設定重新建立該邏輯。
問題:如何讓插入符號位置在打字時不重置?
更新: 我已經設法在每個輸入上將插入符號位置發送到 div 的末尾。然而,這本質上仍然重置了位置。 https://codepen.io/ADAMJR/pen/KKvGNbY
大多數富文本編輯器的做法是保持自己的內部狀態,在按鍵事件上更新它並渲染自訂視覺層。例如這樣:
需要先取得遊標的位置,然後對內容進行處理和設定。然後恢復遊標位置。
當存在嵌套元素時,恢復遊標位置是一個棘手的部分。此外,您每次都會建立新的
和
元素,舊的元素將被丟棄。