L'événement de succès Ajax ne fonctionne pas
j'ai un formulaire d'inscription et j'utilise $.ajax
pour le soumettre.
C'est ma demande 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;
});
});
Dans mon submit1.php fichier je vérifie l'existence des champs email address et username dans la base de données. Je souhaite afficher un message d'erreur si cette valeur existe sans rafraîchir la page .
Comment puis-je ajouter ceci au succès Rappel de ma requête AJAX?
13 réponses
le résultat n'est probablement pas dans le format JSON, donc quand jQuery essaie de le parser comme tel, il échoue. Vous pouvez attraper l'erreur avec la fonction de rappel error:
.
vous ne semblez pas avoir besoin de JSON dans cette fonction de toute façon, donc vous pouvez également sortir la ligne dataType: 'json'
.
bien que le problème soit déjà résolu, j'ajoute ceci dans l'espoir qu'il aidera les autres.
j'ai fait l'erreur et j'ai essayé d'utiliser une fonction directement comme celle-ci (success: OnSuccess(productID)). Mais il faut d'abord passer une fonction anonyme:
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;
}
si vous n'utilisez pas une fonction anonyme comme wrapper OnSuccess est appelé même si le service web renvoie une exception.
j'ai essayé de supprimer la ligne de type de données et cela n'a pas fonctionné pour moi. J'ai contourné le problème en utilisant "complet" au lieu de "succès" comme rappel. Le succès de callback échoue toujours dans IE, mais puisque mon script court et termine de toute façon, c'est tout ce qui m'importe.
$.ajax({
type: 'POST',
url: 'somescript.php',
data: someData,
complete: function(jqXHR) {
if(jqXHR.readyState === 4) {
... run some code ...
}
}
});
dans jQuery 1.5 vous pouvez aussi le faire comme ceci.
var ajax = $.ajax({
type: 'POST',
url: 'somescript.php',
data: 'someData'
});
ajax.complete(function(jqXHR){
if(jqXHR.readyState === 4) {
... run some code ...
}
});
assurez-vous que vous n'imprimez pas (echo ou print) de texte/données avant de générer vos données formatées JSON dans votre fichier PHP. Cela pourrait expliquer que vous obtenez un-sucessfull 200 OK-mais votre événement sucess échoue toujours dans votre javascript. Vous pouvez vérifier ce que votre script reçoit en cochant la section "Network - Answer" dans firebug pour le post submit1.php.
mettez un alert()
dans votre success
pour vous assurer qu'il est appelé.
si ce n'est pas le cas, c'est simplement parce que la requête n'a pas réussi du tout, même si vous parvenez à atteindre le serveur. Les causes raisonnables pourrait être qu'un délai expire, ou quelque chose dans votre code php jette une exception.
installez l'addon firebug pour firefox, si vous ne l'avez pas déjà fait, et inspectez le rappel AJAX. Vous serez en mesure de voir les réponse, et si elle reçoit ou non une réponse réussie (200 OK). Vous pouvez aussi mettre un autre alert()
dans le rappel complete
, qui devrait certainement être invoqué.
j'ai eu le même problème. cela se produit parce que javascript
s'attendre json
type de données dans le retour des données. mais si vous utilisez echo ou print dans votre php cette situation se produire. si vous utilisez la fonction echo
dans php
pour retourner des données, il suffit de supprimer dataType : "json"
qui fonctionne assez bien.
je retournais JSON valide, obtenant une réponse de 200 dans mon rappel" complet", et j'ai pu le voir dans la console réseau chrome... Mais je n'avais pas précisé
dataType: "json"
une fois que j'ai fait, contrairement à la "réponse acceptée", qui a en fait corrigé le problème.
j'ai eu ce problème en utilisant une fonction ajax pour récupérer le mot de passe de Magento. L'événement de succès n'a pas été tiré, puis j'ai réalisé qu'il y avait deux erreurs:
- le résultat n'a pas été retourné dans le format JSON
- j'essayais de convertir un tableau au format JSON, mais ce tableau avait des caractères non-utf
ainsi chaque fois que j'ai essayé d'utiliser json_eoncde() pour coder le tableau de retour, le fonction ne fonctionnait pas parce que l'un de ses index avait des caractères non-utf, la plupart d'entre eux accentuation dans les mots portugais brésiliens.
j'ai essayé de retourner la chaîne du contrôleur mais pourquoi le contrôle de retour au bloc d'erreur pas dans le succès d'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);
}
});
j'ai fait face au même problème en interrogeant le contrôleur qui ne renvoie pas la réponse de succès, lorsque modifié mon contrôleur pour retourner le problème de message de succès a été résolu. remarque à l'aide de Lavalite cadre. avant:
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()
}
cela a fonctionné pour moi
j'utilise XML pour rapporter le résultat du php sur le serveur à la page Web et j'ai eu le même comportement.
dans mon cas , la raison était que l'étiquette de fermeture ne correspondait pas à l'étiquette d'ouverture.
<?php
....
header("Content-Type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>
<result>
<status>$status</status>
<OPENING_TAG>$message</CLOSING_TAG>
</result>";
?>
dans mon cas, l'erreur était celle du côté serveur et pour cette raison il retournait un html
wp_nonce_field(basename(__FILE__), "mu-meta-box-nonce");
Le le succès de rappel prend deux arguments:
success: function (data, textStatus) { }
assurez-vous également que le submit1.php
définit le bon en-tête content-type: application/json