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?
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.
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.
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 ...
}
});
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.
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.
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);
}
});
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.
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:
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.
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
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>";
?>
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.
Sie müssen sowohl Erfolg als auch Fehler als Rückruf deklarieren. Hinzufügen
error: function(err) {...}
sollte das Problem beheben
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 :)
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");