0

私は and を使用RangeXPATHて、html ファイルの位置を取得、保存、および再構築しています。範囲を再構築するには、私は を使用しdocument.evaluate().singleNodeValueています。問題は、firefox で singleNodeValue が 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 の Web コンソール ( Ctrl+ Shift+ K) はnull、一部のページでは表示され、他のページでは機能します。

ここでセキュリティ/オリジンで奇妙なことが起こっている可能性が最も高いです。スクリプトをページ内で実行していますか、外部リソース (同じドメイン) をロードしていますか、それとも別のドメインからロードしていますか?

実際に aを呼び出す関数を に入れてみて、の代わりにそれを使用してください。たとえば、FireBugを開いて、次の内容を含むこのページで実行します。document.evaluate<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

最後に、わかりました:エラーはこの2行から来ていました

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

そしてnsResolver、Firefoxはxpathを受け入れません。resolverそのため、document.evalute()returnempty setしてからsingleNodeValuereturnしnullます。nsResolver2行を削除して置き換えるnullだけで、今のところすべてうまくいくと思います。エラーが発生している場合は、resolverお知らせください...

于 2013-08-06T05:34:29.953 に答える