Detener la página de actualización de formulario al enviar


150

¿Cómo evitaría que la página se actualizara al presionar el botón enviar sin ningún dato en los campos?

La validación está configurada funcionando bien, todos los campos se vuelven rojos pero luego la página se actualiza inmediatamente. Mi conocimiento de JS es relativamente básico.

En particular, creo que la processForm()función en la parte inferior es 'mala'.

HTML

<form id="prospects_form" method="post">
    <input id="form_name" tabindex="1" class="boxsize" type="text" name="name" placeholder="Full name*" maxlength="80" value="" />
    <input id="form_email" tabindex="2" class="boxsize" type="text" name="email" placeholder="Email*" maxlength="100" value="" />
    <input id="form_subject" class="boxsize" type="text" name="subject" placeholder="Subject*" maxlength="50" value="FORM: Row for OUBC" />
    <textarea id="form_message" class="boxsize" name="message" placeholder="Message*" tabindex="3" rows="6" cols="5" maxlength="500"></textarea>

    <button id="form_send" tabindex="5" class="btn" type="submit" onclick="return processForm()">Send</button>
    <div id="form_validation">
        <span class="form_captcha_code"></span>
        <input id="form_captcha" class="boxsize" type="text" name="form_captcha" placeholder="Enter code" tabindex="4" value="" />
    </div>
    <div class="clearfix"></div>
</form>

JS

$(document).ready(function() { 

// Add active class to inputs
$("#prospects_form .boxsize").focus(function() { $(this).addClass("hasText"); });
$("#form_validation .boxsize").focus(function() { $(this).parent().addClass("hasText"); });
// Remove active class from inputs (if empty)
$("#prospects_form .boxsize").blur(function() { if ( this.value === "") { $(this).removeClass("hasText"); } });
$("#form_validation .boxsize").blur(function() { if ( this.value === "") { $(this).parent().removeClass("hasText"); } });



///////////////////
// START VALIDATION
$("#prospects_form").ready(function() {

    // DEFINE GLOBAL VARIABLES
    var valName = $('#form_name'),
        valEmail = $("#form_email"),
        valEmailFormat = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
        valMsg = $('#form_message'),
        valCaptcha = $('#form_captcha'),
        valCaptchaCode = $('.form_captcha_code');



    // Generate captcha
    function randomgen() {
        var rannumber = "";
        // Iterate through 1 to 9, 4 times
        for(ranNum=1; ranNum<=4; ranNum++){ rannumber+=Math.floor(Math.random()*10).toString(); }
        // Apply captcha to element
        valCaptchaCode.html(rannumber);
    }
    randomgen();


    // CAPTCHA VALIDATION
    valCaptcha.blur(function() {
        function formCaptcha() {
            if ( valCaptcha.val() == valCaptchaCode.html() ) {
                // Incorrect
                valCaptcha.parent().addClass("invalid");
                return false;
            } else {
                // Correct
                valCaptcha.parent().removeClass("invalid");
                return true;
            }
        }
        formCaptcha();
    });

    // Remove invalid class from captcha if typing
    valCaptcha.keypress(function() {
        valCaptcha.parent().removeClass("invalid");
    });


    // EMAIL VALIDATION (BLUR)
    valEmail.blur(function() {
        function formEmail() {
            if (!valEmailFormat.test(valEmail.val()) && valEmail.val() !== "" ) {
                // Incorrect
                valEmail.addClass("invalid");
            } else {
                // Correct
                valEmail.removeClass("invalid");
            }
        }
        formEmail();
    });

    // Remove invalid class from email if typing
    valEmail.keypress(function() {
        valEmail.removeClass("invalid");
    });


    // VALIDATION ON SUBMIT
    $('#prospects_form').submit(function() {
        console.log('user hit send button');

        // EMAIL VALIDATION (SUBMIT)
        function formEmailSubmit() {
            if (!valEmailFormat.test(valEmail.val())) {
                // Incorrect
                valEmail.addClass("invalid");
            } else {
                // Correct
                valEmail.removeClass("invalid");
            }
        }
        formEmailSubmit();

        // Validate captcha
        function formCaptchaSubmit() {
            if( valCaptcha.val() === valCaptchaCode.html() ) {
                // Captcha is correct
            } else {
                // Captcha is incorrect
                valCaptcha.parent().addClass("invalid");
                randomgen();
            }
        }
        formCaptchaSubmit();


        // If NAME field is empty
        function formNameSubmit() {
            if ( valName.val() === "" ) {
                // Name is empty
                valName.addClass("invalid");
            } else {
                valName.removeClass("invalid");
            }
        }
        formNameSubmit();


        // If MESSAGE field is empty
        function formMessageSubmit() {
            if ( valMsg.val() === "" ) {
                // Name is empty
                valMsg.addClass("invalid");
            } else {
                valMsg.removeClass("invalid");
            }
        }
        formMessageSubmit();


        // Submit form (if all good)
        function processForm() {
            if ( formEmailSubmit() && formCaptchaSubmit() && formNameSubmit() && formMessageSubmit() ) {
                $("#prospects_form").attr("action", "/clients/oubc/row-for-oubc-send.php");
                $("#form_send").attr("type", "submit");
                return true;
            } else if( !formEmailSubmit() ) {
                valEmail.addClass("invalid");
                return false;
            } else if ( !formCaptchaSubmit() ) {
                valCaptcha.parent().addClass("invalid");
                return false;
            } else if ( !formNameSubmit() ) {
                valName.addClass("invalid");
                    return false;
                } else if ( !formMessageSubmit() ) {
                    valMsg.addClass("invalid");
                    return false;
                } else {
                    return false;
                }
            }
        });
    });
    // END VALIDATION
    /////////////////
});

