我能用Rangy找到与XPath相关的选择的开始和结束的值吗

Can I find value of start and end of a selection respect to the XPath with Rangy?

本文关键字:开始 选择 结束 Rangy XPath      更新时间:2023-09-26

我试图在p中获取一个选择的范围,但例如,如果我选择单词"Otto von Guericke",rangy.toCharacterRange(content)返回的值与我想要的值不同。当我加载文档时,我在p中添加跨度,并在XPath文本中获得按字符数排列的range值。

Andreas Nürnberger通过计算xpath文本中的字符开始:201结束:219。

Otto Von Gutricke start:218 end 235 by range.toCharacterRange(content)。我假设Rangy计算html字符,html会自动从XPath文本中删除一些空格区域。

现在,如果我存储Rangy找到的范围Otto Von Gutricke的值,当我再次加载文档时尝试添加相对跨度时,开始时间超过前一个跨度,结束时间超过前2个字符。我认为这是因为加载时的位置对XPath文本是真实的。

HTML

<p class="blue">
    <span id="form1_table3_tr1_td1_table5_tr1_td1_table1_tr1_td2_p2" class="hasAuthor">Joeran Beel</span>
     and 
    <span id="form1_table3_tr1_td1_table5_tr1_td1_table1_tr1_td2_p2" class="hasAuthor">Stefan Langer</span>
    <br> 
    Docear, Magdeburg, Germany
    <br>
    {beel, langer}@docear.org
    <br>
    <br>
    <span id="form1_table3_tr1_td1_table5_tr1_td1_table1_tr1_td2_p2" class="hasAuthor">Bela Gipp</span>
    <br>
    University of California Berkeley, USA &amp; National Institute of Informatics, Tokyo, Japan
    <br>
    gipp@nii.ac.jp
    <br>
    <br>
    <span id="form1_table3_tr1_td1_table5_tr1_td1_table1_tr1_td2_p2" class="hasAuthor">Andreas Nürnberger</span>
    <br>
    Otto-von-Guericke University, Magdeburg, Germany
    <br>
    andreas.nuernberger@ovgu.de
    <br>
    <br>
    <span id="form1_table3_tr1_td1_table5_tr1_td1_table1_tr1_td2_p2" class="hasDOI">doi:10.1045/november14-beel</span>
</p>

Javascript

var parentNode = selection.anchorNode.parentNode;
var range = selection.getRangeAt(0);
var rangeOffsets = range.toCharacterRange(parentNode);

对于XPath文本而不是html,我可以使用Rangy获得range的值吗?

现在我通过创建这个函数解决了这个问题,它计算更改了多少字符。

/**
 * getDifferenceOfNumberOfChars return number of chars of difference
 * @param  {[int]} start         start by rangy
 * @param  {[HTML Object]} node  node
 * @param  {[string]} text       text of selection
 * @return {[int]}               number of chars of difference
 */
 function getDifferenceOfNumberOfChars(start, node, text) {
    var difference = 0;
    var stringOfTextNode;
    var endOfSelection = start + text.length; 
    var substringOfText = node.textContent.substring(start, endOfSelection);
    while ((substringOfText.indexOf(text) == -1) && (substringOfText.indexOf(text) != 0)) {
            difference++;
            start++;
            endOfSelection++;
            substringOfText = node.textContent.substring(start, endOfSelection);
    }
    return difference;
}