在多个节点上创建范围

Creating a range over multiple nodes

本文关键字:创建 范围 节点      更新时间:2023-09-26

我正试图使用coffeescript/javascript创建一个范围,当用户滚动某些文本时,该范围会返回几句文本。偏移量向后移动了40个位置,但这有时意味着要进入前一个节点。我该如何正确地实现这一点?

我所拥有的(只要我不离开节点就可以工作):

//expanding a previously defined range
new_start = range.startOffset- 40
startNode = range.startContainer
range.setStart(startNode, new_start)
try
  new_end = range.startOffset + 60
  range.setEnd(startNode, new_end)
catch e
  range.setEndAfter(startNode) 

正如你所看到的,我的代码不是很好,做了很多假设,所以当涉及到转换这些节点时,有人可以引导我朝着正确的方向前进,我会非常高兴。

标记示例(这很可怕):

<div id="content"><p>
    <strong>Title Stuffs<br>
     Yep, a random break<br>
     yes, another!</strong>
</p>
<p>
    <a href="http://internet.co">http://itnernet.co</a>
</p>
<br>
<table>
<tbody>
<tr>
    <td>
        <img src="someimage">
    </td>
</tr>
</tbody>
</table>
<p>
    <br>
     Blah blah blah<br>
     <br>
     more words, going to stop here. you get the idea.
</p></div>

这个问题是我之前一个问题的后续问题。

此行之后:

new_start = range.startOffset- 40

检查new_start是否为负数,如果为负数,则将其设置为零

new_start = range.startOffset - 40;
if(new_start < 0)
    new_start = 0;

这就是你目前的问题。不过,你确实有另一个问题。您的末尾也可能溢出当前文本。因此,您应该检查endOffset < selection.extentNode.length