0
    var desc;
    $.ajax({
        url: "data/step2.xml",
        dataType: "xml",
        success: function(data){
            $(data).find('date').each(function(){
                var day = $(this).find('day').text();
                var date = $("#txtDate").datepicker("getDate");
                date = (date.getDate()+"-"+date.getMonth()+1+"-"+date.getFullYear());
                if (day==date){
                    $(this).find('availability').each(function(){
                        var prod = $(this).find('product').text();
                        var time = $(this).find('starttime').text();
                        if (prod==label){
                            desc="!";
                        }
                    });
                }
            });
        }
    });

変数へのアクセスに問題がありdescます... でわかるように値を操作したいのですがdesc="!"、未定義が返されます。変数をグローバルにする方法はありませんか?またはそれにアクセスする他の方法はありますか?...ああ、このコードはすべて関数内にあります。

4

2 に答える 2

2

この特定のケースでは、問題はdesc変数のスコープではありません。コールバックで操作するdesc変数successは、ajax 呼び出しの前に宣言されたものと同じです。

ここで問題になるのはタイミングです。メソッドは、successajax 呼び出しが行われると同時に実行されません。ajax 呼び出しが完了すると、しばらくしてから実行されます。その時点でのみ値が に書き込まれdescます。値を処理するコードは、値が設定さdescれた時点から呼び出す必要がありますdesc

if (prod == labe) { 
  desc = "!";
  onDescChanged();
}
于 2013-03-01T18:24:39.227 に答える
0

あなたのコードは次のようなことを試みていると思います:

function foo() {
    var desc;
    $.ajax({
        ....
        success: function() {
            ...
            desc = "!";
        }
    });
    return desc; // this will return undefined, as success() hasn't completed
}

これに対抗するには、JaredPar の回答のようにコールバック関数を使用します。

于 2013-03-01T18:29:41.417 に答える