在textarea中撤消TAB

时间:2014-03-26 17:34:26

标签: javascript textarea

当在textarea标签中按TAB并插入\t字符时,有很多关于如何防止对下一个元素进行聚焦的问题。或任何其他角色。所有这些都回答了类似的事情:

  1. 捕获TAB按键
  2. 获取当前插入位置和选择信息
  3. 替换该值,使其包含\t或任何用户想要的内容。
  4. 所有这一切都正常,直到您在CTRL+Z之后按“撤消”或TAB

    如果这样做,您将遇到一些副作用,具体取决于您使用的浏览器:

    • Firefox会删除\t,但是插入符号位置会结束,而textarea中的所有文本都会被选中
    • Chrome不会将此\t计为用户输入,因此CTRL+Z将撤消上一次操作,保留\t,还有一些难以预测的插入符问题< / LI>
    • IE的行为与Chrome相同

    您可以在此处http://jsfiddle.net/c7zc8/1/

    观看

    问题是如何使它成为crossbrowser和“undoable”?

1 个答案:

答案 0 :(得分:3)

对于最新的Chrome(33),以下作品:

var ta = document.getElementById("textareaId");
ta.addEventListener("keydown", function(e) {
    if (e.which===9) {
        e.preventDefault();
        document.execCommand("insertText", false, "\t");
    }
}, false);

参考: Javascript textarea undo redo

然而,对于IE,没有完美的解决方案。 IE11有ms-beginUndoUnit和ms-endUndoUnit,但即便如此,根据Tim Down的说法也不行 internet explorer alternative to document.execCommand("insertText",...), for text insertion that can be undone/redone by the user