我可以在Rangy的XPath中找到选择开始和结束的值吗?

时间:2015-11-11 11:39:48

标签: javascript html xpath rangy

我正在尝试获取p中的选择范围,但是例如,如果我选择单词“Otto-von-Guericke”,rangy.toCharacterRange(内容)将返回与我想要的值不同的值。 我在加载文档时在p中添加了跨度,并且我在XPath文本中获得了chars数量的范围值。

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

Otto-Von-Gutricke开始:218结束235 by range.toCharacterRange(内容)。我想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);

我是否可以使用Rangy的范围值,相对于XPath文本而不是html?

1 个答案:

答案 0 :(得分:0)

现在我通过创建此函数来解决问题,它会计算更改的字符数。

/**
 * 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;
}