javascriptjquerycontenteditablecaretcursor-position

How to set the caret (cursor) position in a contenteditable element (div)?


I have this simple HTML as an example:

<div id="editable" contenteditable="true">
  text text text<br>
  text text text<br>
  text text text<br>
</div>
<button id="button">focus</button>

I want simple thing - when I click the button, I want to place caret(cursor) into specific place in the editable div. From searching over the web, I have this JS attached to button click, but it doesn't work (FF, Chrome):

const range = document.createRange();
const myDiv = document.getElementById("editable");
range.setStart(myDiv, 5);
range.setEnd(myDiv, 5);

Is it possible to set manually caret position like this?


Solution

  • In most browsers, you need the Range and Selection objects. You specify each of the selection boundaries as a node and an offset within that node. For example, to set the caret to the fifth character of the second line of text, you'd do the following:

    function setCaret() {
      const element = document.getElementById("editable")
      const range = document.createRange()
      const selection = window.getSelection()
        
      range.setStart(element.childNodes[2], 5)
      range.collapse(true)
        
      selection.removeAllRanges()
      selection.addRange(range)
    }
    <div id="editable" contenteditable="true">
      text text text<br>text text text<br>text text text<br>
    </div>
    
    <button id="button" onclick="setCaret()">focus</button>