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.
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 unwith(this)
(no digo que debas)– phil294
3 oct 2019 a las 11:05
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
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 deonvalid
.– 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
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.
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
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.
¿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