撤消不会将文档内容还原为editor.insertHtml之前的状态

时间:2015-03-25 10:13:19

标签: ckeditor

编写ckeditor插件时,我遇到了撤消的问题。 我正在使用editor.insertHtml将具有特定类的div添加到文档中。如果我从一个空文档开始,撤消和重做是不亮的。执行命令后,undo将亮起。如果按下撤消,两者都会亮起。 “撤消”不会还原文档内容。

为什么不呢?

CKEDITOR.plugins.add('plugin_name',
{
  init: function(editor)
  {
    editor.ui.addButton('Button_name',
    {
      label: 'some text',
      command: 'Command_name',
      icon: this.path + 'images/icon.png'
    });

    editor.addCommand('Command_name', { canUndo: true, exec: function()
    {
      editor.fire('saveSnapshot');
      editor.insertHtml("<div contenteditable='false' class='foobar'></div>\r\n");
      editor.fire('saveSnapshot');
    }});
  }
});

我也不明白为什么在插入html之前和之后都需要保存快照,但那是另一回事。

1 个答案:

答案 0 :(得分:1)

首先 - editor.insertHtml()负责拍摄快照,因为它是一种高级方法。如果您停止触发editor#saveSnapshot,可能会有所帮助。

第二件事 - 由于您的命令canUndo设置为true快照,因此在执行时会自动记录。因此,我建议将其设置为false,使editor.insertHtml()成为唯一保存快照的人。

如果以上内容无效,则需要检查已拍摄的快照。要执行此操作,只需访问editor.undoManager.snapshots即可。在你的情况下,应该有两个 - 一个具有初始内容,一个在执行命令后被采用。不幸的是调试撤消管理器是一个痛苦...

  

我也不明白为什么在插入html之前和之后都需要保存快照,但那是另一回事。

这是一个很好的问题。但是让我们概括一下 - 为什么我需要在之前和更改内容之后拍摄快照?

在CKEditor 4.4.3之前的IIRC有两个原因,现在只剩下第二个原因了:

  • 因为最初的快照堆栈是空的,所以要记录初始内容,
  • 将键入的文本与之后完成的更改分开。

第一个是一个古怪的行为,最近几个版本发布了。现在,初始快照在editor#instanceReady上进行。

但第二种情况仍然如此。当你开始输入编辑器时,编辑器会开始计数键,每25帧就会记录一次快照。但是,如果是您键入5个字符,然后按粗体按钮,您希望这5个字符保​​存为单独的操作,并按粗体作为第二个。这就是为什么粗体命令在执行之前拍摄快照 - 记录包含这5个新字符的快照,然后需要另一个快照来记录<strong></strong>元素的插入。

事实是,最有可能记录击键的方式可以在不需要采取行动之前拍摄快照的方式实施。这将需要在插入每个字符后拍摄快照,然后对它们进行分组。这是可能的,但它会更重。

令人遗憾的是,最近我们需要开始在每个键上拍摄快照,以便在键入和删除文本时处理一些棘手的情况。没有可靠的方法告诉keydown是否插入/删除字符,好的撤消管理器应该将输入与删除分开。因此,如果出现以下退格 / 删除,则我们需要知道上一个字符插入后的内容是什么,反之亦然。

换句话说 - 在我们对撤消管理器进行最近的更改之后,今天也许可以简化所有这些。但有一个是肯定的 - 实现一个好的撤销管理器(特别是在你不控制字符插入的情况下)是非常棘手的,很少做正确。

PS。要插入的HTML末尾的"\r\n"没有任何区别。