Un peu en retard, mais voici ma contribution. Dans mon expérience, $.ajax
est le moyen préféré d'envoyer un appel AJAX, y compris les formulaires, au serveur. Il a une pléthore d'options supplémentaires. Afin d'effectuer la validation dont @vincent a parlé, j'ajoute un bouton d'envoi normal au formulaire, puis je lie à $(document).on("submit", "#myForm", ...
. Dans ce cas, j'empêche l'action de soumission par défaut (e.preventDefault()
en supposant que votre événement est e
), effectuez ma validation, puis soumettez.
Une version simplifiée de ce serait comme suit:
$(document).on("submit", "#login-form", function(e) {
e.preventDefault(); // don't actually submit
// show applicable progress indicators
$("#login-submit-wrapper").addClass("hide");
$("#login-progress-wrapper").removeClass("hide");
// simple validation of username to avoid extra server calls
if (!new RegExp(/^([A-Za-z0-9._-]){2,64}$/).test($("#login-username").val())) {
// if it is invalid, mark the input and revert submit progress bar
markInputInvalid($("#login-username"), "Invalid Username");
$("#login-submit-wrapper").removeClass("hide");
$("#login-progress-wrapper").addClass("hide");
return false;
}
// additional check could go here
// i like FormData as I can submit files using it. However, a standard {} Object would work
var data = new FormData();
data.append("username", $("#login-username").val());
data.append("password", $("#login-password").val()); // just some examples
data.append("captcha", grecaptcha.getResponse());
$.ajax("handler.php", {
data: data,
processData: false, // prevent weird bugs when submitting files with FormData, optional for normal forms
contentType: false,
method: "POST"
}).done(function(response) {
// do something like redirect, display success, etc
}).fail(function(response) {
var data = JSON.parse(response.responseText); // parse server error
switch (data.error_code) { // do something based on that
case 1:
markInputInvalid($("#login-username"), data.message);
return;
break;
case 2:
markInputInvalid($("#login-password"), data.message);
return;
break;
default:
alert(data.message);
return;
break;
}
}).always(function() { // ALWAYS revert the form to old state, fail or success. .always has the benefit of running, even if .fail throws an error itself (bad JSON parse?)
$("#login-submit-wrapper").removeClass("hide");
$("#login-progress-wrapper").addClass("hide");
});
});
Bonjour Robert, Ma forme est très complexe et comprend aussi des champs dynamiques. Si je dois transférer manuellement toutes les valeurs à la fonction, cela impliquera beaucoup de travail. merci – q0987
Ceci est la façon ajax de soumettre le formulaire, mais cela ne fonctionne pas avec le téléchargement du fichier. donc ce n'est pas si commun réutilisable. – Vincent
Vous pouvez télécharger des fichiers avec AJAX très bien. – Robert