Respuestas:


177

Puede evitar que el formulario se envíe con

$("#prospects_form").submit(function(e) {
    e.preventDefault();
});

Por supuesto, en la función, puede verificar si hay campos vacíos, y si algo no se ve bien, e.preventDefault() detendrá el envío.

Sin jQuery:

var form = document.getElementById("myForm");
function handleForm(event) { event.preventDefault(); } 
form.addEventListener('submit', handleForm);

44
Este método requiere jQuery. Creo que siempre es mejor prevenirlo con el atributo de tipo de botón.
Vicky Gonsalves

25
Este método se puede hacer sin jQuery con algo como: var form = document.getElementById("myForm"); function handleForm(event) { event.preventDefault(); } form.addEventListener('submit', handleForm); Parece que no tengo idea de cómo formatear un comentario correctamente.
Tynach

1
Básicamente, incluya event.preventDefault();en su formulario el código de manejo de envío. Una variante de una línea de lo que puse en mi otro comentario (básicamente lo mismo que la versión jQuery) sería: document.getElementById("prospects_form").addEventListener('submit', function(event){event.preventDefault();});Puede haber una forma de acortar eso (al no usar addEventListener(), pero parece que esas formas de hacer las cosas generalmente están mal vistas) sobre.
Tynach

84

Agregue este código onsubmit = "return false":

<form name="formname" onsubmit="return false">

Eso me lo arregló. Seguirá ejecutando la función onClick que especifique


44
Y seguirá ejecutando la validación de formularios del navegador HTML5.
Daniel Sokolowski el

1
No se requieren librerías, jquery es impresionante, nativo es mejor en este caso
calbertts

44
Esta es la solución más limpia sin JQuery. Además, también puedes usarlo como; onsubmit = "return submitFoo ()" y return false en submitFoo () si necesita llamar a una función en submit.
bmkorkut

8
pero nunca permitirá que se envíe el formulario.
Arun Raaj

75

Reemplace el tipo de botón para button:

<button type="button">My Cool Button</button>

3
Este es el único método sugerido que evita que la página se actualice incluso si hay un error de Javascript que puede ser útil para las pruebas y el desarrollo.
jjz

14
Esto es útil, pero no impide el envío / recarga cuando el usuario presiona [Enter].
System.Cats.Lol

14
no es bueno para la validación del formulario: / necesita un botón de envío en un elemento del formulario
RomOne

Creo que esto funcionará si está seguro de que el lado del cliente siempre usará JavaScript; de lo contrario, no debería excluirse un botón de tipo enviar
briancollins081

