evaluate()。singleNodeValue在Firefox中返回null

时间:2013-08-05 13:17:47

标签: javascript html xpath range

我正在使用RangeXPATH来检索,保存和重建html文件中的位置。要重建范围,我正在使用document.evaluate().singleNodeValue,问题是singleNodeValue在firefox上返回null,它在chrome上运行良好。知道为什么吗?在这里我的代码:

fonction rebuildRange(xpath){

    var selectionDetails = xpathh;
    selectionDetails = selectionDetails.split(/\|/g);
    var range = oDoc.createRange();
    var selectionDetails0 = selectionDetails[0];
    selectionDetails0 = selectionDetails0.replace(/\//g, "/h:");
    selectionDetails0 = selectionDetails0.replace("h:t", "t");
    var selectionDetails2 = selectionDetails[2];
    selectionDetails2 = selectionDetails2.replace(/\//g, "/h:");
    selectionDetails2 = selectionDetails2.replace("h:t", "t");

    range.setStart(oDoc.evaluate(selectionDetails0, oDoc, nsResolver, 9, null).singleNodeValue, Number(selectionDetails[1]));
    range.setEnd(oDoc.evaluate(selectionDetails2, oDoc, nsResolver, 9, null).singleNodeValue, Number(selectionDetails[3]));
}

2 个答案:

答案 0 :(得分:1)

Testcase here适用于Chrome和FireFox

var x = document.evaluate("/html/body", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
console.log(x.singleNodeValue);

但是,从FireBug尝试相同的操作不会,FireFox中的Web控制台( Ctrl + Shift + K )会给出{{ 1}}在某些页面上,并在其他页面上工作。

这里的安全/起源很可能是奇怪的事情;你是在页面中运行脚本,加载外部资源(相同域)还是从其他域加载?

尝试将功能放在null的{​​{1}}中实际调用document.evaluate,然后使用{em>功能代替<script>。例如打开 FireBug 并在this page上运行<head>document.evaluate

中包含以下内容
de('/html/body').singleNodeValue;

答案 1 :(得分:0)

最后,我明白了:错误来自这两行

selectionDetails0 = selectionDetails0.replace(/\//g, "/h:");
selectionDetails0 = selectionDetails0.replace("h:t", "t");

nsResolver,firefox不接受带有resolver的xpath,这就是document.evalute()返回empty set然后singleNodeValue返回null的原因。 我只是删除了这两行,并将nsResolver替换为null,现在每个人都认为工作正常,如果有人看到没有resolver的错误,请告诉我...