未捕获的 DOMException:无法在“Range”上执行“setStart”:偏移量大于节点的长度

Gle*_*rce 7 javascript tree range nodes

下面的代码经常抛出一个错误,读取

未捕获的 DOMException:无法在“Range”上执行“setStart”:偏移some integer量大于节点的长度 ( some smaller integer)。

var range = document.createRange();
range.setStart(pos.node, pos.position + someNumber);
Run Code Online (Sandbox Code Playgroud)

pos 设置如下:

getTextNodeAtPositionAndReturnEndOfContextIfNeeded = function(root, index){
  var lastNode = null;
  var nodeCount = 0;
  var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, function next(elem) {
    nodeCount++;
    if(index > elem.textContent.length){
      index -= elem.textContent.length;
      lastNode = elem;
      return NodeFilter.FILTER_REJECT;
    }
    return NodeFilter.FILTER_ACCEPT;
  }, true); //true was added as a parameter to satisfy ie, but I haven't determined if it still works in other browsers, seems fine in Chrome so far.
  var c = treeWalker.nextNode();
  return {
    node: c ? c : root,
    position: c ? 0 : nodeCount
  };
}

var pos = getTextNodeAtPositionAndReturnEndOfContextIfNeeded(context, len);
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是如何在调用 range.setStart 之前确定节点的长度,但我不确定从哪里访问它。

我猜我可以添加这样的东西:

return {
  node: c ? c : root,
  position: c ? 0 : nodeCount,
  maxLength: root.length //<-something like this, but I have no idea what to put here
};
Run Code Online (Sandbox Code Playgroud)

小智 1

发生这种情况是因为当我们在父级中添加标记时添加了两个额外的相邻文本节点。

因此,使用node.normalize来包裹节点。