¿Cómo configurar mensajes de validación personalizados para formularios HTML?

7 minutos de lectura

Avatar de usuario de Skizit
esquizo

Tengo el siguiente formulario HTML: http://jsfiddle.net/nfgfP/

<form id="form" onsubmit="return(login())">
<input name="username" placeholder="Username" required />
<input name="pass"  type="password" placeholder="Password" required/>
<br/>Remember me: <input type="checkbox" name="remember" value="true" /><br/>
<input type="submit" name="submit" value="Log In"/>

Actualmente, cuando presiono Intro cuando ambos están en blanco, aparece un cuadro emergente que dice “Complete este campo”. ¿Cómo cambiaría ese mensaje predeterminado a “Este campo no se puede dejar en blanco”?

El mensaje de error del campo de tipo de contraseña es simplemente *****. Para recrear esto, asigne un valor al nombre de usuario y presione enviar.

  • ¿Por qué no simplemente aceptar el mensaje predeterminado del navegador? Eso es lo que los usuarios ven en todos los demás sitios que visitan, solo confundirá a sus usuarios al crear un mensaje no estándar. (¡Google probablemente ha manejado más evaluaciones y pruebas de UX para determinar esa redacción que tú!).

    – ChrisV

    4 de diciembre de 2011 a las 15:27

  • @ChrisV ¿Qué pasa con los sitios multilingües?

    – inemanja

    26 de noviembre de 2013 a las 11:22

  • En mi caso, quiero verificar que el valor sea un número antes de publicar, pero no puedo usar el atributo type=”number” (por razones). Así que configuré el atributo de patrón para buscar números y decimales opcionales que dan el mensaje. , “Por favor, haga coincidir el formato solicitado”, en caso de error. Preferiría que dijera: “Debes regalarnos un número bucko”.

    – Kristopher

    29 de marzo de 2017 a las 14:58

Avatar de usuario de Somnath Kadam
Somnath Kadam

Aquí hay un código para mostrar un mensaje de error personalizado:

<input type="text" id="username" required placeholder="Enter Name"
       oninvalid="ths.setCustomValidity('Enter User Name Here')"
       oninput="setCustomValidity('')"/>

Esta parte es importante porque oculta el mensaje de error cuando el usuario ingresa nuevos datos:

oninput="setCustomValidity('')"

Nota la this La palabra clave no es necesaria para los controladores de eventos en línea, pero es posible que desee usarla de todos modos para mantener la coherencia.

  • Tenga en cuenta que incluso puede omitir el this. en este caso porque los controladores de eventos en línea se ejecutan con un with(this) (no digo que debas)

    – phil294

    3 oct 2019 a las 11:05

avatar de usuario de robertc
roberto

Usar setCustomValidity:

document.addEventListener("DOMContentLoaded", function() {
    var elements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("This field cannot be left blank");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})

I cambiado a vainilla JavaScript de Mootools como lo sugiere @itpastorn en los comentarios, pero debería poder calcular el equivalente de Mootools si es necesario.

Si setCustomValidity se establece en cualquier otra cosa que no sea la cadena vacía, hará que el campo se considere no válido; por lo tanto, debe borrarlo antes de probar la validez, no puede configurarlo y olvidarlo.

