Javascript 撤消文本区域中的选项卡

Javascript 撤消文本区域中的选项卡,javascript,textarea,Javascript,Textarea,当在textarea标记中按下选项卡,只需插入一个\t字符,如何防止聚焦下一个元素有很多问题。或任何其他角色。所有这些问题的答案如下: 捕获一个TAB键 获取当前插入符号位置和选择信息 替换该值,使其包含\t或用户想要的任何内容 所有这些都可以正常工作,直到在选项卡 如果您这样做,您将体验到一些副作用,具体取决于您使用的浏览器: Firefox将删除\t,但插入符号pos将转到末尾,并选中textarea中的所有文本 Chrome不会将此\t计算为用户输入,因此CTRL+Z将撤消上次操作之前的

当在textarea标记中按下
选项卡
,只需插入一个
\t
字符,如何防止聚焦下一个元素有很多问题。或任何其他角色。所有这些问题的答案如下:

  • 捕获一个TAB键
  • 获取当前插入符号位置和选择信息
  • 替换该值,使其包含
    \t
    或用户想要的任何内容
  • 所有这些都可以正常工作,直到在
    选项卡

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

    • Firefox将删除
      \t
      ,但插入符号pos将转到末尾,并选中textarea中的所有文本
    • Chrome不会将此
      \t
      计算为用户输入,因此
      CTRL+Z
      将撤消上次操作之前的操作,保留
      \t
      在适当的位置,还有一些难以预测的插入符号问题
    • IE的行为和Chrome一样
    你可以在这里看

    问题是如何使其交叉排列并“可撤消”?

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

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

    然而,对于IE来说,没有完美的解决方案。IE11有ms beginUndoUnit和ms endUndoUnit,但根据Tim Down的说法,即使这样也不能很好地工作

    document.execCommand(“insertText”)
    在Firefox中不起作用