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

Posted

技术标签:

【中文标题】未捕获的 DOMException:无法在“范围”上执行“setStart”:偏移量大于节点的长度【英文标题】:Uncaught DOMException: Failed to execute 'setStart' on 'Range': The offset is larger than the node's length 【发布时间】:2018-06-19 03:42:10 【问题描述】:

下面的代码经常抛出这样的错误

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

var range = document.createRange();
range.setStart(pos.node, pos.position + someNumber);

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);

我正在寻找的是如何在调用 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
;

【问题讨论】:

找到任何解决方案了吗? ***.com/questions/29831188/… 的副本 建议的副本正在尝试设置结束,这是关于设置开始 【参考方案1】:

这是因为我们在父节点中添加标记时添加了两个额外的相邻文本节点。

所以,使用node.normalize 来包装节点。

【讨论】:

以上是关于未捕获的 DOMException:无法在“范围”上执行“setStart”:偏移量大于节点的长度的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 DOMException:无法读取“cssRules”属性

未捕获的 DOMException:无法在“IDBObjectStore”上执行“删除”:事务未处于活动状态

未捕获的 DOMException:无法使用 JQuery 设置“innerHTML”属性

未捕获的 DOMException:无法在“CustomElementRegistry”上执行“定义”:此名称已用于此注册表

iframe chrome:未捕获的 DOMException:无法从“Window”读取“localStorage”属性:此文档的访问被拒绝

如何处理未捕获(承诺)DOMException:播放()请求被暂停()调用中断