Ajax-Erfolgsereignis funktioniert nicht

193

Ich habe ein Anmeldeformular und benutze es $.ajax, um es einzureichen.

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 in der Datenbank die Felder E-Mail-Adresse und Benutzername vorhanden sind . Ich möchte eine Fehlermeldung anzeigen, wenn diese Werte ohne Seitenaktualisierung vorhanden sind .

Wie kann ich dies zum erfolgreichen Rückruf meiner AJAX-Anfrage hinzufügen ?

Codingbbq
quelle
2
Sind Sie sicher, dass der Erfolgsrückruf aufgerufen wird?
Rahul
Sie müssen eine neue Frage für Ihr zweites Problem stellen.
Mike Lyons

Antworten:

386

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

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

Tatu Ulmanen
quelle
14
Ich habe den Datentyp in Text geändert und ihn zum Laufen gebracht. sodataType:'text'
Magesh
+1 sogar mein, aber auf Code, der nicht mein war, löste ich, indem ich json-Daten vom Server
zurückgab
4
Dies kann auch auftreten, wenn a dataType:nicht angegeben ist, aber das url:endet in .json.
Davetapley
1
Auch in $.postAlias ​​liefert die jsonsuccess
Eingabe
Wenn Sie eine JSON-Ajax-Anfrage stellen möchten, stellen Sie sicher, dass der MIME-Typ auf application / json festgelegt ist. Das gab mir einige Probleme.
Gellweiler
19

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 wie diese direkt zu verwenden (Erfolg: OnSuccess (productID)). Sie müssen jedoch zuerst 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.

js newbee
quelle
5
Dies hat nichts mit Ajax, JQuery oder Handlern zu tun. Wir könnten genauso gut einen Kommentar haben, der daran erinnert, dass "der gesamte Code in ein Skript-Tag eingeschlossen werden sollte". Die Erklärung ist falsch: Sie müssen nichts in anonyme Funktionen einschließen, eine benannte Funktion reicht aus, solange Sie sie übergeben, anstatt sie aufzurufen. Darüber hinaus ist es irreführend: OnSuccess wird aufgerufen, bevor die Anfrage überhaupt gesendet wird. Daher ist es nicht sinnvoll, sie mit dem Webservice in Verbindung zu bringen, der etwas zurückgibt.
fdreger
Diese Antwort hat mir geholfen, aber ich habe nicht zugestimmt. Sie sollten Ihre Antwort gemäß dem Kommentar von @fdreger aktualisieren.
Ozair Kafray
15

Ich habe versucht, die dataType-Zeile zu entfernen, aber es hat bei mir nicht funktioniert. Ich habe das Problem umgangen, indem ich "vollständig" anstelle von "Erfolg" als Rückruf verwendet habe. Der erfolgreiche Rückruf schlägt im IE immer noch fehl, aber da mein Skript trotzdem ausgeführt und abgeschlossen wird, 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 dies auch so tun.

var ajax = $.ajax({
    type: 'POST',
    url: 'somescript.php',
    data: 'someData'
});
ajax.complete(function(jqXHR){
    if(jqXHR.readyState === 4) {
        ... run some code ... 
    }
});
Allen
quelle
9
Nur eine Anmerkung dazu. completewird immer aufgerufen, unabhängig davon, ob der Ajax-Aufruf erfolgreich war oder nicht, während er successnur aufgerufen wird, wenn der Webserver mit einem 200 OKHTTP-Header antwortet (alles ist in Ordnung).
katalin_2003
10

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 eine erfolgreiche 200 OK erhalten, aber Ihr Erfolgsereignis in Ihrem Javascript immer noch fehlschlägt. Sie können überprüfen, was Ihr Skript empfängt, indem Sie im Abschnitt "Netzwerk - Antwort" in firebug nach dem POST submit1.php suchen.

Delfin
quelle
Das hat mir wirklich geholfen. Ich weiß, dass es eine alte Antwort ist, aber es war genau das Problem, das ich hatte. Verwenden Sie während des Debuggens echo's oder print_r's und stellen Sie fest, dass diese tatsächlich den Fehler verursachen ... :) Danke!
Lennyklb
6 Jahre später und immer noch Menschen mit dieser Antwort helfen! Ich hätte nicht gewusst, wo ich sonst suchen sollte.
Tania Rascia
5

Fügen Sie ein alert()in Ihren successRückruf ein, um sicherzustellen, dass es überhaupt angerufen wird.

Wenn dies nicht der Fall ist, liegt dies einfach daran, dass die Anforderung überhaupt nicht erfolgreich war, obwohl Sie es schaffen, den Server zu erreichen. Vernünftige Ursachen können sein, dass eine Zeitüberschreitung abläuft oder etwas in Ihrem PHP-Code eine Ausnahme auslöst.

Installieren Sie das Firebug-Addon für Firefox, falls Sie dies noch nicht getan haben, und überprüfen Sie den AJAX-Rückruf. Sie können die Antwort sehen und feststellen, ob eine erfolgreiche Antwort (200 OK) eingeht oder nicht. Sie können auch einen anderen alert()in den complete Rückruf einfügen, der auf jeden Fall aufgerufen werden sollte.