1
@ briancollins081 Esta no es una solución global. Esta respuesta solo se refiere a la situación actual del OP y si no hay javascript, OP nunca podrá enviar el formulario en ningún lugar, aunque button type="submit"haya enviado el formulario sobre la acción del botón usando jQuery.
Vicky Gonsalves

16

Puede usar este código para enviar formularios sin actualizar la página. He hecho esto en mi proyecto.

$(function () {
    $('#myFormName').on('submit',function (e) {

              $.ajax({
                type: 'post',
                url: 'myPageName.php',
                data: $('#myFormName').serialize(),
                success: function () {
                 alert("Email has been sent!");
                }
              });
          e.preventDefault();
        });
});

Esta respuesta es la única que mantiene el formulario funcionando como debería. En mi caso, es la única solución ya que obtengo mi formulario de un tercero y no puedo jugar demasiado con él.
rustypaper

12

Una excelente manera de evitar volver a cargar la página cuando se envía mediante un formulario es agregando return falsecon su atributo onsubmit.

<form action="#" onsubmit="yourJsFunction();return false">
    <input type="text"/>
    <input type="submit"/>
</form>

3
Esto funcionó totalmente para mí. Esto debe ser aceptado respuesta. action='#'
Ashok MA

1
Hilo súper viejo, pero para cualquiera que se encuentre con esto ahora, no lo intente action="#"porque no funciona y no es una solución adecuada. La clave es en realidadonsubmit="yourJsFunction();return false"
Jeff

pero no crees que devolver falso no es elegante?
Vicky Gonsalves

8

Este problema se vuelve más complejo cuando le da al usuario 2 posibilidades para enviar el formulario:

  1. haciendo clic en un botón ad hoc
  2. presionando la tecla Enter

En tal caso, necesitará una función que detecte la tecla presionada en la que enviará el formulario si se pulsa la tecla Intro.

Y ahora viene el problema con IE (en cualquier caso, la versión 11) Observación: ¡Este problema no existe con Chrome ni con FireFox!

  • Cuando hace clic en el botón Enviar, el formulario se envía una vez; multa.
  • Cuando presionas Enter, el formulario se envía dos veces ... y tu servlet se ejecutará dos veces. Si no tiene servidores de arquitectura PRG (post redirect get) en el lado del servidor, el resultado puede ser inesperado.

Aunque la solución parece trivial, me llevó muchas horas resolver este problema, por lo que espero que sea útil para otras personas. Esta solución se ha probado con éxito, entre otros, en IE (v 11.0.9600.18426), FF (v 40.03) y Chrome (v 53.02785.143 m 64 bit)

El código fuente HTML & js está en el fragmento. El principio se describe allí. Advertencia:

No puede probarlo en el fragmento porque la acción posterior no está definida y presionar la tecla Intro podría interferir con el stackoverflow.

Si se enfrentó a este problema, simplemente copie / pegue el código js en su entorno y adáptelo a su contexto.

/*
 * inForm points to the form
 */
var inForm = document.getElementById('idGetUserFrm');
/*
 * IE submits the form twice
 * To avoid this the boolean isSumbitted is:
 *  1) initialized to false when the form is displayed 4 the first time
 * Remark: it is not the same event as "body load"
 */
var isSumbitted = false;

function checkEnter(e) {
  if (e && e.keyCode == 13) {
    inForm.submit();
    /*
      * 2) set to true after the form submission was invoked
      */
    isSumbitted = true;
  }
}
function onSubmit () {
  if (isSumbitted) {
    /*
    * 3) reset to false after the form submission executed
    */
    isSumbitted = false;
    return false;
  }
}
<!DOCTYPE html>
<html>
<body>

<form id="idGetUserFrm" method="post" action="servletOrSomePhp" onsubmit="return onSubmit()">
   First name:<br>
   <input type="text" name="firstname" value="Mickey">
   <input type="submit" value="Submit">
</form>

</body>
</html>


5

En Javascript puro, use: e.preventDefault()

e.preventDefault() se usa en jquery pero funciona en javascript.

document.querySelector(".buttonclick").addEventListener("click", 
function(e){

  //some code

  e.preventDefault();
})

4

