Un poco tarde, pero esta es mi contribución. En mi experiencia, $.ajax
es la forma preferida de enviar una llamada AJAX, incluidos formularios, al servidor. Tiene una plétora de más opciones. Para realizar la validación que mencionó @vincent, agrego un botón de envío normal al formulario, luego me enlace a $(document).on("submit", "#myForm", ...
. En eso, evito la acción de envío predeterminado (e.preventDefault()
asumiendo que tu evento sea e
), realizo mi validación y luego envío.
Una versión simplificada de este sería el siguiente:
$(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");
});
});
Hola Robert, Mi forma es muy complicado e incluye también campos dinámicos. Si tengo que transferir manualmente todos los valores a la función, implicará mucho trabajo. gracias – q0987
Esta es la manera ajax de enviar el formulario, pero no funciona con la carga del archivo. así que no es tan común reutilizable. – Vincent
Puede cargar archivos con AJAX sin problemas. – Robert