復原與重做
本頁說明 editorHistory 如何記錄編輯狀態,以及 undo()/redo() 還原內容與游標的方式。
紀錄內容
每筆紀錄是一個快照,而不是差異:
| 欄位 | 內容 |
|---|---|
index |
游標所在列(從 0 起算) |
offset |
游標在該列的位置 |
content |
編輯器所有 <div> 列的 innerText 以 \n 串接 |
復原與重做各是一個陣列,沒有長度上限;長文件連續編輯時記憶體用量會隨步數線性成長。
何時寫入
| 動作 | 寫入時機 |
|---|---|
init()(建構時與 clear()) |
立即寫入初始狀態 |
一般輸入(input 事件) |
延遲 300 ms;期間再次輸入會取消前一個計時器,連續輸入合併為一筆 |
剪下、貼上、Enter、Backspace、Tab、Cmd/Ctrl+] |
以 0 ms 計時器寫入 |
格式化方法(bold()、heading() 等) |
以 0 ms 計時器寫入 |
所有寫入都會清空重做堆疊,所以復原後再做任何編輯就無法重做。
undo()
- 取復原堆疊倒數第二筆作為目標;堆疊少於兩筆時不做任何事
- 把最後一筆移到重做堆疊
- 以目標的
content呼叫init(content, false, false)重建列,不再寫入紀錄 - 把游標放回目標的
index/offset autosave為真時更新預覽
redo()
從重做堆疊取出最後一筆,推回復原堆疊,之後的重建、游標與預覽更新與 undo() 相同。
快捷鍵
| 組合鍵 | 方法 |
|---|---|
Cmd/Ctrl+Z |
undo() |
Cmd/Ctrl+Shift+Z |
redo() |
這兩組不受 hotKey: false 影響。goBack()、goForward() 是舊名稱,見 已棄用 API。