0

我正在使用RangeandXPATH来检索、保存和重建 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]));
}
4

2 回答 2

1

这里的测试用例在 Chrome 和 FireFox 中对我有用

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

但是,在 FireBug 中尝试相同的操作没有任何效果,并且 FireFox ( Ctrl++ Shift)中的 Web 控制台在某些页面上K提供null并在其他页面上工作。

这里的安全/起源很可能发生了一些奇怪的事情;您是在页面内运行脚本、加载外部资源(相同域)还是从不同域加载?

尝试将一个实际调用的函数放入document.evaluatea并使用它而不是. 例如,打开FireBug并在此页面上运行,其中包含以下内容<script><head>document.evaluatede('/html/body').singleNodeValue;<head>

function de(xp) {
    return document.evaluate(xp, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
}
于 2013-08-05T13:38:30.677 回答
0

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

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

nsResolver, firefox 不接受 xpath with resolver,这就是为什么document.evalute()returnempty set然后singleNodeValuereturn null。我只是删除这两行并替换nsResolver为,null并且每个想法都很好,现在,如果有人看到错误,resolver请告诉我......

于 2013-08-06T05:34:29.953 回答