2013-11-21 39 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