¿Puedo marcar un campo no válido desde javascript?

94

Al leer esta publicación , descubrí que hay algunas pseudoclases para valores de entrada 'válidos' e 'inválidos' introducidos en HTML5.

¿Hay alguna manera de marcar un campo de entrada como no válido / válido desde javascript? O alternativamente, ¿puedo anular el método de validación utilizado?

Svish
fuente
Siempre se puede duplicar con una clase "inválida", pero sería muy interesante saber que hay una forma mejor.
puntiagudo
1
Sí, por supuesto, pero eso sería aburrido;)
Svish
1
Svish, ¿puedes reevaluar las respuestas a continuación? Parece que dajavax proporcionó una respuesta que hace exactamente lo que quería. Puede ser útil para otros visitantes si marcó la respuesta de dajavax como la aceptada.
Kodos Johnson
@KodosJohnson Definitivamente, gracias por el aviso 🙂
Svish

Respuestas:

160

Puede utilizar la función customValidity para este propósito.

Si agrega un mensaje customValidity al campo, dejará de ser válido. Cuando configura el mensaje como una cadena vacía, vuelve a ser válido (a menos que no sea válido por otras razones).

field.setCustomValidity("Invalid field."); invalidará el campo.

field.setCustomValidity(""); hará que el campo sea válido a menos que falle una restricción HTML5.

dajavax
fuente
1
Increíble. Gracias. Agregado a codepen.io/kevinSuttle/post/the-current-state-of-web-forms
Kevin Suttle
4
Además, si desea que aparezca el mensaje de validez del navegador inputo blurpuede usar field.reportValidity () inmediatamente después.
Sam Carlton
4

Editar : Alguien aclaró que está buscando atributos "válidos" "no válidos" para DOM.

Agregaría atributos a cada etiqueta usando dom_object.setAttribute("isvalid", "true"). También podría tener una función de validación central que actualice estos atributos cada vez (y use dom_object.getAttribute("isvalid")cada vez).

Puede ejecutar esta función cada vez que un elemento pierde el foco o cuando lo desee.

No es exactamente elegante, pero desafortunadamente no hay soporte "pseudo" con javascript y HTML5 ahora.


Si entiendo su pregunta, puede realizar la validación con Javascript. Sin embargo, tenga en cuenta que es muy fácil eludir la validación del lado del cliente, especialmente la validación de JavaScript . Nunca debe confiar en los datos del cliente y siempre debe verificar en el lado del servidor.

Por ejemplo, podría encontrar fácilmente los ID de los elementos inspeccionando el código fuente y luego document.getElementById('some_id').setAttribute('max', new_number)cambiar el valor máximo (esta era una de las entradas de su enlace).

Hay varias formas de hacerlo, así que intentaré darles el modismo general.

Puede tomar el valor haciendo document.getElementById('form_element_id').value(asegúrese de dar el formulario a nameque se envía al servidor y idque es utilizado por JavaScript). Para áreas de texto, puede usar .innerHTML.

Entonces tienes el valor en una variable, hay varias formas de verificarlo.

Por ejemplo, podrías hacerlo if (parseInt(my_value) < 0) //error. También puede usar expresiones regulares, no lo explicaré todo, pero puede comenzar aquí http://www.w3schools.com/jsref/jsref_obj_regexp.asp . Sé que w3schools no es la mejor fuente, pero me parece un buen lugar para comenzar.

Ahora para la parte de validación: agregue onsubmit="return validateForm()a su etiqueta de formulario donde validateForm () es la función que hace toda la verificación. Y la función simplemente regresa truesi es válida y de lo falsecontrario. Esto anula la función de validación predeterminada (que por defecto no hace nada).

Entonces, en el ejemplo anterior, //errorsería reemplazado por return false. También puedes hacer otras cosas; como alertar el error y luego devolver falso. También puede usar javascript para resaltar los campos no válidos (no estoy seguro de si esto es lo que quiere decir con " marcar un campo de entrada como no válido / válido desde javascript ")

Por supuesto, si no desea marcar todos los campos, solo debe devolver verdadero si se aprueban determinados. Nuevamente, no debe confiar en esto, pero si solo desea disuadir a la gente promedio, entonces es una solución fácil.

Raekye
fuente
9
Tienes toda la razón, pero no creo que hayas entendido la pregunta por completo. En HTML5, hay varias formas de agregar valores de atributo al marcado HTML que implican reglas de validación integradas. Cuando un navegador aplica esas reglas, un campo de entrada coincidirá con las pseudoclases ": válido" o ": no válido" en CSS. Por lo tanto, puede escribir HTML con esos atributos y CSS con selectores ": válido" y ": inválido" con reglas, y dar retroalimentación visual sin ningún tipo de JavaScript. La pregunta es si el estado ": válido" está disponible como un atributo DOM, básicamente.
Puntiagudo
-17

¿Hay alguna manera de marcar un campo de entrada como no válido / válido desde javascript?

Desafortunadamente, no puede diseñar pseudoclases en JavaScript, ya que no son elementos reales, no existen en el DOM real.

Con JavaScript vanilla, usaría la API de validación .

En jQuery, simplemente puede hacer esto, http://jsfiddle.net/elclanrs/Kak6S/

if ( $input.is(':invalid') ) { ... }

O alternativamente, ¿puedo anular el método de validación utilizado?

Si está utilizando la validación HTML5, apéguese al marcado. De lo contrario, puede deshabilitar la validación de HTML5 con $form.attr('novalidate', 'novalidate')JS y usar JS para validar sus campos y luego agregar valido invalidclases donde sea necesario. Hice un complemento que funciona así para admitir navegadores que no son HTML5.

elclanrs
fuente
¿Qué quieres decir con que no puedes diseñarlos? Ya lo estoy haciendo. input:invalid + label::after{content: " INVALID";color: red;}Agrega una pieza roja de texto INVÁLIDO después de la etiqueta que tengo al lado del campo de entrada si el campo no es válido (por ejemplo, si un campo de correo electrónico tiene un correo electrónico no válido)
Svish
11
"¿Hay alguna forma de marcar un campo de entrada como no válido / válido desde javascript?" "Desafortunadamente, no se pueden diseñar pseudoclases desde JavaScript" Eso no es lo que hacía la pregunta.
mikemaccana
Sin embargo, debería poder usar CSSOM para definir una nueva clase con una pseudoclase dinámicamente ...
Brett Zamir