web-dev-qa-db-ja.com

jQuery.ajax成功コールバック関数は実行されません

JavaScript Ajax呼び出し(jQuery.ajax)があり、成功コールバック関数を実行しません。

$.ajax({
        url: target,
        contentType: 'application/json; charset=utf-8',
        type: 'POST',
        // type: 'GET',
        dataType: 'jsonp',
        error: function (xhr, status) {
            alert(status);
        },
        success: function (result) {
            alert("Callback done!");
            // grid.dataBind(result.results);
            // grid.dataBind(result);
        }
    });

Firebugでは、リクエストが投稿され、jsonに関して正しい結果が期待どおりに返されることがわかりました。なにが問題ですか?

26

多くの場合、私は同様の問題に遭遇しましたが、ほとんどの場合、理由は不正なjsonでした。結果をテキストデータ型として取得して、これが問題かどうかを確認してください。

また、「&jsoncallback =?」などのパラメーターを使用しているかどうかを尋ねたいと思います。データ型は単純なjsonではなくjsonpであるため、URLで。

50
Cagdas

$.ajaxを使用したdataType: 'jsonp'呼び出しは、次のシナリオで機能します。

  1. ページの同じドメインでURLを呼び出しています。
  2. callback をサポートするページのドメインからURLを呼び出しています

これらの2つのケースに当てはまらない場合、クロスサイトXmlHttpRequest呼び出しを行うことができないため、何もできません。

6
systempuntoout

これは古い質問ですが、私は人々がまだこれにぶつかっていると思います。

私はこれをしばらくの間戦ったが、最終的にはあきらめ、延期モデルに移行した。 (私はjQueryを十分に長い間使用してきたので、「古い」方法の習慣がまだありました...)遅延モデルに移行するとすぐに、物事が機能し始めました。古い方法がうまくいかなかった理由はわかりませんが、気にしません。 (この質問は、新しいモデルより前のものです。)

cf. https://stackoverflow.com/a/14754681/199172

2
MikeBaz - MSFT

Asyncプロパティをfalseに設定する必要があります。

$.ajax({
        url: target,
        contentType: 'application/json; charset=utf-8',
        type: 'POST',
        // type: 'GET',
        dataType: 'jsonp',
        async = false,
        error: function (xhr, status) {
            alert(status);
        },
        success: function (result) {
            alert("Callback done!");
            // grid.dataBind(result.results);
            // grid.dataBind(result);
        }
    });
1
Thanh Nguyen

これは同僚の1人に起こったばかりなので、ソリューションも追加すると思います。

Ajax呼び出しが行われ、Fiddlerで適切な応答が返されることは確認できました(ステータス200 /完全に有効なJSON)が、エラー、成功、または完全なコールバックにヒットすることはありません。 async:falseをajax呼び出しに追加すると機能しますが、実際には適切な解決策ではありませんでした。さらに、ajax呼び出しの直後に(async:falseを使用せずに)アラートを配置し、アラートが表示されてから数秒間待機すると、何らかの形でajaxコールバックが機能するようになります。本当に奇妙な...

結局のところ、ajax呼び出しを使用した関数はtype = "submit"の入力にバインドされていました。これがこの奇妙な動作の原因でした。入力をtype = "button"に変更すると修正されました。

0
Xorcist