4

内容に基づいてテキストをフォーマットするテキスト エディターを作成しようとしています。たとえば、「select」と入力すると、「select」という単語の色が赤に変わります。を使用していcontenteditable divます。

色を変えることはできたのですが、テキストを変えるたびにキャレット(カーソル)が先頭に移動してしまいdivます。

これが私の例です:

var replace = function(text, q, r){
  text=text.split(q);
  var result = text[0];
  for(var i = 1; i < text.length; i++){
    result += r + text[i];
  }
  return result;
};

var run = function(){
  document.getElementById('code_editor').innerHTML
  = replace(document.getElementById('code_editor').textContent, "select", "<span class='start'>select</span>"); 
}
$('#code_editor').keyup(function (event) {
  run();
});
#code_editor {
  width: 600px;
  height: 100px;
  box-shadow: inset 0px 0px 2px black;
  padding: 5px;
  overflow-y: scroll;
}
.start {
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<code><div id="code_editor" contenteditable tabindex="1"></div></code>

http://jsfiddle.net/wgw8ssL6/

4

1 に答える 1

0

もう答えが必要かどうかはわかりませんが、とにかく答えます。したがって、アプローチは、divのテキストを更新した後にキャレットの位置を更新することです。

var replace = function(text, q, r){
  text=text.split(q);
  var result = text[0];
  for(var i = 1; i < text.length; i++){
    result += r + text[i];
  }
  return result;
};

var run = function(){
  document.getElementById('code_editor').innerHTML
  = replace(document.getElementById('code_editor').textContent, "select", "<span class='start'>select</span>"); 
placeCaretAtEnd(document.getElementById('code_editor')); //Function invoke
}
/*Function to place caret at end*/
function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != "undefined"
            && typeof document.createRange != "undefined") {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != "undefined") {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
    console.log("[placeCaretAtEnd updated]");
}
$('#code_editor').keyup(function (event) {
  run();
});
#code_editor {
  width: 600px;
  height: 100px;
  box-shadow: inset 0px 0px 2px black;
  padding: 5px;
  overflow-y: scroll;
}
.start {
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<code><div id="code_editor" contenteditable tabindex="1"></div></code>

関数のクレジット

于 2017-08-11T07:24:13.693 に答える