1. El "Método Definitivo": La Función de Validación
Aunque existen muchas formas de validar, el método más ordenado y robusto es utilizar una única función
que valide cada campo secuencialmente.
Si un campo falla, devolvemos false inmediatamente (deteniendo el envío). Si llegamos al
final, devolvemos true.
La estructura Maestra
function validarTodo(formulario) {
// 1. Validar nombre
if (formulario.nombre.value.trim() === "") {
alert("Escribe tu nombre");
formulario.nombre.focus();
return false;
}
// 2. Validar email con RegEx
const regexEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!regexEmail.test(formulario.email.value)) {
alert("Email no válido");
formulario.email.focus();
return false;
}
// 3. Validar checkbox
if (!formulario.terminos.checked) {
alert("Debes aceptar los términos");
return false;
}
// ¡Todo OK!
return true;
}
2. ¿Cómo y dónde colocar la llamada?
La llamada debe ir en la cabecera de la etiqueta <form>, utilizando el evento
onsubmit.
Es crucial incluir la palabra return antes del nombre de la función para
que el navegador sepa si debe ejecutar o detener el envío.
<form action="enviar.php" method="POST" onsubmit="return validarTodo(this)">
<input type="text" name="nombre" placeholder="Nombre...">
<button type="submit">Enviar</button>
</form>
3. El uso del this
En el atributo onsubmit, la palabra reservada this hace referencia al elemento
actual: el formulario mismo.
- Al pasar
thiscomo argumento (validarTodo(this)), la función recibe el objeto formulario completo. - Dentro de la función, podemos acceder a cualquier campo directamente por su atributo
name:formulario.nombre,formulario.email, etc. - Esto es mucho más eficiente que usar múltiples
document.getElementById().
4. Validando todo tipo de campos
Campos de Texto y Longitud
if (formulario.pass.value.length < 8) {
alert("La clave debe tener al menos 8 caracteres");
return false;
}
Selectores (Drop-downs)
Asegúrate de que la primera opción (por defecto) tenga un valor vacío value="".
if (formulario.pais.value === "") {
alert("Selecciona un país");
return false;
}
Radio Buttons (¿Cuál está marcado?)
Los radios funcionan como un array. Podemos usar some() o un bucle for.
// Forma moderna:
const radios = Array.from(formulario.genero);
if (!radios.some(r => r.checked)) {
alert("Selecciona un género");
return false;
}
Confirmación de Password
if (formulario.pass1.value !== formulario.pass2.value) {
alert("Las contraseñas no coinciden");
return false;
}
Validación Avanzada de Checkboxes
A veces no basta con validar si "está marcado". Necesitamos contar cuántos.
// 1. Mínimo y Máximo de opciones seleccionadas
const chks = document.querySelectorAll('input[name="intereses[]"]:checked');
if (chks.length < 2) {
alert("Elige al menos 2 intereses");
return false;
}
if (chks.length > 5) {
alert("Máximo 5 intereses permitidos");
return false;
}
// 2. Validación Dependiente (Si marca "Otros", debe escribir cuál)
if (formulario.chk_otros.checked && formulario.txt_otros.value.trim() === "") {
alert("Si marcas 'Otros', especifica cuál por favor.");
formulario.txt_otros.focus();
return false;
}
5. Ejemplo Maestro Completo
Copia y adapta este esquema para cualquier proyecto profesional.
<script>
function masterValidator(f) {
// Limpiar espacios
const nombre = f.nombre.value.trim();
const email = f.email.value.trim();
// Validar Nombre
if (nombre.length < 3) {
alert("El nombre es demasiado corto");
f.nombre.focus();
return false;
}
// Validar Email
const regex = /^\w+([.-_+]?\w+)*@\w+([.-]?\w+)*(\.\w{2,10})+$/;
if (!regex.test(email)) {
alert("El formato del email no es válido");
f.email.focus();
return false;
}
// Validar Checkbox de privacidad
if (!f.privacidad.checked) {
alert("Debes aceptar la política de privacidad");
return false;
}
// Si llegamos aquí, todo es correcto
console.log("Datos listos para enviar:", { nombre, email });
return true;
}
</script>
💡 Pro-Tips de UX
- No abuses del
alert(): En aplicaciones reales, es mejor imprimir el error bajo el campo. trim()siempre: Limpia espacios accidentales al inicio y final de los inputs.focus()es amor: Pon siempre el cursor en el campo que falló para que el usuario no tenga que buscarlo.