2013-11-21 37 views
10

当用户编辑contenteditable div,并按下某些键时,我想重写默认行为。 例如,我想在用户按ENTER键时插入正常换行符。 我这样做,用document.execCommand("insertText",...)Internet Explorer替代document.execCommand(“insertText”,...),用于文本插入,可以撤消/用户重做

这是到目前为止,我已经找到了做出这个动作撤消重做用户的唯一途径。

<div id="editor" contenteditable="true" style="white-space:pre-wrap"> 
Some text.... 
</div> 

<script> 
$("#editor").keydown(function(evt){ 
    console.log(evt.keyCode); 
    if(evt.keyCode==13){ 
     document.execCommand("insertText",false,"\n"); 
     evt.preventDefault(); 
     evt.stopPropagation(); 
    } 
} 
</script> 

此代码适用于Chrome和Firefox。但是,即不支持“inserttext”。有没有办法用ie插入文字,这样用户可以撤销呢?

+0

你关心哪个版本的IE的什么? IE 11具有启动/结束可撤消操作命令,但以前的版本不支持。 –

+0

@TimDown,与我目前的情况相比,任何改进都是值得欢迎的:)当然,如果它适用于旧版本,也就是说,ie11比没有更好。 – Oli

+0

@TimDown,请张贴您的答案。这将是非常有益的。 – Oli

回答

7

IE 11有新的ms-beginUndoUnitms-endUndoUnit命令。

我试过并且未能为使用这些的IE 11创建工作解决方案。插入换行符对于DOM范围和选择很困难;您可以在IE中使用其传统的document.selectionTextRange对象更轻松地完成此操作,但不幸的是,IE 11删除了document.selection(但不是奇怪的TextRange),这很难实现。在编码一个讨厌的解决方法以从选择中创建一个TextRange后,撤消无效。下面是我所做的:

http://jsfiddle.net/E7sBD/2

我决定再要一个使用DOM范围和选择对象去。换行符插入代码是说明性的,不应该用于任何严重的事情,因为它涉及添加一个不间断的空间以使脱字符号在某处(试图在<br>不起作用后直接放置它)。撤消会删除插入的内容,但不幸的是不会移动插入符号。

http://jsfiddle.net/E7sBD/4/

0

您可以随时去更简单,更稳定的方式捉对输入DIV的变化事件,并从输入字符串的最后一个字符改变自己的喜好。

http://api.jquery.com/change被发明了,我认为,为此目的:)

更改你的天使,你会看到一个全新的世界:3

+0

我试过这种方法。但是当我按Ctrl + Z时,它不再工作。 – Oli