JavaScript - 使用contentEditable div中的tab键

时间:2017-07-30 05:00:11

标签: javascript contenteditable tabbing

我完全清楚这个问题看起来像是重复的,但事实并非如此。请阅读。

我有一个div标记,其属性为contentEditable="true"。我正在尝试这样做,所以我可以使用div内的tab键而不移动焦点。这里有一些我没有完全解决问题的代码:

var tab = function(id){
 if(event.keyCode === 9){
    event.preventDefault();
    document.getElementById(id).innerHTML += "    ";
    setCaretPos(id);
 }
}

var setCaretPos = function(id){
   var node = document.getElementById(id);
   node.focus();
   var textNode = node.firstChild;
   var caret = textNode.length;
   var range = document.createRange();
   range.setStart(textNode, caret);
   range.setEnd(textNode, caret);
   var sel = window.getSelection();
   sel.removeAllRanges();
   sel.addRange(range);
}

这基本上只是在div内部文本值的末尾添加四个空格,然后将插入符号移到末尾。当我在其他行上使用制表符时会出现问题,因为它只会将制表符添加到结尾(如果我还没有在最后一行)。

所以,我想插入插入符号所在的四个空格。这就是问题所在。我会展示代码,但我不确定我做错了什么。我希望它在插入符号之前将四个空格添加到文本中,然后在插入符号之后添加所有文本。这是代码:

var insertTabAtCaret = function(id){
   if(event.keyCode === 9){
       event.preventDefault();
       var box = document.getElementById(id);
       if(box.selectionStart || box.selectionStart == "0"){
           var startPos = box.selectionStart;
           var endPos = box.selectionEnd;
           box.innerHTML.substring(0, startPos) + "    " + box.innerHTML.substring(endPos, box.innerHTML.length);
       }
    }
}

请帮忙!让我知道如何使用上述方法在contentEditable div中实现标记! (我更喜欢它在普通的JavaScript中,但jQuery是允许的。请不要告诉我有关库,插件,扩展等的内容。我不想使用任何这些。)

1 个答案:

答案 0 :(得分:2)



document.querySelector("div").addEventListener("keydown",insertTabAtCaret);

function insertTabAtCaret(event){
   if(event.keyCode === 9){
       event.preventDefault();
       var range = window.getSelection().getRangeAt(0);

       var tabNode = document.createTextNode("\u00a0\u00a0\u00a0\u00a0");
       range.insertNode(tabNode);

       range.setStartAfter(tabNode);
       range.setEndAfter(tabNode); 
        
   }
}

div#editor{
  height: 200px;
  width:80%;
  border: solid
}

<div contenteditable id="editor">
some text
</div>
&#13;
&#13;
&#13;