¿Cómo evitar que se envíe el formulario?


Tengo un formulario que tiene un botón de envío en alguna parte.

Sin embargo, me gustaría de alguna manera 'atrapar' el evento de envío y evitar que ocurra.

¿Hay alguna manera de que pueda hacer esto?

No puedo modificar el botón enviar, porque es parte de un control personalizado.

Author: marco-fiset, 2010-07-28

7 answers

A diferencia de las otras respuestas, return false es solo parte de la respuesta. Considere el escenario en el que se produce un error JS antes de la instrucción return...

Html

<form onsubmit="return mySubmitFunction(evt)">
  ...
</form>

Script

function mySubmitFunction()
{
  someBug()
  return false;
}

Devolver false aquí no se ejecutará y el formulario se enviará de cualquier manera. También debe llamar a preventDefault para evitar la acción de formulario predeterminada para los envíos de formularios Ajax.

function mySubmitFunction(evt) {
  evt.preventDefault();
  someBug();
  return false;
}

En este caso, incluso con el error, el formulario no ¡sométete!

Alternativamente, se podría usar un bloque try...catch.

function mySubmit(evt) { 
  evt.preventDefault(); 
  try {
   someBug();
  } catch (e) {
   throw new Error(e.message);
  }
  return false;
}
 176
Author: Ben Rowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-11 23:23:49

Puedes usar inline event onsubmit así

<form onsubmit="alert('stop submit'); return false;" >

O

<script>
   function toSubmit(){
      alert('I will not submit');
      return false;
   }
</script>

<form onsubmit="return toSubmit();" >

Demo

Ahora, esto puede no ser una buena idea al hacer grandes proyectos. Es posible que tenga que utilizar los oyentes de eventos.

Por favor lea más acerca de Eventos en línea vs Escucha de eventos (addEventListener y attachEvent de IE) aquí. Porque no puedo explicarlo más de lo que Chris Baker lo hizo.

Ambos son correctos, pero ninguno de ellos es "mejor" per se, y puede ser una razón por la que el desarrollador eligió usar ambos enfoques.

 125
Author: Reigel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-28 15:45:45

Adjunte un receptor de eventos al formulario usando .addEventListener() y luego llamar a la .preventDefault() método de event:

const element = document.querySelector('form');
element.addEventListener('submit', event => {
  event.preventDefault();
  // actual logic, e.g. validate the form
  console.log('Form submission cancelled.');
});
<form>
  <button type="submit">Submit</button>
</form>

Creo que es una mejor solución que definir un controlador de eventos submit en línea con el atributo onsubmit porque separa la lógica y la estructura de la página web. Es mucho más fácil mantener un proyecto donde la lógica está separada de HTML. Ver: Javascript discreto .

Usando la propiedad .onsubmit del objeto DOM form es no es una buena idea porque le impide adjuntar múltiples devoluciones de llamada de envío a un elemento. Ver addEventListener vs onclick .

 81
Author: Michał Perłakowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 10:05:12

Prueba este...

Código HTML

<form class="submit">
    <input type="text" name="text1"/>
    <input type="text" name="text2"/>
    <input type="submit" name="Submit" value="submit"/>
</form>

Código jQuery

$(function(){
    $('.submit').on('submit', function(event){
        event.preventDefault();
        alert("Form Submission stopped.");
    });
});

O

$(function(){
    $('.submit').on('submit', function(event){
       event.preventDefault();
       event.stopPropagation();
       alert("Form Submission prevented / stopped.");
    });
});
 10
Author: Sach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 07:36:16

Lo siguiente funciona a partir de ahora (probado en chrome y firefox):

<form onsubmit="event.preventDefault(); return validateMyForm();">

Donde validateMyForm() es una función que devuelve false si la validación falla. El punto clave es usar el nombre event. No podemos usar para, por ejemplo, e.preventDefault()

 7
Author: Vikram Pudi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 06:48:06
var form = document.getElementById("idOfForm");
form.onsubmit = function() {
  return false;
}
 6
Author: naikus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-28 05:57:27

Para seguir las convenciones de programación de JavaScript discreto , y dependiendo de la rapidez con la que se cargue el DOM, puede ser una buena idea usar lo siguiente:

<form onsubmit="return false;"></form>

Luego conecta eventos usando onload o DOM ready si estás usando una biblioteca.

$(function() {
    var $form = $('#my-form');
    $form.removeAttr('onsubmit');
    $form.submit(function(ev) {
        // quick validation example...
        $form.children('input[type="text"]').each(function(){
            if($(this).val().length == 0) {
                alert('You are missing a field');
                ev.preventDefault();
            }
        });
    });
});
label {
    display: block;
}

#my-form > input[type="text"] {
    background: cyan;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="my-form" action="http://google.com" method="GET" onsubmit="return false;">
    <label>Your first name</label>
    <input type="text" name="first-name"/>
    <label>Your last name</label>
    <input type="text" name="last-name" /> <br />
    <input type="submit" />
</form>

También, siempre usaría el atributo action ya que algunas personas pueden tener algún plugin como NoScript corriendo que luego rompería la validación. Si estás usando el atributo action, al menos tu usuario será redirigido por el servidor basado en la validación del backend. Si estás usando algo como window.location, por otro lado, las cosas serán malas.

 -1
Author: Sebastian Palma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 02:27:27