Ajax成功イベントが機能しない


193

登録フォームがあり$.ajax、提出に使用しています。

これは私のAJAXリクエストです:

$(document).ready(function() {
    $("form#regist").submit(function() {
        var str = $("#regist").serialize();
        $.ajax({
            type: 'POST',
            url: 'submit1.php',
            data: $("#regist").serialize(),
            dataType: 'json',
            success: function() {
                $("#loading").append("<h2>you are here</h2>");
            }        
        });
        return false;        
    });
});

私のsubmit1.phpファイルで、データベースにメールアドレスユーザー名のフィールドが存在するかどうかを確認します。ページを更新せずにこれらの値が存在する場合、エラーメッセージを表示したい

これをAJAXリクエストの成功コールバックにどのように追加できますか?


2
成功のコールバックが呼び出されますか?
rahul 2009

2番目の問題について、新しい質問をする必要があります。
マイクライオンズ2015年

回答:


386

結果はおそらくJSON形式ではないため、jQueryがそのように解析しようとすると失敗します。エラーはerror:コールバック関数でキャッチできます。

とにかくその関数にJSONは必要ないようですdataType: 'json'。そのため、行を取り出すこともできます。


14
dataTypeをtextに変更して機能させました。このようにdataType:'text'
Magesh 2012年

私も+1したが、自分のものではないコードでは、サーバーからjsonデータを返すことで解決した
albanx

4
これは、a dataType:が指定されていない場合にも発生する可能性がありますが、url:末尾が.jsonです。
davetapley 2013年

1
$.post供給エイリアスjsonトリガサーバからの実際のJSONことなくデータ・タイプとしてないsuccessコールバック
baldrs

json ajaxリクエストを作成する場合は、mime-typeがapplication / jsonに設定されていることを確認してください。それは私にいくつかの問題を与えました。
Gellweiler 2014

19

問題はすでに解決されていますが、他の人の役に立つことを願ってこれを追加します。

私は間違いをこのような関数を直接使用しようとしました(成功:OnSuccess(productID))。ただし、最初に無名関数を渡す必要があります。

  function callWebService(cartObject) {

    $.ajax({
      type: "POST",
      url: "http://localhost/AspNetWebService.asmx/YourMethodName",
      data: cartObject,
      contentType: "application/x-www-form-urlencoded",
      dataType: "html",
      success: function () {
        OnSuccess(cartObject.productID)
      },
      error: function () {
        OnError(cartObject.productID)
      },
      complete: function () {
        // Handle the complete event
        alert("ajax completed " + cartObject.productID);
      }
    });  // end Ajax        
    return false;
  }

匿名関数をラッパーとして使用しない場合、Webサービスが例外を返してもOnSuccessが呼び出されます。


5
これは、ajax、jquery、ハンドラとは関係ありません。「コード全体をスクリプトタグで囲む必要がある」ということを思い出させるコメントを用意することもできます。説明は誤りです。無名関数で何もラップする必要はありません。名前付き関数は、呼び出す代わりにそれを渡す限り、そうします。さらに、誤解を招く可能性があります。要求が送信される前にOnSuccessが呼び出されるため、Webサービスが何かを返すことと関連付けることは意味がありません。
fdreger 2011年

この回答は役に立ちましたが、私は賛成しませんでした。@ fdregerコメントに従って回答を更新してください。
Ozair Kafray 2015年

15

dataType行を削除しようとしましたが、うまくいきませんでした。コールバックとして「成功」ではなく「完全」を使用して問題を回避しました。IEでも成功のコールバックは失敗しますが、スクリプトが実行されて完了するので、私が気にしているのはそれだけです。

$.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: someData,
    complete: function(jqXHR) {
       if(jqXHR.readyState === 4) {
          ... run some code ... 
       }   
    }        
 });

jQuery 1.5では、次のようにすることもできます。

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});

9
これへのメモです。completeajax呼び出しが成功したかどうかに関係なく常に呼び出されますがsuccess、Webサーバーが200 OKHTTPヘッダーで応答した場合にのみ呼び出されます(すべて問題ありません)。
katalin_2003 2014

10

PHPファイルでJSON形式のデータを生成する前に、テキスト/データを印刷(エコーまたは印刷)していないことを確認してください。これは、-sucessfull 200 OK-が表示されることを説明している可能性がありますが、JavaScriptでまだ成功イベントが失敗しています。Firebugの「Network-Answer」セクションでPOST submit1.phpを確認することにより、スクリプトが受け取っているものを確認できます。


これは本当に私を助けました。私はそれが古い答えであることを知っていますが、それはまさに私が抱えていた問題でした。デバッグ中にechoまたはprint_rを使用して、それらが実際にバグの原因であることを確認します... :)ありがとうございます!
lennyklb 2015

6年後も、この答えで人々を助けています!他にどこを見ればいいのかわからなかったでしょう。
Tania Rascia、2018年

5

コールバックにを入れてalert()successコールされていることを確認してください。

そうでない場合は、サーバーにヒットしても、要求がまったく成功しなかったことが原因です。合理的な原因としては、タイムアウトが発生したか、phpコードの何かが例外をスローしたことが考えられます。

firefox用のfirebugアドオンをインストールしていない場合はインストールし、AJAXコールバックを調べます。応答と、成功(200 OK)応答を受信したかどうかを確認できます。 コールバックに別alert()completeコールバックを配置することもできます。これは必ず呼び出されます。


