atributos de validación HTML5 ."> atributos de validación HTML5 .">

Validación de datos HTML5 personalizada

Tiempo de ejecución: 30 minutos. Empezar

Autor: Laurent G.
Views Total: 1,134
Sitio oficial: Ir a la web
Actualizado: January 14, 2018
Licencia: MIT

Vista prévia

Validación de datos HTML5 personalizada

Descripción

Un script de validación de formulario pequeño que resalta automáticamente los campos de formulario no válidos y muestra mensajes de error personalizados mediante < a href = "https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/HTML5/Constraint_validation" target = "_ blank" rel = "noopener" > atributos de validación HTML5 .

Funcionamiento

Agregue el mensaje de error y requerido a los campos de formulario utilizando los siguientes datos atributos:

<form class="form" action="#_">

<fieldset>


<legend>My informations:</legend>


<p class="requirement"><em>Fields followed by (*) are required</em></p>





<div class="form-field">



<label id="optional-label" for="optional">Optional field:</label>



<input id="optional" name="optional" type="text" placeholder="optional">


</div>


<div class="form-field">



<label id="lastname-label" for="lastname">Lastname: <span aria-hidden="true">(*)</span></label>



<input id="lastname" name="lastname" type="text" placeholder="Dupond" required






 pattern="[a-zA-Zçàéèëìîïòõôûùñ '-]+"







title="Lettres uniquement"






 aria-labelledby="lastname-label"







data-msg-required="The Lastname field is required."







data-msg-error="The Lastname field should contain only letters.">


</div>



<div class="form-field">



<label id="firstname-label" for="firstname">Firstname: <span aria-hidden="true">(*)</span></label>



<input id="firstname" name="firstname" type="text" placeholder="Jean" required







pattern="[a-zA-Zçàéèëìîïòõôûùñ' -]+"







title="Lettres uniquement"






 aria-labelledby="firstname-label"







data-msg-required="The Firstname field is required."







data-msg-error="The Firstname field should contain only letters.">


</div>



<div class="form-field">



<label id="email-label" for="email">Email: <span aria-hidden="true">(*)</span></label>



<input id="email" type="email" placeholder="[email protected]" required







aria-labelledby="email-label"







data-msg-required="The Email field is required."







data-msg-error="The Email field is invalid">


</div>



<div class="form-field">



<label id="phone-label" for="phone">Phone number: (0611223344 or +33611223344) <span aria-hidden="true">(*)</span></label>



<input id="phone" name="phone" type="tel" placeholder="0611223344" required







pattern="^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$"







 aria-labelledby="phone-label"







data-msg-required="The Phone field is required."







data-msg-error="The Phone field is invalid. It must contain only numbers and/or the sign '+'">


</div>


<div class="form-field">



<label id="civility-label" for="civility">Civility: <span aria-hidden="true">(*)</span></label>



<select id="civility" name="civility" required







aria-labelledby="civility-label"







data-msg-required="The Civility field is required.">




<option value="" disabled selected>Select an option</option>




<option value="1">Mrs.</option>




<option value="2">Mr.</option>



</select>


</div>





<div class="form-field">



<label id="password-label" for="password">Password: (<abbr tabindex="0" title="required">*</abbr>)



<span class="input-help">Password must be 8+ characters and include letters (at least one Uppercase) AND number(s)</span></label>



<input id="password" name="password" type="password" required







pattern="(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$"






 aria-labelledby="password-label"






 data-msg-required="The Password field is required."






 data-msg-error="Password field is invalid. It must be 8+ characters and include letters (at least one Uppercase) AND number(s)">


</div>





<div class="form-field">



<label id="radio-label" for="radio">




<input type="radio" id="radio" name="radio" required







 aria-labelledby="radio-label"







 data-msg-required="The Password field is required.">




Radio


</div>





<div class="form-submit">



<input type="reset">



<input type="submit">


</div>

</fieldset>
</form>

El JavaScript principal para activar el validador de formularios HTML5 personalizado.

"use strict";

const inputs = document.querySelectorAll('input[required],select[required],textarea[required]'),



oForm = document.querySelector('.form'),



 defaultRequiredMsg = "This field is required.",



defaultErrorMsg = "This field is invalid.";

function formCheck(input){

const inputParent = input.closest('.form-field'),




inputId = input.id;

let errorMsg = input.getAttribute('data-msg-error'),



requireMsg = input.getAttribute('data-msg-required');

let label_error;

input.setAttribute("aria-invalid", !input.checkValidity());

if(!input.checkValidity()) {


if(!document.querySelector('#'+inputId+"-error")){



label_error = document.createElement('p');



label_error.setAttribute("id", inputId+"-error");



label_error.setAttribute('class','msg-form-error');



inputParent.insertBefore(label_error, input.nextSibling);


} else {



label_error = document.querySelector('#'+inputId+"-error");


}


if (input.value === ''){



requireMsg ? requireMsg = requireMsg : requireMsg = defaultRequiredMsg;



label_error.innerHTML = requireMsg;


}else{



errorMsg ? errorMsg = errorMsg : errorMsg = defaultErrorMsg;



label_error.innerHTML = errorMsg;


}


inputParent.classList.add('is-invalid');


inputParent.classList.remove('is-valid');


input.setAttribute('aria-describedby',inputId+'-error');

} else {


if(document.querySelector('#'+inputId+"-error")){



label_error = document.querySelector('#'+inputId+"-error");



label_error.parentNode.removeChild(label_error);


}


inputParent.classList.remove('is-invalid');


inputParent.classList.add('is-valid');


input.removeAttribute('aria-describedby');

}
}

// On BLUR : check the input blured
inputs.forEach(input => {

input.addEventListener(


"blur", event => {



formCheck(input);


},


false

);
});

// On SUBMIT :
oForm.querySelector('[type="submit"]').addEventListener("click", function(e){

oForm.classList.add('is-submited');

const iLength = inputs.length;

inputs.forEach((input,index) => {


formCheck(input);


if(index >= iLength-1){



const invalidInputs = oForm.querySelectorAll(".is-invalid input, .is-invalid select");



if(invalidInputs.length > 0){




invalidInputs[0].focus();



}


}


input.addEventListener(



"invalid", event => {




event.preventDefault();



},



false


);

});
});

// On RESET :
oForm.querySelector('[type="reset"]').addEventListener("click", function(e){

oForm.classList.remove('is-submited');

inputs.forEach(input => {


let inputParent = input.closest('.form-field');


//inputs[0].focus();


inputParent.classList.remove('is-valid');


inputParent.classList.remove('is-invalid');

});

let msgErrors = document.querySelectorAll('.msg-form-error');

msgErrors.forEach(msgError => {


msgError.parentNode.removeChild(msgError);

});
});

Te puede interesar: