在 TextArea 中捕捉标签

Posted

技术标签:

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

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

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

【问题讨论】:

可能重复***.com/questions/3362/capturing-tab-key-in-text-box 我认为该解决方案不能内联(如果选项卡出现在字符串中间) 【参考方案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 的跨浏览器实现,这是我从未有勇气尝试的事情。祝你好运!

以上是关于在 TextArea 中捕捉标签的主要内容,如果未能解决你的问题,请参考以下文章

对于textarea标签的使用

js textarea标签问题

如何正确处理 textarea 中的 html 标签

如何阻止 textarea 标签翻译数字

从 Django 的 TextArea 小部件中删除标签

如何用 li 标签在 textarea 中换行? PHP