无法获取document.execCommand(“撤消”)在不同的浏览器相同的方式工作(Unabl

2019-09-01 03:50发布

我有一些代码实现对文本上下文菜单,上下文菜单是有一个UndoRedo ,通过使用调用浏览器的本地方法的项目document.execCommand('undo')

因为我需要在基于浏览器铬但是Firefox和Opera的结果,此代码的功能并不如预期。

我的期望是,撤消和重做可以当作一个输入元素的原生浏览器上下文菜单。 其结果是,输入的元素不撤消和重做,但分度,元素contenteditable属性集,请按预期。

所以我想,如果这是在浏览器中的一个错误,或者铬或Firefox / Opera或如果我没有正确地实现代码?

下面的代码给出了我所面临的问题的例子。 所有的帮助表示赞赏。

<input contenteditable id="input" type="text"></input>
<div contenteditable id="div" class="inputLike" type="text"></div>
<button id="button1" type="button">Undo</button>
<button id="button2" type="button">Redo</button>

var input = document.getElementById("input"),
    button1 = document.getElementById("button1"),
    button2 = document.getElementById("button2"),
    div = document.getElementById("div");

console.log("Undo", document.queryCommandSupported("undo"));
console.log("Redo", document.queryCommandSupported("redo"));

function doUndo() {
    document.execCommand('undo', false, null);
}

function doRedo() {
    document.execCommand('redo', false, null);
}

button1.addEventListener("click", doUndo, false);
button2.addEventListener("click", doRedo, false);

上的jsfiddle

如果你想看看实际的上下文菜单的代码,那么它也可在的jsfiddle 。

Answer 1:

我不认为这是可能的document.execCommand()在Firefox至少。 你可以做你自己的撤消堆栈,或者在将来使用新的UndoManager API ( 在Firefox 20中实现 ,但默认情况下禁用 )。

下面是使用自己的撤消堆栈使用的,取值和选择的快照的一个例子input事件。 您可以通过合并连续打字事件到一个单一的撤消项目,例如改善这一点。 也有与插入位置浏览器之间的一些矛盾,但它只是一个概念证明。

http://jsfiddle.net/FMSsL/

使用新的DOM的UndoManager API似乎是简单:如果我的理解右和浏览器是否支持它,所述<input>元素将具有undoManager属性,它是与物体undo()redo()方法,所以任务就是这么简单

document.getElementById("input").undoManager.undo();

不幸的是只有Firefox的20及以上的支持UndoManager API,它的默认是禁用的。 即使该功能开启后,下面的演示并不即使我认为它应该,所以这个选项是一段路要走是可行的工作。

http://jsfiddle.net/DULV4/2/



Answer 2:

当我从发现的问题 ,我问,在Firefox中的UndoManager API确实工作。 我看着的jsfiddle链接( http://jsfiddle.net/DULV4/1/发布由Tim向下),并似乎有几个问题:

  • 一个undoScope属性必须被设置为true (或者在线或编程)。 这使得undoManager该元素。
  • 撤消任何必须首先通过创建undoManager.transact()函数(虽然我不知道是否有任何方法,将本机取消栈到当前的UndoManager的交易记录)。

我只是这个新手,所以要我说什么与盐粮,看看https://dvcs.w3.org/hg/undomanager/raw-file/tip/undomanager.html所有信息使用它。



文章来源: Unable to get document.execCommand('undo') working in the same manner across browsers