【问题标题】:window.getSelection() how to get the current node inside contenteditable javascriptwindow.getSelection() 如何在 contenteditable javascript 中获取当前节点
【发布时间】:2018-07-20 03:15:42
【问题描述】:

我有这个函数可以在 contenteditable 的第一行内正确移动插入符,尽管它只查看 childNodes[0],因此它不会在第二行内移动插入符。

function setcaret(item, pos) {
  var range = document.createRange();
  var sel = window.getSelection();

  range.setStart(item.childNodes[0], pos);
  range.collapse(false);
  sel.removeAllRanges();
  sel.addRange(range);
  item.focus();
}

setcaret(divid, 4); //move caret four places in current line

我需要修改它以获取当前节点,以便它适用于 contenteditable 内的多个 div,就像插入符号在第二个节点内一样

<div contenteditable="true"><div>first child</div><div>second |child</div>

有什么想法吗?

【问题讨论】:

  • 您可以创建一个工作的 sn-p 或一个 JsFiddle 来使用吗?
  • 我对jsfiddle不太了解,你可能需要点击设置光标位置jsfiddle.net/ydx5a0qz/5

标签: javascript contenteditable getselection


【解决方案1】:

不幸的是,这并不容易......

为此,我们必须自己确定给定索引处的字符属于哪个节点。为此,我们需要遍历容器的子节点。

这个操作可以通过TreeWalker 大大简化,设置为只迭代TextNodes:

// this method will allow us to get the TextNode at character index
function getNodeAtCharPos(parent, pos) {
  var walker = document.createTreeWalker(parent, NodeFilter.SHOW_TEXT);
  var chars = 0;
  var nodeLength = 0;
  while (chars < pos && walker.nextNode()) {
    nodeLength = walker.currentNode.textContent.length;
    chars += nodeLength;
  }
  return {
    node: walker.currentNode,
    index: Math.min(pos - (chars - nodeLength), nodeLength)
  };
}

function setcaret(item, pos) {
  if (pos < 0) return;
  var nodeAtPos = getNodeAtCharPos(item, pos);
  var range = document.createRange();
  var sel = window.getSelection();
  range.setStart(nodeAtPos.node, nodeAtPos.index);
  sel.removeAllRanges();
  sel.addRange(range);
}
var divid = document.getElementById('divid');
btn.onclick = e => setcaret(divid, inp.value);
<div id="divid" contenteditable="true"><div>first child</div><div>second child</div></div>

<br><label>Offset: <input id="inp" type="number" value="4" min="0"><button id="btn">set caret</button></label>

【讨论】:

  • 谢谢。我希望像 sel.focusNode 这样的东西会起作用。
  • 我希望我能给你更多的选票。它刚刚解决了我的两个主要问题。非常感谢
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2014-12-01
  • 2018-06-21
  • 2019-12-02
相关资源
最近更新 更多