0

How can be read the actual cursor position inside an editable td cell (contenteditable="true"), from the function handling the "onkeypress" event?

I am looking for something similar to the "selectionStart" property when clicking somewhere inside a text input field.

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
RickyTad
  • 281
  • 1
  • 3
  • 15
  • Possible duplicate of [contenteditable selection of text not working](https://stackoverflow.com/questions/43138218/contenteditable-selection-of-text-not-working) – rafaelcastrocouto Dec 07 '18 at 13:04

1 Answers1

1

i found an answer on here, hope can help you

function getCaretCharacterOffsetWithin(element) {
      var caretOffset = 0;
      var doc = element.ownerDocument || element.document;
      var win = doc.defaultView || doc.parentWindow;
      var sel;
      if (typeof win.getSelection != "undefined") {
        sel = win.getSelection();
        if (sel.rangeCount > 0) {
          var range = win.getSelection().getRangeAt(0);
          var preCaretRange = range.cloneRange();
          preCaretRange.selectNodeContents(element);
          preCaretRange.setEnd(range.endContainer, range.endOffset);
          caretOffset = preCaretRange.toString().length;
        }
      } else if ((sel = doc.selection) && sel.type != "Control") {
        var textRange = sel.createRange();
        var preCaretTextRange = doc.body.createTextRange();
        preCaretTextRange.moveToElementText(element);
        preCaretTextRange.setEndPoint("EndToEnd", textRange);
        caretOffset = preCaretTextRange.text.length;
      }
      return caretOffset;
    }

    function getCaretPosition() {
      if (window.getSelection && window.getSelection().getRangeAt) {
        var range = window.getSelection().getRangeAt(0);
        var selectedObj = window.getSelection();
        var rangeCount = 0;
        var childNodes = selectedObj.anchorNode.parentNode.childNodes;
        for (var i = 0; i < childNodes.length; i++) {
          if (childNodes[i] == selectedObj.anchorNode) {
            break;
          }
          if (childNodes[i].outerHTML)
            rangeCount += childNodes[i].outerHTML.length;
          else if (childNodes[i].nodeType == 3) {
            rangeCount += childNodes[i].textContent.length;
          }
        }
        return range.startOffset + rangeCount;
      }
      return -1;
    }

    function showCaretPos() {
      var el = document.getElementById("test");
      var caretPosEl = document.getElementById("caretPos");
      caretPosEl.innerHTML = "Caret position: " + getCaretPosition(); //getCaretCharacterOffsetWithin(el);
    }

    document.body.onkeyup = showCaretPos;
    document.body.onmouseup = showCaretPos;

https://codepen.io/neoux/pen/OVzMor

Kent Ng
  • 11
  • 2