Como se señala en el comentario de @thomasvdb a continuación, debe borrar la validez personalizada en algún evento fuera de invalid de lo contrario, puede haber un pase adicional a través de la oninvalid controlador para limpiarlo.

  • ¿Por qué cuando reemplazo elementos[i] a $(“#nombre”), ¿no funciona? Y si configuro 2 validaciones, se requiere type=’number’, por ejemplo, ¿puedo configurar un mensaje personalizado diferente para ellos?

    – Lai32290

    23 de marzo de 2014 a las 12:58

  • @ Lai32290 porque no está accediendo al objeto DOM real. $("") devuelve una matriz de objetos, incluso si solo hay uno. $("")[i] es muy probable que sea lo que quieres.

    – Noah Passalacqua

    21 de mayo de 2016 a las 17:12

  • No estoy diciendo que este código sea o no sea bueno, sin embargo, el punto de tener una validación de formulario en HTML5 es no requieren JavaScript para la validación de formularios, por lo tanto, utilizando el oninvalid atributo incluso para los “puristas” es completamente inútil.

    – John

    1 de agosto de 2018 a las 12:03

  • Esto funciona bien para la entrada con el atributo requerido. Sin embargo, no es aplicable para input type=”email”. Después de haber ingresado el primer carácter de su dirección de correo electrónico, recurre al mensaje de error estándar “Incluya ‘@’ para …” Intenté atrapar esto con else if (e.target.validity.typeMismatch) { e.target. setCustomValidity(“Mi propio mensaje”). Sin éxito. Cualquier sugerencia ?

    – Mathias Zaja

    20 de abril de 2019 a las 18:49

Avatar de usuario de Ashwini Jain
Ashwini jainista

Es muy sencillo controlar los mensajes personalizados con la ayuda de HTML5 evento oninvalid

Aquí está el código:

<input id="UserID"  type="text" required="required"
       oninvalid="this.setCustomValidity('Witinnovation')"
       onvalid="this.setCustomValidity('')">

Esto es lo más importante:

onvalid="this.setCustomValidity('')"

  • También verifique otras validaciones, como patrón, valores mínimos / máximos, etc. sanalksankar.blogspot.com/2010/12/…

    – Jaider

    24 de noviembre de 2012 a las 21:55

  • Esto provoca un error en Firefox donde se valida al actualizar, pero falla al cambiar y corregir.

    –Ryan Charmley

    29 de agosto de 2013 a las 18:07

  • @RyanCharmley usando onchange="this.setCustomValidity('')" el bicho se habrá ido. Revisa mi respuesta a continuación.

    – Salar

    1 de abril de 2014 a las 5:00


  • Si esto no funciona (no funciona en Safari, por ejemplo), utilice oninput en lugar de onvalid.

    – Jimothy

    27 de marzo de 2018 a las 17:29

  • @Jimothy tiene razón en esto, oninput es la solución más universal, onvalid no funcionó ni siquiera en Chrome para mí.

    – Este chico no puede ni siquiera

    11 de junio de 2018 a las 15:55

avatar de usuario de kzh
kzh

Nota: Esto ya no funciona en Chrome, no está probado en otros navegadores. Ver ediciones a continuación. Esta respuesta se deja aquí como referencia histórica.

Si cree que la cadena de validación realmente no debe establecerse por código, puede configurar el atributo de título del elemento de entrada para que diga “Este campo no se puede dejar en blanco”. (Funciona en Chrome 10)

title="This field should not be left blank."

Ver http://jsfiddle.net/kaleb/nfgfP/8/

Y en Firefox, puedes agregar este atributo:

x-moz-errormessage="This field should not be left blank."

Editar

Esto parece haber cambiado desde que originalmente escribí esta respuesta. Ahora, agregar un título no cambia el mensaje de validez, solo agrega un anexo al mensaje. El violín anterior todavía se aplica.

Editar 2

Chrome ahora no hace nada con el atributo de título a partir de Chrome 51. No estoy seguro en qué versión cambió esto.

Avatar de usuario de Dharmendra Jha
Dharmendra Jha

Es muy sencillo controlar los mensajes personalizados con la ayuda del HTML5 oninvalid evento

Aquí está el código:

User ID 
<input id="UserID"  type="text" required 
       oninvalid="this.setCustomValidity('User ID is a must')">

  • es necesario dejar en blanco el mensaje de validez una vez que el control recibe la entrada; de lo contrario, se mostrará el primer mensaje de validez ejecutado para todos los campos. Agregue oninput=”setCustomValidity(”)” cada vez que llame a setCustomValidity(). +1 a la respuesta de Somnath.

    – Tarang

    27 de abril de 2015 a las 15:48


Al armar y desarmar el setCustomValidity en el momento adecuado, el mensaje de validación funcionará sin problemas.

<input name="Username" required 
oninvalid="this.setCustomValidity('Username cannot be empty.')" 
onchange="this.setCustomValidity('')" type="text" />

solía onchange en lugar de oninput que es más general y ocurre cuando el valor se cambia en cualquier condición, incluso a través de JavaScript.

  • es necesario dejar en blanco el mensaje de validez una vez que el control recibe la entrada; de lo contrario, se mostrará el primer mensaje de validez ejecutado para todos los campos. Agregue oninput=”setCustomValidity(”)” cada vez que llame a setCustomValidity(). +1 a la respuesta de Somnath.

    – Tarang

    27 de abril de 2015 a las 15:48


avatar de usuario de hleinone
hleinone

He creado una pequeña biblioteca para facilitar el cambio y la traducción de los mensajes de error. Incluso puede cambiar los textos por tipo de error que actualmente no está disponible usando title en cromo o x-moz-errormessage en Firefox. Ir échale un vistazo en GitHuby dar retroalimentación.

Se usa como:

<input type="email" required data-errormessage-value-missing="Please input something">

Hay una demostración disponible en jsFiddle.

¿Ha sido útil esta solución?