La mayoría de las personas evitarían que el formulario se envíe llamando al event.preventDefault() función.

Otro medio es eliminar el atributo onclick del botón y obtener el código processForm()para .submit(function() {que return false;el formulario no se envíe. Además, haga que las formBlaSubmit()funciones devuelvan un valor booleano basado en la validez, para usar enprocessForm();

katshLa respuesta es la misma, solo que más fácil de digerir.

(Por cierto, soy nuevo en stackoverflow, dame orientación por favor).


2
Aunque es bueno saber que return false;también se detiene evento desde burbujeando el DOM - es una forma abreviada deevent.preventDefault(); event.stopPropagation();
Terry

4

La mejor solución es enviar una función a cualquier función que desee y devolver false después de ella.

onsubmit="xxx_xxx(); return false;"

3

Personalmente, me gusta validar el formulario al enviarlo y, si hay errores, simplemente devolver falso.

$('form').submit(function() {

    var error;

   if ( !$('input').val() ) {
        error = true
    }

    if (error) {
         alert('there are errors')
         return false
    }

});

http://jsfiddle.net/dfyXY/


3
 $("#buttonID").click(function (e) {
          e.preventDefault();
         //some logic here
 }

1

Si desea utilizar Javascript puro, el siguiente fragmento será mejor que cualquier otra cosa.

Supongamos :

HTML :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Form Without Submiting With Pure JS</title>
        <script type="text/javascript">
            window.onload = function(){
                /**
                 * Just Make sure to return false so that your request will not go the server script
                 */
                document.getElementById('simple_form').onsubmit = function(){
                    // After doing your logic that you want to do 

                    return false 
                }
            }
        </script>
    </head>
    <body>

    </body>
</html>
<form id="simple_form" method="post">
    <!-- Your Inputs will go here  -->
    <input type="submit" value="Submit Me!!" />
</form>

Espero que funcione para ti!


0
function ajax_form(selector, obj)
{

    var form = document.querySelectorAll(selector);

    if(obj)
    {

        var before = obj.before ? obj.before : function(){return true;};

        var $success = obj.success ? obj.success: function(){return true;};

        for (var i = 0; i < form.length; i++)
        {

            var url = form[i].hasAttribute('action') ? form[i].getAttribute('action') : window.location;

            var $form = form[i];

            form[i].submit = function()
            {

                var xhttp = new XMLHttpRequest();

                xhttp.open("POST", url, true);

                var FD = new FormData($form);

                /** prevent submiting twice */
                if($form.disable === true)

                    return this;

                $form.disable = true;

                if(before() === false)

                    return;

                xhttp.addEventListener('load', function()
                {

                    $form.disable = false;

                    return $success(JSON.parse(this.response));

                });

                xhttp.send(FD);

            }
        }
    }

    return form;
}

No comprobé cómo funciona. También puede enlazar (esto) para que funcione como jquery ajaxForm

úsalo como:

ajax_form('form',
{
    before: function()
    {
        alert('submiting form');
        // if return false form shouldn't be submitted
    },
    success:function(data)
    {
        console.log(data)
    }
}
)[0].submit();

devuelve nodos para que pueda hacer algo como enviar el ejemplo anterior

lejos de la perfección pero se supone que funciona, debe agregar el manejo de errores o eliminar la condición de desactivación


0

Simplemente use "javascript:" en su atributo de acción de formulario si no está usando action.


1
Incluya algún ejemplo para aclarar más su solución.
Vikash Pathak

0

A veces e.preventDefault (); funciona, los desarrolladores están contentos, pero a veces no funcionan, los desarrolladores están tristes y luego encontré una solución por la que a veces no funciona

el primer código a veces funciona

$("#prospects_form").submit(function(e) {
    e.preventDefault();
});

segunda opción ¿por qué no funciona? Esto no funciona porque jquery u otra biblioteca javascript no se carga correctamente, puede verificar en la consola que todos los archivos jquery y javascript se carguen correctamente o no.

Esto resuelve mi problema. Espero que esto te sea útil.


0

En mi opinión, la mayoría de las respuestas están tratando de resolver el problema planteado en su pregunta, pero no creo que sea el mejor enfoque para su escenario.

¿Cómo evitaría que la página se actualizara al presionar el botón enviar sin ningún dato en los campos?

A .preventDefault(), de hecho, no actualiza la página. Pero creo que un simple requireen los campos que desea rellenar con datos resolvería su problema.

<form id="prospects_form" method="post">
    <input id="form_name" tabindex="1" class="boxsize" type="text" name="name" placeholder="Full name*" maxlength="80" value="" required/>
    <input id="form_email" tabindex="2" class="boxsize" type="text" name="email" placeholder="Email*" maxlength="100" value="" required/>
    <input id="form_subject" class="boxsize" type="text" name="subject" placeholder="Subject*" maxlength="50" value="FORM: Row for OUBC" required/>
    <textarea id="form_message" class="boxsize" name="message" placeholder="Message*" tabindex="3" rows="6" cols="5" maxlength="500"></textarea>
</form>

Observe la requireetiqueta agregada al final de cada uno input. El resultado será el mismo: no actualizar la página sin ningún dato en los campos.


0

Espero que esta sea la ultima respuesta


$('#the_form').submit(function(e){
  e.preventDefault()
  alert($(this).serialize())
  // var values = $(this).serialize()
  // logic....
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form id="the_form">
   Label-A <input type="text" name='a'required><br>
   Label-B <input type="text" name="b" required><br>
   Label-C <input type="password" name="c" required><br>
   Label-D <input type="number" name="d" required><br>
   <input type="submit" value="Save without refresh">
</form>

-1

Para JavaScript puro, utilice el método de clic

<div id="loginForm">
    <ul class="sign-in-form">
        <li><input type="text" name="username"/></li>
        <li><input type="password" name="password"/></li>
        <li>
            <input type="submit" onclick="loginForm()" value="click" />
        </li>
    </ul>
</div>

<script>
function loginForm() {
    document.getElementById("loginForm").click();
}
</script>


-1

Acabo de encontrar una solución muy simple pero que funciona, al eliminar <form></form>de la sección que quería evitar publicar y actualizar.

<select id="youId" name="yourName">
<select> 
<option value="1</option>
<option value="2</option>
<option value="3</option>
</select>
<input id="formStockVal1" type="number"><br><br>
<form> 
<button type="reset" id="stockCancel">Cancel</button>
<button type="reset" id="stockConfirm">Add</button>
</form>

Aquí solo los botones se envían como deberían.


Elimine el atributo de nombre en los campos que no desea enviar al servidor. stackoverflow.com/a/12827917/458321
TamusJRoyce

-2

Simplemente ponga return así:

function validate()
{

  var username=document.getElementById('username').value;
  
	  if(username=="")
	  {
		return false;	
	  }
	  if(username.length<5&&username.length<15)
	  {
	  	alert("Length should between 5 to 15 characters");
	  	return false;
	  }
	  
	  return true;
}
body{
	padding: 0px;
	margin:0px;
}

input{
	display: block;
	margin-bottom:10px;
	height:25px;
	width:200px;
}

input[type="submit"]{
	margin:auto;
}

label{
	display:block;
	margin-bottom:10px;
}

form{
		width:500px;
		height:500px;
		border:1px solid green;
		padding:10px;
		margin:auto;
		top:0;
		bottom:0;
		left:0;
		right:0;
		position:absolute;		
}

.labels{
	width: 35%;
	box-sizing:border-box;
	display: inline-block;
}

.inputs{
	width: 63%;
	box-sizing:border-box;
	padding:10px;
	display: inline-block;
}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>FORM VALIDATION</title>
	<link rel="stylesheet" type="text/css" href="style.css">

	<script type="text/javascript" src="script.js"></script>
</head>

<body>
	<form action="#">
		<div class="labels">
			<label>Name</label>
			<label>Email</label>
		</div>

		<div class="inputs">
			<input type="text" name="username" id="username" required>
			<input type="text" name="email" id="email" required>
		</div>
		
		<input type="submit" value="submit" onclick="return validate();">
	</form>
</body>

</html>

Devuelve verdadero y falso de validate (); funcionar según el requisito


deberías dar una pista o proporcionar un fragmento de código en lugar de este gran fragmento de código
Felix Geenen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.