文件 1.11.6

復原與重做

本頁說明 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()

  1. 取復原堆疊倒數第二筆作為目標;堆疊少於兩筆時不做任何事
  2. 把最後一筆移到重做堆疊
  3. 以目標的 content 呼叫 init(content, false, false) 重建列,不再寫入紀錄
  4. 把游標放回目標的 index/offset
  5. autosave 為真時更新預覽

redo()

從重做堆疊取出最後一筆,推回復原堆疊,之後的重建、游標與預覽更新與 undo() 相同。

快捷鍵

組合鍵 方法
Cmd/Ctrl+Z undo()
Cmd/Ctrl+Shift+Z redo()

這兩組不受 hotKey: false 影響。goBack()、goForward() 是舊名稱,見 已棄用 API。

EN