David Hedlund
quelle
Danke für deine Antwort. Versuchte Alarm im Erfolgsfall, aber es hat nicht funktioniert. Ich habe ein Firebug-Addon für Firefox und es erhält eine erfolgreiche Antwort (200 OK), daher gibt es dort keine Probleme. Ich habe eine Würfelfunktion in meiner PHP-Datei, die auf Fehler überprüft wird. Wenn ich sie in Firebug überprüfe, wird die richtige Antwort angezeigt. Was meinst du mit "Sie können auch eine weitere Warnung () in den vollständigen Rückruf einfügen, die auf jeden Fall aufgerufen werden sollte." Vielen Dank für eine schnelle Antwort
Codingbbq
2
Wenn Sie die Warnung nicht in Ihrem sehen success, ist sie kein Erfolg. Da die Antwort 200 OK ist, erscheint die Antwort von Tatu vernünftig. Zur weiteren Fehlerbehebung können Sie jedoch ein anderes Ereignis verwenden, das aufgerufen completewird und immer aufgerufen wird, unabhängig davon, ob eine Anforderung erfolgreich ist oder nicht ( successgeschieht nur, wenn die Anforderung erfolgreich ist). complete: function (xhr, status) { alert('complete: '+status); }
David Hedlund
3

Ich hatte das gleiche Problem. Dies ist darauf zurückzuführen, javascriptdass jsonbei der Rückgabe von Daten ein Datentyp erwartet wird . aber wenn Sie echo oder print in Ihrem PHP verwenden, tritt diese Situation auf. Wenn Sie die echoFunktion in verwenden php, um Daten zurückzugeben, entfernen Sie einfach die dataType : "json"Funktion.

Soitha Wickramasinghe
quelle
2

Ich gab gültigen JSON zurück und erhielt in meinem "vollständigen" Rückruf eine Antwort von 200 und konnte sie in der Chrome-Netzwerkkonsole sehen ... ABER ich hatte nicht angegeben

dataType: "json"

Einmal habe ich, anders als bei der "akzeptierten Antwort", das Problem tatsächlich behoben.

Sarink
quelle
1

Ich verwende XML, um das Ergebnis vom PHP auf dem Server zur Webseite zurückzutragen, und ich habe das gleiche Verhalten gehabt.

In meinem Fall war der Grund, 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>";
?>
thowa
quelle
1

Ich hatte dieses Problem mit einer Ajax-Funktion, um das Benutzerkennwort von Magento wiederherzustellen. Das Erfolgsereignis wurde nicht ausgelöst, dann stellte ich fest, 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, aber dieses Array hatte Nicht-Utf-Zeichen

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

Andresa Martins
quelle
1

Ich habe versucht, eine Zeichenfolge vom Controller zurückzugeben, aber warum die Steuerung zum Fehlerblock zurückkehrt, ist 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);
    }
});
user7285134
quelle
1

Ich hatte das gleiche Problem, als ich den Controller abfragte, der keine Erfolgsantwort zurückgibt, als mein Controller so geändert wurde, dass er ein Problem mit der Erfolgsmeldung zurückgibt. Beachten Sie die Verwendung des Lavalite-Frameworks. 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 bei mir funktioniert

Masokaya
quelle
1

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 liegt nicht bei json, sondern nur bei der PHP-Antwort. Vorher: meine PHP-Antwort war:

echo 'item';

Jetzt:

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

Jetzt arbeitet mein Erfolg. PS. Entschuldigung, wenn etwas nicht stimmt, aber es ist mein erster Kommentar in diesem Forum :)

seidig
quelle
0

In meinem Fall war der Fehler, dass dies auf der Serverseite war und aus diesem Grund ein HTML zurückgegeben wurde

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

Fügen Sie auf diese Weise einen 'Fehler'-Rückruf hinzu (genau wie' Erfolg '):

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

Also, in meinem Fall habe ich in der Konsole gesehen:

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

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

error: function(err) {...} 

sollte das Problem beheben

JeffNhan
quelle
-4

Der Erfolgsrückruf hat zwei Argumente:

success: function (data, textStatus) { }

Stellen Sie außerdem sicher, dass der submit1.phprichtige Inhaltstyp-Header festgelegt ist:application/json

Darin Dimitrov
quelle
Danke für deine Antwort. Ich habe darüber in jquery ajax documentaion gelesen, aber ich kann nicht herausfinden, was mein nächster Schritt sein sollte, um es zum Laufen zu bringen ... würde mich freuen, wenn Sie mich in die richtige Richtung weisen könnten. Bedeutet das auch, dass ich einen bestimmten Code in meiner PHP-Datei haben sollte?
Vielen
7
Die Tatsache, dass successzwei Argumente erforderlich sind, scheint für die Frage völlig irrelevant zu sein. Sie können eine beliebige Anzahl von Parametern an eine Javascript-Funktion übergeben, unabhängig davon, wie viele sie in ihrer Deklaration akzeptiert. Dies ist definitiv nicht die Ursache für diese Probleme, und da keiner der Werte dataoder textStatusim Erfolgsrückruf verwendet wird, scheint dies der Fall zu sein sei kein guter Grund, sie überhaupt in der Funktion zu deklarieren.
David Hedlund
Und JSON-Daten müssen keinen korrekten Inhaltstyp-Header haben, sondern müssen nur im JSON-Format vorliegen.
Tatu Ulmanen