it-swarm.com.de

Ajax-Erfolgsereignis funktioniert nicht

Ich habe ein Anmeldeformular und verwende $.ajax, um es abzusenden.

Dies ist meine AJAX - Anfrage:

$(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;        
    });
});

In meiner Datei submit1.php überprüfe ich, ob die Felder email address und username in der Datenbank vorhanden sind . Ich möchte eine Fehlermeldung anzeigen, wenn diese Werte ohne sind eine Seite aktualisieren .

Wie kann ich dies zum success - Callback meiner AJAX - Anforderung hinzufügen?

171
noobcode

Das Ergebnis liegt wahrscheinlich nicht im JSON-Format vor. Wenn also jQuery versucht, es als solches zu analysieren, schlägt es fehl. Sie können den Fehler mit der error:-Rückruffunktion abfangen.

Sie scheinen JSON in dieser Funktion sowieso nicht zu benötigen, daher können Sie auch die Zeile dataType: 'json' entfernen.

347
Tatu Ulmanen

Obwohl das Problem bereits gelöst ist, füge ich dies in der Hoffnung hinzu, dass es anderen helfen wird.

Ich habe den Fehler gemacht und versucht, eine Funktion direkt so zu verwenden (Erfolg: OnSuccess (productID)). Sie müssen jedoch zunächst eine anonyme Funktion übergeben:

  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;
  }

Wenn Sie keine anonyme Funktion als Wrapper verwenden, wird OnSuccess aufgerufen, auch wenn der Webservice eine Ausnahme zurückgibt.

16
js newbee

Ich habe versucht, die dataType-Zeile zu entfernen, und es funktionierte nicht für mich. Ich bin um das Problem herumgekommen, indem ich als Callback "complete" anstelle von "success" verwendet habe. Der Rückruf für den Erfolg schlägt immer noch im IE fehl, aber da mein Skript ausgeführt wird und trotzdem abgeschlossen ist, ist das alles, was mich interessiert.

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

in jQuery 1.5 können Sie es auch so machen.

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

Stellen Sie sicher, dass Sie keinen Text/keine Daten drucken (echo oder drucken), bevor Sie Ihre JSON-formatierten Daten in Ihrer PHP -Datei generieren. Das könnte erklären, dass Sie -sucessfull 200 OK- erhalten, aber Ihr Erfolgsereignis versagt immer noch in Ihrem Javascript. Sie können den Empfang Ihres Skripts überprüfen, indem Sie den Abschnitt "Network - Answer" in Firebug für POST submit1.php überprüfen.

11
Delfin

Fügen Sie eine alert() in Ihren success-Callback ein, um sicherzustellen, dass er überhaupt aufgerufen wird.

Ist dies nicht der Fall, liegt dies einfach daran, dass die Anforderung überhaupt nicht erfolgreich war, obwohl Sie den Server erreichen. Gründe dafür können sein, dass ein Timeout abläuft oder etwas in Ihrem PHP-Code eine Ausnahme auslöst.

Installieren Sie das Firebug-Addon für Firefox, falls noch nicht geschehen, und prüfen Sie den AJAX - Rückruf. Sie können die Antwort sehen und ob sie eine erfolgreiche Antwort (200 OK) erhält oder nicht. Sie können auch eine andere alert() im complete-Callback einfügen, die auf jeden Fall aufgerufen werden sollte.

4
David Hedlund

Ich hatte das gleiche Problem. es kommt vor, weil javascript den Datentyp json bei der Rückgabe von Daten erwartet. Wenn Sie jedoch Echo oder Drucken in Ihrem PHP verwenden, tritt diese Situation auf. Wenn Sie die echo-Funktion in php verwenden, um Daten zurückzugeben, entfernen Sie einfach dataType : "json"

Ich habe versucht, eine Zeichenfolge vom Controller zurückzugeben, aber warum die Steuerung zum Fehlerblock zurückkehrt, ist der Erfolg von Ajax nicht erfolgreich

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
user7285134

Ich gab gültiges JSON zurück, erhielt eine Antwort von 200 in meinem "vollständigen" Callback und konnte es in der Chrome-Netzwerkkonsole sehen ... ABER ich hatte es nicht angegeben

dataType: "json"

einmal habe ich, anders als die "akzeptierte Antwort", das Problem tatsächlich behoben.

1
sarink

Ich hatte dieses Problem bei der Verwendung einer Ajax-Funktion, um das Benutzerpasswort von Magento wiederherzustellen. Das Erfolgsereignis wurde nicht ausgelöst, und mir wurde klar, dass es zwei Fehler gab:

  1. Das Ergebnis wurde nicht im JSON-Format zurückgegeben
  2. Ich habe versucht, ein Array in das JSON-Format zu konvertieren, dieses Array hatte jedoch keine UTF-Zeichen

Jedes Mal, wenn ich versuchte, json_eoncde () zu verwenden, um das zurückkehrende Array zu codieren, funktionierte die Funktion nicht, da einer der Indizes Nicht-UTF-Zeichen enthielt, die meisten davon in brasilianischen portugiesischen Wörtern.

1
Andresa Krul

Ich hatte das gleiche Problem, als ich den Controller abfragte, der keine Erfolgsmeldung zurückliefert, als mein Controller so geändert wurde, dass das Problem mit der Erfolgsmeldung zurückgegeben wurde. Vor:

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()
        }

das hat für mich funktioniert

1
masokaya

Ich verwende XML, um das Ergebnis vom PHP auf dem Server auf die Webseite zu übertragen, und ich hatte das gleiche Verhalten.

In meinem Fall war der Grund dafür, dass das schließende Tag nicht mit dem öffnenden Tag übereinstimmte.

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

Fügen Sie "error" callback (genau wie "success") folgendermaßen hinzu:

$.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);
   }
});

In meinem Fall sah ich also in der Konsole:

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

Sie müssen sowohl Erfolg als auch Fehler als Rückruf deklarieren. Hinzufügen

error: function(err) {...} 

sollte das Problem beheben

0
JeffNhan

Ich hatte das gleiche Problem, das ich auf diese Weise gelöst habe: Mein 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. Das Problem ist nicht mit json sondern nur PHP-Antwort . Vorher: Meine PHP-Antwort war: 

echo 'item';

Jetzt: 

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

Nun funktioniert mein Erfolg . PS. Sorry wenn etwas nicht stimmt, aber es ist mein erster Kommentar in diesem Forum :)

0
silkykg

in meinem Fall lag der Fehler auf der Serverseite und aus diesem Grund wurde eine HTML-Datei zurückgegeben

wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");
0