Cómo forzar la validación de un formulario HTML sin enviarlo a través de jQuery

7 minutos de lectura

avatar de usuario de razenha
Razenha

Tengo este formulario en mi aplicación y lo enviaré a través de AJAX, pero quiero usar HTML para la validación del lado del cliente. Entonces quiero poder forzar la validación del formulario, quizás a través de jQuery.

Quiero activar la validación sin enviar el formulario. ¿Es posible?

  • ¿Puede especificar en qué momento desea validar el formulario? ¿Qué desencadena la validación? ¿Desea validar cada campo cuando el usuario escribe, ingresa/abandona el campo, cambia el valor?

    -Peter Pajchl

    8 de agosto de 2012 a las 21:12

  • Me gustaría poder hacer algo así: $(“#my_form”).triggerHtml5Validation()

    – razenha

    8 de agosto de 2012 a las 21:29


  • Esta página podría ayudar enlace

    – Dan Bray

    19 de marzo de 2016 a las 16:24

Avatar de usuario de Abraham
Abrahán

Para comprobar si un determinado campo es válido, utilice:

$('#myField')[0].checkValidity(); // returns true|false

Para comprobar si el formulario es válido, utilice:

$('#myForm')[0].checkValidity(); // returns true|false

Mostrar error integrado de html5

if (! $('#myForm')[0].checkValidity()) {
      $('#myForm')[0].reportValidity()
}

Tenga en cuenta que, hasta ahora, la validación de HTML5 no es compatible con todos los navegadores.

  • Intenta reemplazar $myForm.submit() con $myForm.find(':submit').click()

    – Abrahán

    1 de diciembre de 2012 a las 17:18

  • Abrahán tiene razón. Tienes que hacer clic en el botón Enviar (programadamente). Llamar a $myForm.submit() no activará la validación.

    -Kevin Tighe

    27 de marzo de 2013 a las 18:06

  • Si su formulario no tiene un botón de envío, puede falsificar uno: $('<input type="submit">').hide().appendTo($myForm).click().remove();

    – Philfreo

    7 de noviembre de 2014 a las 22:14


  • Esta respuesta es muy útil debido a la sugerencia sobre checkValidity()pero también tiene un error peligroso. checkValidity() es lo que activa los mensajes de error del navegador nativo, no el clic del botón Enviar. Si tiene un detector de eventos que escucha cuando se hace clic en el botón de envío, lo activará cuando haga ` $myForm.find(‘:submit’).click()`, que se activará solo y provocará una recurrencia infinita.

    – Solicitud incorrecta

    28 de enero de 2015 a las 18:02

  • use .reportValidity(); para mostrar mensajes de error nativos del navegador sin enviar el formulario

    – Marco Marsala

    15 de abril de 2020 a las 18:38

Avatar de usuario de Boopathi.Indotnet
Boopathi.Indotnet

el siguiente código funciona para mí,

$("#btn").click(function () {

    if ($("#frm")[0].checkValidity())
        alert('sucess');
    else
        //Validate Form
        $("#frm")[0].reportValidity()

});

  • reportValidity() es la mejor función para resaltar los campos obligatorios.

    – Jamshad Ahmad

    31 de diciembre de 2019 a las 7:26

  • Sí, esto funciona de maravilla, pero solo si el navegador lo admite. caniuse.com/#search=reportValidez

    – Mate

    31 de enero de 2020 a las 21:28

  • ¿Por qué no solo .reportValidity()? También comprobará la validez y devolverá verdadero/falso.

    – Przemyslaw Niemiec

    28 de diciembre de 2020 a las 12:33

Avatar de usuario de Martin Christensen
Martín Christensen

Encontré esta solución para trabajar para mí. Simplemente llame a una función de javascript como esta:

action="javascript:myFunction();"

Luego tienes la validación html5… realmente simple 🙂

  • Esto funcionó para mí también y creo que esta es la mejor respuesta. lo puse action="javascript:0" sobre el <form> y atado click evento en el <button> a MyFunction() y todo funcionó muy bien. Mantengo todo JS fuera de HTML. MyFunction entonces puede probar form.checkValidity() continuar.

    – orad

    16/10/2013 a las 19:20


  • El código de muestra siempre es útil.

    – BJ Patel

    19/03/2016 a las 17:35


  • Enlace al formulario onsubmit() casi siempre es mejor que vincular a un botón onclick(), ya que hay otras formas de enviar un formulario. (Sobre todo al golpear el return llave.)

    – etiqueta alternativa

    11 de abril de 2016 a las 17:59

  • +1 Esto es increíble. no más validación del método javascript si el campo está vacío o si es un correo electrónico. ¡El navegador puede hacerlo por nosotros! ¿Es compatible con varios navegadores?

    – José.

    15 de junio de 2016 a las 9:42


  • Ni action="javascript:myFunction();" o action="javascript:0" funciona más en la última versión de Firefox (67). Sin embargo, funciona en Chrome.

    – Bobz

    14 de julio de 2019 a las 3:08

    if $("form")[0].checkValidity()
      $.ajax(
        url: "url"
        type: "post"
        data: {

        }
        dataType: "json"
        success: (data) ->

      )
    else
      #important
      $("form")[0].reportValidity()

de: validación de formulario html5

Avatar de usuario de Samuel Gfeller
Samuel Gfeller

Solución JS vainilla 2022

Pure JavaScript tiene todas las funciones que necesita para esto. Sé que la pregunta era sobre jQuery, pero incluso las respuestas con jQuery usan estas funciones, que son checkValidity() y reportValidity().

Probar todo el formulario

let form = document.getElementById('formId');
// Eventlistener can be another event and on another DOM object this is just an example
form.addEventListener('submit', function (event) {
    // Only needed if event is submit, otherwise this line can be skipped 
    event.preventDefault();

    // This is the important part, test if form is valid
    if (form.checkValidity() === false){
        // This is the magic function that displays the validation errors to the user
        form.reportValidity();   
        return; 
    }

    // Code if all fields are valid; continue form submit or make Ajax call.
})

Probar campo específico

checkValidity() y reportValidity() no solo se puede usar en el formulario, sino también en campos específicos. No es necesario crear un formulario o un botón de envío ficticio si no es necesario.

// Get field of interest
let inputElement = document.querySelector("[name="" + inputName + ""]");
// Check if the element is valid
if (inputElement.checkValidity() === false){
    // If not, show the errors to the user
    inputElement.reportValidity();
    return;
}

// Nothing? Great, continue to the Ajax call or whatever

Esto tiene que estar en una función llamada por un detector de eventos para que tenga sentido, obviamente.

  • si tienes jQuery $("#myform") entonces te vas $("#myform")[0].checkValidity()

    – Fanky

    22 de febrero de 2022 a las 16:14


  • Esta es la mejor respuesta en esta página jajaja jQuery L – vainilla JS hasta el final.

    – devon t

    6 de junio de 2022 a las 15:47

Aquí hay una forma más general que es un poco más limpia:

Cree su formulario de esta manera (puede ser un formulario ficticio que no hace nada):

<form class="validateDontSubmit">
...

Enlaza todos los formularios que realmente no quieras enviar:

$(document).on('submit','.validateDontSubmit',function (e) {
    //prevent the form from doing a submit
    e.preventDefault();
    return false;
})

Ahora digamos que tienes un <a> (dentro de <form>) que al hacer clic quiere validar el formulario:

$('#myLink').click(function(e){
  //Leverage the HTML5 validation w/ ajax. Have to submit to get em. Wont actually submit cuz form
  //has .validateDontSubmit class
  var $theForm = $(this).closest('form');
  //Some browsers don't implement checkValidity
  if (( typeof($theForm[0].checkValidity) == "function" ) && !$theForm[0].checkValidity()) {
     return;
  }

  //if you've gotten here - play on playa'
});

Algunas notas aquí:

  • Me di cuenta de que no es necesario que envíe el formulario para que se produzca la validación: la llamada a checkValidity() es suficiente (al menos en cromo). Si otros pudieran agregar comentarios probando esta teoría en otros navegadores, actualizaré esta respuesta.
  • Lo que desencadena la validación no tiene que estar dentro del <form>. Esta fue solo una forma limpia y flexible de tener una solución de uso general.

  • si tienes jQuery $("#myform") entonces te vas $("#myform")[0].checkValidity()

    – Fanky

    22 de febrero de 2022 a las 16:14


  • Esta es la mejor respuesta en esta página jajaja jQuery L – vainilla JS hasta el final.

    – devon t

    6 de junio de 2022 a las 15:47

avatar de usuario de vzr
vzr

Puede que llegue tarde a la fiesta, pero de alguna manera encontré esta pregunta mientras intentaba resolver un problema similar. Como ningún código de esta página funcionó para mí, mientras tanto, encontré una solución que funciona como se especifica.

El problema es cuando tu <form> DOM contiene solo <button> elemento, una vez disparado, que <button> enviará automáticamente el formulario. Si juegas con AJAX, probablemente necesites evitar la acción predeterminada. Pero hay una trampa: si solo lo hace, también evitará la validación básica de HTML5. Por lo tanto, es una buena idea evitar valores predeterminados en ese botón solo si el formulario es válido. De lo contrario, la validación de HTML5 lo protegerá de enviar. jQuery checkValidity() ayudará con esto:

jQuery:

$(document).ready(function() {
  $('#buttonID').on('click', function(event) {
    var isvalidate = $("#formID")[0].checkValidity();
    if (isvalidate) {
      event.preventDefault();
      // HERE YOU CAN PUT YOUR AJAX CALL
    }
  });
});

El código descrito anteriormente le permitirá utilizar la validación HTML5 básica (con coincidencia de tipo y patrón) SIN enviar el formulario.

¿Ha sido útil esta solución?