Le hice un lifting al código y traté de hacerlo bastaaaaaaaante mas sencillo, pero sigue sin funcionar del todo
Código Javascript
:
Ver originalfunction init () {
document.welcome.addEventListener('valid', watch, true);
document.querySelector('.button-send').addEventListener('click', send, false);
}
function watch (e) {
var el = e.target;
var errMsj = document.getElementById('err-msj');
if (el.validity.valid) {
console.log('Good');
} else {
console.log('Warning');
}
}
function send () {
var name = document.querySelector("input[name='fname']"),
lname = document.querySelector("input[name='lname']"),
age = document.querySelector("input[name='age']"),
mail = document.querySelector("input[name='email']"),
valid = document.welcome.checkValidity(),
errMsj = document.getElementById('err-msj');
if (valid) {
document.welcome.submit();
}
else {
if (name.validity.valueMissing || lname.validity.valueMissing || age.validity.valueMissing || mail.validity.valueMissing){
console.log('missing value');
} else if (name.validity.patternMissMatch || lname.validity.patternMissMatch || age.validity.patternMissMatch){
console.log('missing pattern');
} else {
if ((mail.validity.typeMissMatch)) {
console.log('type Missing');
};
}
}
}
window.addEventListener('load', init, false);
Código HTML:
Ver original<!DOCTYPE html>
<link rel="stylesheet" href="css/style.css"> <form name="welcome" method="post"> <input type="text" name="fname" placeholder="your name here" pattern="[A-Za-z]" required> <input type="text" name="lname" placeholder="your lastname here" pattern="[A-Za-z]" required> <input type="text" name="age" placeholder="your age here" pattern="[0-9]"> <input type="radio" name="female" value="female"><span>Female
</span> <div class="button-wrapper"> <input type="button" name="send" value="Send" class="button-send">
Acá el cambio es que en vez de volverme loco tratando de disparar un aviso distinto por cada error en forma de caja, lo hago (de forma simulada con logs, por los momentos) con una sola caja que avisa que hay errores en las casillas marcadas (en este caso, lo hago con la pseudo clase :invalid de css) ... o bueno, se supone que debería ir lanzando un log a medida que se equivoca un campo, cosa que no pasa en la función watch.
Respecto a la función send() pues hay un comportamiento extraño. Se supone que cuando se hace click en el botón para enviar el formulario, se activa el condicional que evalúa: si el formulario es válido, envíalo, sino lanza alguna de estas excepciones (los if anidados).
Nada de esto pasa, el único evento que se dispara es si hay un campo vacío, mas allá de eso no se evalúa nada a menos que cambie el tipo de botón button por submit y ahí más o menos empieza a validar, pero sigue sin disparar otros eventos, me dice siempre el mismo log de "value is missing" aunque haya un patternMissMatch. Además, siempre me muestra las cajas de comentarios feas y no hay manera de sacarlas.
Al parecer validar del lado del cliente con la API HTML5 no es tan simple