设置div为contenteditable=true如何实现修改后撤消操作?

16 min read

要实现修改后撤消操作,可以使用浏览器提供的UndoManager接口。

首先,在设置div的contenteditable属性为true之前,需要给div加上一个contenteditable的包裹元素,用于管理撤消和重做操作,例如:

<div id="container">
  <div id="editable-div" contenteditable="true"></div>
</div>

然后,获取包裹元素,并创建一个UndoManager实例,将其与包裹元素进行关联,同时监听包裹元素的“input”事件,记录修改操作,如下所示:

const container = document.getElementById("container");
const editableDiv = document.getElementById("editable-div");

// 创建 UndoManager 实例并关联包裹元素
const undoManager = new UndoManager();
undoManager.setCallback(() => {
  updateUndoRedoState();
});

// 监听 input 事件,记录修改操作
container.addEventListener("input", () => {
  undoManager.add({
    undo: () => {
      editableDiv.innerHTML = undoManager.undo();
    },
    redo: () => {
      editableDiv.innerHTML = undoManager.redo();
    }
  });
});

function updateUndoRedoState() {
  // 根据 UndoManager 实例的状态更新 Undo 和 Redo 按钮的状态
}

最后,需要实现一个方法用于更新撤消和重做按钮的状态,根据UndoManager实例的状态进行更新即可。

这样就可以实现修改后的撤消操作了。