5

私は JavaScript の専門家ではありません。インターネットでこれを長い間検索しているのを見てきました。

別の関数から変数を取得する際に問題があります。私のコードは次のようになります。

var variabeltje;
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
  }
);
alert(window.variabeltje);

変数variabeltjeは、データから情報を取得する必要があります。アラートを下に置くとvariabeltje=data機能しますが、関数の後にデータ変数が必要です。

編集:

私はそれを人々が言っ​​たことに変更しました、私は今これを持っています:

                var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()});
                XHR.done(function(data) {
                    console.log(data); 
                    getData(data);
                }); 

                function getData(data) {
                if(data == 'true') {
                    alert(data);
                    $(this).unbind('keypress');
                    $(this).html($(this).find('input').val());
                }
                }

しかし、今 $(this) は関数に渡されていません。どうすればこれを解決できますか?

4

3 に答える 3

4

非同期であるため、データはajax呼び出しが完了した後にのみ利用可能になります。そのため、コードを変更してそれを処理し、ajaxが完了するまで待つ必要があります。

var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()});

XHR.done(function(data) {
    console.log(data);
});

または他の機能で:

function XHR(time){
   return $.post('js/ajax/handle_time.php', {time: time});
}

function doStuff(element) {
    XHR($(element).find('input').val()).done(function(data) {
        console.log(data);
    });
}

編集:

あなたの編集に基づくと、それはスコーピングの問題のようです:

var self = this,
    XHR = $.post('js/ajax/handle_time.php', {time: $(self).find('input').val()});

XHR.done(function(data) {
    console.log(data); 
    getData(data);
}); 

function getData(data) {
    if(data == 'true') { //normally you'd try to pass true as a boolean, not string
      alert(data);
      $(self).unbind('keypress').html($(self).find('input').val());
    }
}
于 2012-10-30T13:11:02.807 に答える
2

これは、$.post メソッドが非同期で実行されるためです。

SOでこの質問を見てください。

編集: コードを変更して、post メソッドの後の部分を、成功時にトリガーされる匿名関数の本体内に配置できます。次のように:

$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
    alert(window.variabeltje); // or whatever function you need to call, call it here...
  }
);
于 2012-10-30T13:01:48.513 に答える
1

問題は、postメソッドが非同期で実行されることです。つまり、投稿はサーバーに送信されますが、実行フローは続行されるため、投稿がまだ返されていないため、アラートは設定されていない値にアクセスしようとしています。

ajax同期実行が必要な場合は、メソッドを使用できます。

于 2012-10-30T13:01:31.640 に答える