Puoi farlo in modo asincrono.
Creare una variabile globale, io lo chiamo ajax_done_and_successful_flag, da inizializzare a false all'inizio del programma . Imposterai questa opzione su true o false in vari posti nelle tue funzioni Ajax come la tua funzione Ajax successo o la tua funzione di errore Ajax.
Quindi è necessario aggiungere un gestore di invio nella parte inferiore della funzione di convalida di .
submitHandler: function(form) {
if (ajax_done_and_successful_flag === true) {
form.submit()
}
}
Il problema è che il codice non è in esecuzione in modo lineare.
Inserisci un po 'di istruzioni console.log di Firebug nel codice.
Osservare la sequenza di esecuzione. Vedrai che la tua risposta Ajax Ajax tornerà per ultima, o ogni volta che lo desideri.
Ecco perché è necessario il submitHandler e la bandiera globale
per forzare la funzione di convalida di aspettare per una corretta Ajax
risultati prima che il modulo viene inviato.
Qualsiasi uscita allo schermo dalla risposta Ajax, deve essere fatto nei funzioni Ajax, come la funzione successo e la funzione errore.
È necessario scrivere nella stessa posizione come funzioni di successo/errore della funzione di convalida.
In questo modo i messaggi di errore Ajax si fondono con la funzione di errore della funzione di convalida.
Questo concetto può sembrare un po 'complicato.
L'idea di tenere a mente è che le funzioni di successo e di errore nella funzione validate stanno scrivendo nella stessa posizione come il successo e l'errore funzioni nella chiamata Ajax, e che va bene, che è come dovrebbe essere.
L'ubicazione dei miei messaggi di errore è proprio accanto a dove l'utente digita l'input. Questo crea una bella esperienza utente che penso tu stia chiedendo.
Ecco il mio esempio di codice. L'ho semplificato.
Sono in esecuzione jQuery 1.7.1-
e jQuery convalida plug-in 1.6
sto usando Firefox 14.0.1 e ho anche provato su Chrome 21,0 successo.
var ajax_done_and_successful_flag = false;
// Add methods
...
$.validator.addMethod("USERNAME_NOT_DUPLICATE", function (value, element) {
return this.optional(element) || validate_username_not_duplicate();
},
"Duplicate user name.");
// validate
$(document).ready(function () {
$('#register_entry_form form').validate({
rules: {
username: {
required: true,
minlength: 2,
maxlength: 20,
USERNAME_PATTERN: true,
USERNAME_NOT_DUPLICATE: true
},
...
errorPlacement: function (error, element) {
element.closest("div").find(".reg_entry_error").html(error);
},
success: function(label) {
label.text('Success!');
} ,
submitHandler: function(form) {
if (ajax_done_and_successful_flag === true) {
form.submit();
}
}
});
});
/* validation functions*/
function validate_username_not_duplicate() {
var username_value = $('#username').val(); // whatever is typed in
$.ajax({
url: "check_duplicate_username.php",
type: "POST",
data: { username: username_value },
dataType: "text",
cache: false,
//async: false,
timeout: 5000,
error: function (jqXHR, errorType, errorMessage) {
ajax_done_and_successful_flag = false;
if (errorType === "timeout") {
$('#username').closest("div").find(".reg_entry_error").html("Server timeout, try again later");
} else if ...
},
success: function (retString, textStatus,jqXRH) {
if (retString === "yes") { // duplicate name
// output message next to input field
$('#username').closest("div").find(".reg_entry_error").html("Name already taken.");
ajax_done_and_successful_flag = false;
} else if (retString === "no") { // name is okay
// output message next to input field
$('#username').closest("div").find(".reg_entry_error").html("success!");
ajax_done_and_successful_flag = true;
} else {
console.log("in validate_username_duplicate func, success function, string returned was not yes or no.");
$('#username').closest("div").find(".reg_entry_error").html("There are server problems. Try again later.");
ajax_done_and_successful_flag = false;
}
} // end success function
}); // end ajax call
return true; // automatically return true, the true/false is handled in
// the server side program and then the submit handler
}
Il reg_entry_error è il luogo proprio accanto il metodo di scrittura. Ecco un esempio di codice semplificato del modulo.
<label class="reg_entry_label" for="username">Username</label>
<input class="reg_entry_input" type="text" name="username" id="username" value="" />
<span class="reg_entry_error" id="usernameError" ></span>
Spero che questo risponda alla tua domanda.
Quale soluzione hai utilizzato? Sto affrontando lo stesso problema. –