2011-08-12 4 views
0

Ceci est en partie une continuation de ce fil: jquery - return value from callback function (in post request) into the function its inside of? parce que je mis à jour le code, mais le problème persiste. Je valide un simple formulaire html avec jquery, et malgré tous mes autres if/else, l'appel ajax n'est jamais fait. Voici le code javascript:forme jquery validateur ne fait jamais appel ajax

var pass_form = $ ('# pass_form'); pass_form.submit (valid_pass_sett);

function valid_pass_sett() { 
    //remove old errors - snipped 
    pass_old = $('input[name=pass_old]').val(); 
    pass_new = $('input[name=pass_new]').val(); 
    pass_confirm_new = $('input[name=pass_confirm_new]').val(); 

    if (pass_old === "") { 
     //display error on form - snipped 
     return false; 
    } else if (pass_new === "") { 
     //display error on form - snipped 
     return false; 
    } else if (pass_new != pass_confirm_new) { 
     //display error on form - snipped 
     return false; 
    } else if (pass_new.length < 8) { 
     //display error on form - snipped 
     return false; 
    } else { 
     $.post("http://www.example.com/ajax/validate.php",{ // async validation 
      type: 'valid_old_change_pass', 
      pass_old: pass_old, 
      pass_new: pass_new 
     }, valid_pass_combo_callback); 
     alert('after the ajax call...'); 
    } 
    return false; // cancel form submission 
} 

et voici la partie pertinente du validate.php:

$username = $_SESSION['username']; 
$pass_old = $_POST['pass_old']; 
$pass_new = $_POST['pass_new']; 
if (empty($pass_old) || empty($pass_new)) { 
    echo "invalid"; 
} else if (!User::valid_user_pass($username, $pass_old)) { 
    echo "invalid_old"; 
} else if (!Sanitize::is_legal_password($pass_new)) { 
    echo "invalid_new"; 
} else { 
    echo "valid"; 
} 

Quand je suis débogage avec Firebug, et toutes les autres entrées de formulaire sont corrects, le script arrive à l'appel ajax, puis soumet le formulaire, même s'il est supposé appeler la fonction de rappel. Ceci est le code de la fonction de rappel:

function valid_pass_combo_callback(data) { 
    if (data == 'valid') { 
     //only if the form is valid! 
     pass_form[0].submit(); 
    } 
    else if (data == "invalid_old") { 
     //display error on form - snipped 
    } 
    else if (data == "invalid_new") { 
     //display error on form - snipped 
    } 
    else { 
     //it always jumps to here..., even though data *is* the correct value 
    } 

} 

EDIT Redux: Ok, je fixe l'erreur dans ma fonction de rappel, comme on le voit dans la première réponse, et maintenant, un peu d'un autre problème a émergé. J'ai débogué la fonction valid_pass_combo_callback et il obtient la valeur correcte de validate.php; dans ce cas, invalid_old est la valeur renvoyée. Quand je débogue, data est égal à invalid_old. Cependant, la comparaison échoue ... donc le code toujours saute à la dernière instruction else, quoi qu'il arrive. Rien ne se passe, car il n'y a pas de comportement là-bas, alors pourquoi la comparaison échoue-t-elle toujours? EDIT, RESOLU: J'ai décidé de renoncer à lier cette fonction à soumettre, et à la place liée à un événement onclick pour un bouton sur le formulaire (que j'utilise à la place d'un bouton d'envoi) et qui a résolu le problème. La validation est appelée lorsque le bouton est cliqué, et si la validation côté client réussit, le formulaire est soumis au serveur pour validation.

Répondre

1

Un problème ici est vous invoquez votre rappel, ne passe pas la fonction elle-même:

$.post("http://www.example.com/ajax/validate.php",{ // async validation 
     type: 'valid_old_change_pass', 
     pass_old: pass_old, 
     pass_new: pass_new 
    }, valid_pass_combo_callback); // Remove (data) so the callback 
            // isn't invoked immediately. 
+0

Cela a résolu le problème initial; J'ai ajouté plus de détails à ma question, cependant, parce que maintenant j'ai un autre problème où la comparaison * toujours * échoue, bien que 'data' stocke la bonne valeur de validate.php. –

+0

Vous devriez faire une nouvelle question pour le nouveau problème. – FishBasketGordo

+0

fait: http://stackoverflow.com/questions/7043708/data-returned-from-ajax-always-failing-in-comparison Merci encore pour l'aide. –

1

En regardant votre code que vous ne devez pas soumettre le formulaire, mais faire un appel ajax mais vous dites la forme est être soumis. Je pense qu'il y a une erreur js dans le code de code ci-dessous à cause duquel le formulaire est soumis. Pourquoi ne pas empêcher le comportement par défaut de soumettre un formulaire?

function valid_pass_sett(e) { 

    e.preventDefaul();//This will ensure the form will never be submitted. 

Et dans la méthode de rappel faites une petite modification pour délier le gestionnaire de soumission, puis soumettre le formulaire. C'est parce que nous avons déjà un gestionnaire de soumission et nous ne voulons pas l'appeler la prochaine fois que nous soumettons dans la méthode ci-dessous.

function valid_pass_combo_callback(data) { 
    if (data === 'valid') { 
     //only if the form is valid! 
     pass_form[0].unbind('submit').submit(); 
    } 
    else if (data === "invalid_old") { 
     //display error on form - snipped 
    } 
    else if (data === "invalid_new") { 
     //display error on form - snipped 
    } 
} 
+0

Devrais-je supprimer le onsubmit = "return valid_pass_sett()" de mon code HTML aussi? –

+0

J'ai enlevé le retour 'onsubmit =" valid_pass_sett() "' de mon code HTML et changé mon 'pass_form.submit() 'contraignant pour refléter le vôtre. Merci pour l'aide! –

+0

@pythonscript - Cela vous a-t-il aidé? – ShankarSangoli