【问题标题】:Catching Tabs in TextArea在 TextArea 中捕捉标签
【发布时间】:2010-11-09 11:30:13
【问题描述】:

有没有人知道一种跨浏览器、可靠的解决方案,用于在 textarea 字段中按下制表键并替换(在正确位置)4 个空格? textarea 用于输入文章,需要此功能。

注意:我尝试使用 FCKEditor 等,它没有捕获选项卡并且有一堆我不需要的功能。我想要一个仅用于捕获标签的简单解决方案。

【问题讨论】:

标签: javascript html dom-events keylistener


【解决方案1】:

我没有进行广泛的测试,但这似乎有效:

(我在http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript#comment-3817找到了“insertAtCursor”函数)

<textarea id="text-area" rows="20" cols="100"></textarea>

<script>
document.getElementById("text-area").onkeydown = function(e) {
  if (!e && event.keyCode == 9)
  {
    event.returnValue = false;
    insertAtCursor(document.getElementById("text-area"), "    ");
  }
  else if (e.keyCode == 9)
  {
    e.preventDefault();
    insertAtCursor(document.getElementById("text-area"), "    ");
  }
};

//http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript#comment-3817
function insertAtCursor(myField, myValue) {
  //IE support
  if (document.selection) {
    var temp;
    myField.focus();
    sel = document.selection.createRange();
    temp = sel.text.length;
    sel.text = myValue;
    if (myValue.length == 0) {
      sel.moveStart('character', myValue.length);
      sel.moveEnd('character', myValue.length);
    } else {
      sel.moveStart('character', -myValue.length + temp);
    }
    sel.select();
  }
  //MOZILLA/NETSCAPE support
  else if (myField.selectionStart || myField.selectionStart == '0') {
    var startPos = myField.selectionStart;
    var endPos = myField.selectionEnd;
    myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
    myField.selectionStart = startPos + myValue.length;
    myField.selectionEnd = startPos + myValue.length;
  } else {
    myField.value += myValue;
  }
}
</script>

EDIT:修改脚本使其不使用 jQuery。

【讨论】:

    【解决方案2】:
    <html>
    <head>
        <script type="text/javascript">
    
            function keyHandler(e) {
                var TABKEY = 9;
                var backSlash = 8;
                var code = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
                if(code == TABKEY && !e.shiftKey && !e.ctrlKey && !e.altKey) {
                var val = document.getElementById("t1");
                    val.value=(val.value).substring(0,getCaret(val)) + "    " + (val.value).substring(getCaret(val));
                    //document.getElementById("t1").value += "    ";
    
                    if(e.preventDefault) {
                        e.preventDefault();
                    } else {
                        e.returnValue = false;
                    }
                    val.focus(); 
                    return false;
                }
                if(code == backSlash) {
                    var val = document.getElementById("t1");
                    val.value=(val.value).substring(0,getCaret(val)-4) + (val.value).substring(getCaret(val));
                    if(e.preventDefault) {
                        e.preventDefault();
                    } else {
                        e.returnValue = false;
                    }
                    return false;
                }
    
            }
    
            function getCaret(el) { 
              if (el.selectionStart) { 
                return el.selectionStart; 
              } else if (document.selection) { 
                el.focus(); 
    
                var r = document.selection.createRange(); 
                if (r == null) { 
                  return 0; 
                } 
    
                var re = el.createTextRange(), 
                    rc = re.duplicate(); 
                re.moveToBookmark(r.getBookmark()); 
                rc.setEndPoint('EndToStart', re); 
    
                return rc.text.length; 
              }  
              return 0; 
            }
        </script>
    </head>
    <body>
     <textarea id="t1" onkeydown="javascript:keyHandler(event)"></textarea>
    
    </body>
    </hrml>
    

    【讨论】:

      【解决方案3】:

      是否有某些原因您不能在编辑完成后替换标签?在输入文本区域时,我玩了很多次替换文本,发现它......充其量是不切实际的。

      【讨论】:

      • 重点是用户在使用页面时应该能够插入“标签”,但默认情况下,tab 键会将焦点循环到下一个元素。
      • 然后您将进入 onkeydown 的跨浏览器实现,这是我从未有勇气尝试的事情。祝你好运!
      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多