0

「first.xml」を解析する必要があり、この解析関数内で、「first.xml」のすべての要素に対して「second.xml」を解析する必要があります。「first.xml」の解析が完了するまで、jQuery は「second.xml」を解析しないようです。

私の HTML ファイルには、コンテンツが追加される div があります。

<div id="Content"></div>

このコード全体が $(document).ready(function({}); 内に埋め込まれています。

function parseXML(xmlFilePath, callback){
    $.ajax({
        type: "GET",
        url: xmlFilePath,
        dataType: "xml",
        success: function(xml) {
            callback(xml);
        }
    });
}

parseXML("first.xml", function(returnedXML){
    $(returnedXML).find("ElementA").each(function(counter) {

        name_of_Attribute_of_Element_A = $(this).attr("name");
        $("#Content").append(counter  + ". " + name_of_Attribute_of_Element_A);

        $("#Content").append("------ before parsing second.xml ------");

        parseXML("second.xml", function(returnedXML){
            $(returnedXML).find("ElementB").each(function() {
                name_of_Attribute_of_Element_B = $(this).attr("name");
                $("#Content").append(name_of_Attribute_of_Element_B);
            });
        });


    });

});

私の出力は次のようになります。

1. name_of_Attribute_of_Element_A
------ before parsing second.xml ------
2. name_of_Attribute_of_Element_A
----- before parsing second.xml ------
3. name_of_Attribute_of_Element_A
----- before parsing second.xml ------
name_of_Attribute_of_Element_B
name_of_Attribute_of_Element_B
name_of_Attribute_of_Element_B

それ以外の:

1. name_of_Attribute_of_Element_A
------ before parsing second.xml ------
name_of_Attribute_of_Element_B
2. name_of_Attribute_of_Element_A
----- before parsing second.xml ------
name_of_Attribute_of_Element_B
3. name_of_Attribute_of_Element_A
----- before parsing second.xml ------    
name_of_Attribute_of_Element_B

また、出力を連結して、最後に一度だけ追加しようとしました。これは、代わりに

$("#Content").append(result);

利用した

myHTMLOutput = myHTMLOutput + result;

そして、私が使用した私の文書の最後に

$("#Content").append(myHTMLOutput);

一度行ったけど同じ結果でした。

jQquery は、Ajax を使用した XML ファイルの複数の解析を許可していないのでしょうか? もしそうなら、最初のファイルの解析を中断し、2 番目のファイルの解析を終了し、最初のファイルの解析を再開するオプションはありますか?

奇妙な詳細: JetBrains Webstorm を使用してコードをデバッグすると、ステップごとの出力は正しくなります。通常実行した場合のみ、「first.xml」の後に「second.xml」の出力が追加されます。

ご協力いただきありがとうございます。

4

2 に答える 2

0

あなたが遭遇している基本的な問題は、ajaxの「A」....「非同期」です。最初のxmlloppは、すべてのデータが2次呼び出しから受信される前に実行されます。

これは、配列に格納されたjQueryの遅延を使用するソリューションです。コンテンツは、到着時にオブジェクトに保存されます。各Aアイテム内の一部のBアイテムが故障している可能性はありますが、Bは常に正しいAになります。

コンセプトは$.when( B ).done()内部$.when( A ).done()にネストされ、その時点でコンテンツオブジェクトをDOMに解析します。

フィドルの要件のために$.postを使用します

デモ:http://jsfiddle.net/Dt75U/

/* store all ajax content in object*/
var content = {};

function parseContent(content) {
    $.each(content, function() {
        $('body').append('<br><br>' + this.a + '<br>' + this.b.join('<br>'));
    })
}
/* array to store nested ajax promises */
var deferreds_b = [];
/* A promise and ajax*/    
var xml_A = $.post("/echo/xml/", {
    xml: a
}, function(returnedXML) {

    var $el_A = $(returnedXML).find("ElementA");
    var total_A = $el_A.length;
    $el_A.each(function(counter) {
        var countA = counter;
        var name_of_Attribute_of_Element_A = $(this).attr("name");
        /* create EL A object , store EL A content, create array to push B content to */
        content[countA] = {
            a: countA + ". " + name_of_Attribute_of_Element_A,
            b: []
        }

        var xml_B = $.post("/echo/xml/", {
            xml: b
        }, function(returnedXML) {

            var $el_B = $(returnedXML).find("ElementB");
            var total_B = $el_B.length;
            $el_B.each(function(idx) {
                var name_of_Attribute_of_Element_B = $(this).attr("name");
                content[countA].b.push(countA + ". " + name_of_Attribute_of_Element_B);
            });
        });
    /* push B promise to array*/
        deferreds_b.push(xml_B);


    });
});

$.when(xml_A).done(function() {
    /* when A is done , wait for B to be done*/
    $.when.apply(null, deferreds_b).done(function() {
        parseContent(content);
        $("body").append("<p>All done!</p>");
    });

})
于 2012-06-20T00:49:04.007 に答える
0

each()問題はとにあると思いますfind()。2 番目の ajax 呼び出しが完了するまでに時間がかかる間、すべての "ElementA" をループします (1 番目の xml は既に完了しているため高速です)。したがって、最初の xml の要素が表示され、second.xml の ajax が起動されますが、ajax の往復に時間がかかるため、後で取得します。

考えられる解決策は、別のロジックです。

parseXML("first.xml", firstCallback);

var counter = 0;
var max;

function firstCallback(xml)
{
    var a = $(xml).find("ElementA");
    max = a.length;
    // do something with elements of first.xml
    readSecond();
}

function readSecond(xml)
{
    // do something with elements of second.xml
    if (counter==max) return;
    parseXML("second.xml",readSecond);
    counter++;
}

私はこのコードをテストしていませんが、うまくいくことを願っています。

于 2012-06-19T22:44:09.763 に答える