问题 当我只知道字符偏移时,如何创建范围对象?


所以我有一个包含一个文本块的div,之前用户已经在这个块中选择了一些文本,我从这个选择中创建了一个范围对象。我存储了所选文本的起点和终点的偏移量,但是我在重新创建范围时遇到了问题(所以我可以操纵它)。 “quotables”是包含所有文本的div。我不知道我做错了什么。



    var theRange = rangy.createRange();
    var node = $('.quotables').html();
    theRange.setStart(node, 14);
    theRange.setEnd(node, 318);


但我不断收到错误: 未捕获错误:NOT_FOUND_ERR:DOM异常8
m.setStart
  (匿名功能)
  d.extend._Deferred.f.resolveWith
d.d.extend.ready
d.c.addEventListener.y


10040
2017-08-04 03:11


起源

你有没有找到解决这个问题的好方法?我试图递归迭代文本节点并计算字符,我觉得我差不多...... - Mike Turley


答案:


范围边界不是HTML的字符串表示形式中的字符偏移量。相反,它是DOM节点内的偏移量。例如,如果节点是文本节点,则边界表示为节点文本内的字符偏移。如果节点是元素,则表示为边界之前的节点的子节点数。例如,在以下HTML中,使用其边界由其表示的Range |

<div id="test">foo|bar<br>|<br></div>

...范围的起始边界位于文本节点中的偏移3处,该节点是该节点的第一个子节点 <div> 元素,而结束边界位于偏移2内 <div>,因为有两个子节点(文本节点“foobar”和一个 <br> 元素)位于边界之前。您将以编程方式创建范围,如下所示:

var range = rangy.createRange(); // document.createRange() if not using Rangy
var div = document.getElementById("test");
range.setStart(div.firstChild, 3);
range.setEnd(div, 2);

15
2017-08-04 10:34



有没有办法以编程方式“弄清楚”在文本的字符串表示中给定字符偏移量时,您需要哪些起始节点和结束节点以及相对偏移量? - Mike Turley
@MikeTurley:这个答案可能会有所帮助: stackoverflow.com/a/5596688/96100 - Tim Down