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
    /////////////////
});
M_Willett
fuente

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);
Overcode
fuente
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

usuario3413723
fuente
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>
Vicky Gonsalves
fuente
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();
        });
});
safeer008
fuente
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>
arunavkonwar
fuente
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>

Mathias Zaja
fuente
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();
})
Deke
fuente
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).

ambrosechua
fuente
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;"
xyz xyz
fuente
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/

sqram
fuente
3
 $("#buttonID").click(function (e) {
          e.preventDefault();
         //some logic here
 }
Alex
fuente
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!

Sr. Suryaa Jha
fuente
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

Łukasz Szpak
fuente
0

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

Kailash Kaswan
fuente
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.

Sumit Kumar Gupta
fuente
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.

Zebiano
fuente
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>

fuente
-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>

Dean Vollebregt
fuente
-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.

John_FistaH
fuente
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

Mohd Jahid
fuente
deberías dar una pista o proporcionar un fragmento de código en lugar de este gran fragmento de código
Felix Geenen