我正在尝试获取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 & 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?
答案 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;
}