1

このコードは、xml ファイルを取り込んで解析し、テーブルとして出力します。これがコードの一部です(Firefox向け):

function viewXML(inputForm) {
        var URL=inputForm.URL.value;    //input XML URL

        // create document and load URL     
        var xmlDoc = document.implementation.createDocument("","doc",null);
        xmlDoc.load(URL);

        xmlDoc.onload = generateHTML(xmlDoc);
        hWin = window.open("","sth", "height=800,width=600");
        hWin.document.write(html_text);
        hWin.document.close();
    }

viewXML は、ボタンの onClick 関数です。コードの一部generateHTML():

function generateHTML(xmlDoc) {
    ...
    caption=xmlDoc.getElementsByTagName("title").item(0).firstChild.nodeValue;  //<1>
    html_text += "<caption align='left'><h1>" + caption + "</h1></caption>";
    ...
}

XML ファイルの一部:

<catalog>
    <title>Airbus_Aircraft_Families</title>
    <aircraft>
        <Airbus>A380</Airbus>
        <Aircraft>A380</Aircraft>
        <seats>555</seats>
        <Range>15000km</Range>
        <Wingspan>78.8m</Wingspan>
        <Height>24.1m</Height>
    </aircraft>
</catalog>

問題: このコードは、Firebug で段階的にデバッグ モードで実行すると正常に動作します。しかし、ブレークポイントが設定されていない場合、プログラムが行 <1> に到達すると、次のようなエラーが表示されます: xmlDoc.getElementsByTagName("title").item(0) is nullであり、明らかに正しくありません。

そして興味深いことに、行を追加しようとすると

alert(xmlDoc.getElementsByTagName("title").length)

<1> 行の前に 0 を示すウィンドウがポップアップ表示されますが、[OK] をクリックすると、正しいタイトル (XML から) が新しいウィンドウに表示されます! ステップバイステップモードのように。

私が試したこと:

1、にxmlDoc.getElementsByTagName("title").item(0)変更xmlDoc.getElementsByTagName("title")[0]

機能しませんでした。デバッガーから「xmlDoc.getElementsByTagName("title")[0] は未定義です」と表示されました

2、XML ファイルのタグ内またはタグ間のすべての空白を削除しましたが、役に立ちませんでした。

4

1 に答える 1

0

この問題は、ドキュメントが非同期的に読み込まれていることが原因である可能性があります。ここでdocument.asyncプロパティを確認できます。このプロパティを false に設定すると、コードが機能すると思います。

// create document and load URL
var xmlDoc = document.implementation.createDocument("","doc",null);
xmlDoc.async = false;
xmlDoc.onload = generateHTML(xmlDoc);
xmlDoc.load(URL);

load 関数の呼び出しの前に、イベント ハンドラを load event にアタッチする行を移動したことに注意してください。

于 2012-09-28T06:52:49.960 に答える