お返事をありがとうございます。成功イベントでアラートを試行しましたが、機能しませんでした。私はfirefoxのfirebugアドオンを持っていますが、成功(200 OK)応答を受け取っているので問題はありません。phpファイルでエラーがないか、die関数が呼び出されています。firebugでチェックすると、適切な応答が表示されます。「完全なコールバックに別のalert()を置くこともできますが、これを必ず呼び出す必要があります」とはどういう意味ですか?迅速な返信ありがとうございました
コーディングbbq

2
にアラートが表示されない場合successは、成功していません。応答は200 OKなので、Tatuの応答は妥当なように見えますが、さらにトラブルシューティングを行うにcompleteは、リクエストが成功したかどうかに関係なく常に呼び出される別のイベントを使用できます(リクエストが成功したsuccess場合にのみ発生します)。complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund、

3

同じ問題がありました。これjavascriptは、jsonデータを返すときにデータ型を期待するために発生します。しかし、phpでechoまたはprintを使用すると、この状況が発生します。echo関数in phpを使用してデータを返す場合は、単純に削除しdataType : "json"てかなりうまくいきます。


2

有効なJSONを返し、「完全な」コールバックで200の応答を取得し、それをChromeネットワークコンソールで確認できました...しかし、指定していませんでした

dataType: "json"

「受け入れられた答え」とは異なり、一度実行すると、実際に問題が解決しました。


1

私はXMLを使用して、サーバー上のphpからWebページに結果を返していますが、同じ動作をしました。

私の場合の理由は、終了タグが開始タグと一致しなかったことです。

<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <result>
        <status>$status</status>
        <OPENING_TAG>$message</CLOSING_TAG>
    </result>";
?>

1

Magentoからユーザーパスワードを回復するためにajax関数を使用してこの問題が発生しました。成功イベントは発生していませんでしたが、2つのエラーがあることに気付きました。

  1. 結果はJSON形式で返されませんでした
  2. 配列をJSON形式に変換しようとしましたが、この配列には非UTF文字が含まれていました

したがって、返される配列をエンコードするためにjson_eoncde()を使用しようとするたびに、そのインデックスの1つに非UTF文字があり、そのほとんどがブラジルポルトガル語のアクセントであったため、関数は機能していませんでした。


1

コントローラから文字列を返そうとしましたが、なぜajaxが成功せずにエラーブロックに制御が戻るのですか

var sownum="aa";
$.ajax({
    type : "POST",
    contentType : 'application/json; charset=utf-8',
    dataType : "JSON",
    url : 'updateSowDetails.html?sownum=' + sownum,
    success : function() {
        alert("Wrong username");
    },
    error : function(request, status, error) {

        var val = request.responseText;
        alert("error"+val);
    }
});

1

成功メッセージを返すようにコントローラーを変更すると、成功応答を返さないコントローラーをクエリするときに同じ問題に直面しました問題は解決しました。Lavaliteフレームワークの使用に注意してください。前:

public function Activity($id)
    {
        $data=getData();
        return
            $this->response->title('title')
                ->layout('layout')
                ->data(compact('data'))
                ->view('view')
                ->output();
    }
after code looks like:
    try {
            $attributes = $request->all();
            //do something
            return $this->response->message('')
                ->code(204)
                ->status('success')
                ->url('url'. $data->id)
                ->redirect();
        } catch (Exception $e) {
            return $this->response->message($e->getMessage())
                ->code(400)
                ->status('error')
                ->url('nothing Wrong')
                ->redirect()
        }

これは私のために働いた


1

私は同じ方法でそれを解決した同じ問題がありました:私のajax:

event.preventDefault();
$.ajax('file.php', {
method: 'POST',
dataType: 'json',
contentType: 'application/json',
data: JSON.stringify({tab}), 
success: function(php_response){
            if (php_response == 'item') 
                {
                    console.log('it works');
                }
            }
        })

OK。問題はjsonではなく、phpの応答にあります。以前:私のphpの応答は:

echo 'item';

今:

$variable = 'item';
 echo json.encode($variable);

今私の成功は働いています。PS。何かが間違っている場合は申し訳ありませんが、このフォーラムへの私の最初のコメントです:)



0

この方法で「エラー」コールバックを追加します(「成功」のように):

$.ajax({
   type: 'POST',
   url: 'submit1.php',
   data: $("#regist").serialize(),
   dataType: 'json',
   success: function() {
      $("#loading").append("<h2>you are here</h2>");
   },
   error: function(jqXhr, textStatus, errorMessage){
      console.log("Error: ", errorMessage);
   }
});

だから、私の場合、コンソールで見ました:

Error:  SyntaxError: Unexpected end of JSON input
  at parse (<anonymous>), ..., etc.

0

成功とエラーの両方のコールバックを宣言する必要があります。追加

error: function(err) {...} 

問題を修正する必要があります


-4

成功コールバックは 2つの引数を取ります。

success: function (data, textStatus) { }

またsubmit1.php、が適切なcontent-typeヘッダーを設定していることを確認してください:application/json


お返事をありがとうございます。私はこれについてjquery ajax documentaionで読みましたが、それを機能させるための次のステップはわかりません...正しい方向を教えていただければ幸いです。また、phpファイルに特定のコードを含める必要があるという意味ですか?どうもありがとう
コーディングBBQ 2009

7
success2つの引数をとるという事実は、問題とはまったく無関係のようです。宣言で受け入れる数に関係なく、JavaScript関数に任意の量のパラメーターを渡すことができます。そのため、これはこれらの問題の原因ではありません。また、値がdataないかtextStatus、成功コールバックで使用されていないため、関数でそれらを宣言する理由にはなりません。
David Hedlund、

そして、JSONデータは正しいcontent-typeヘッダーを持つ必要はなく、JSON形式でなければなりません。
Tatu Ulmanen、2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.