jqueryでAjaxの質問です。


$('selector').on("click",
function(){
$.get("hoge.php", {num: num},
function(xmlhttpreq){
modorich = なんか処理(xmlhttpreq);
}
);
$(this).animate({left: 0},
complete:function(){
var hensu = modorich;
}
);
}
);

で、上記の$.getで取得したmodorich を抜けた後のhensuに入れたいのですが、
どうすれば入りますか?
returnとかを使うのでしょうか。
ちなみに$.getのfunction内に入れる、というのはなしでお願いします。

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2013/05/24 04:13:32
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Lhankor_Mhy No.3

回答回数814ベストアンサー獲得回数232

ポイント100pt

Defferedオブジェクトを使うといいですよ。
↓サンプル
http://jsfiddle.net/aNaS3/

他4件のコメントを見る
id:Lhankor_Mhy

いろいろ整理した結果、こうなりました。すっきり。
http://jsfiddle.net/aNaS3/3/

2013/05/23 18:03:59
id:khaie

仕組みがまだよくわかりませんが、when、thenでできました。
ありがとうございます。

2013/05/24 04:12:53

その他の回答2件)

id:dawakaki No.1

回答回数797ベストアンサー獲得回数122

functionの全体がわからないですが、modorichをグローバル変数にして、こんな感じで渡せると思います。

$('selector').on("click",
 function(){
 var modorich;
 $.get("hoge.php", {num: num},
 function(xmlhttpreq){
 modorich = なんか処理(xmlhttpreq);
 }
 );
 $(this).animate({left: 0},
 complete:function(){
 var hensu = modorich;
 }
 );
 }
 );
id:khaie

これではhensuはundefinedになってしまいます。

2013/05/23 14:34:48
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

変数の代入がどうとか言うことではなく、Ajax が非同期で動作するから「値が渡らない」みたいになってるんです。
同期モードでリクエストを出す必要があります。

$('selector').on("click",
    function(){
        var modorich;
        $.ajax({
                url: "hoge.php",
                type: "GET",
                async: false,
                data: "num=" + num,
                success: function(xmlhttpreq){
                    modorich = なんか処理(xmlhttpreq);
                }
            }
            );
        $(this).animate({left: 0},
            complete:function(){
                var hensu = modorich;
            }
        );
    }
);

関連するマニュアルは、これ。
http://api.jquery.com/jQuery.ajax/

ちなみに$.getのfunction内に入れる、というのはなしでお願いします。

どのような事情で、この制約が付いているのか分かりませんが、変数のスコープとか、処理のタイミングとかについてきちんと理解できるまでは、みんなと同じ書き方をするようにした方が良いですよ。

$('selector').on("click",
    function(){
        var obj = $(this);
        $.get("hoge.php", {num: num},
            function(xmlhttpreq){
                var modorich = なんか処理(xmlhttpreq);
                obj.animate({left: 0},
                    complete:function(){
                        var hensu = modorich;
                    });
            }
        );
    }
);
id:khaie

やはり同期の部分ですよね。
実際は全体としてはアニメーションを表現しているので、
同期待ち?をしたくなかったのです。

$.ajax($.get)の中のcomplete(success) function の中で$(this)を使いたかったのですが、parent、先祖子孫?等を使っても辿れません。
"click"された"this"が存在しない気が・・・

↑の"selector"がajax後のfunctionでthis系で表現できれば、
それでもOK回答とします。

2013/05/23 14:42:34
id:a-kuma3

$.ajax($.get)の中のcomplete(success) function の中で$(this)を使いたかったのですが、parent、先祖子孫?等を使っても辿れません。
"click"された"this"が存在しない気が・・・

↑の"selector"がajax後のfunctionでthis系で表現できれば、
それでもOK回答とします。

そんな気もしたので、ふたつ目に書いたソースでは、

  • onclick のハンドラで、$(this) を、変数 obj に入れる
  • $.get の success では、クリックされた要素 (の jQuery オブジェクト) として obj を使う

というふうにしてあります。

クリックするものがたくさんあるのだったら、クリックされた要素はクロージャのスコープに入れておいた方が良いかも。
こんな感じ。

$('selector').on("click",
    function(){
        var f = (function() {
                    var obj = $(this);
                    return function(xmlhttpreq) {
                            var modorich = なんか処理(xmlhttpreq);
                            obj.animate({left: 0},
                                complete:function(){
                                    var hensu = modorich;
                                });
                        }
                })();
        $.get("hoge.php", {num: num}, f);
    }
);
2013/05/23 15:10:37
id:Lhankor_Mhy No.3

回答回数814ベストアンサー獲得回数232ここでベストアンサー

ポイント100pt

Defferedオブジェクトを使うといいですよ。
↓サンプル
http://jsfiddle.net/aNaS3/

他4件のコメントを見る
id:Lhankor_Mhy

いろいろ整理した結果、こうなりました。すっきり。
http://jsfiddle.net/aNaS3/3/

2013/05/23 18:03:59
id:khaie

仕組みがまだよくわかりませんが、when、thenでできました。
ありがとうございます。

2013/05/24 04:12:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません