Interromper a atualização da página ao enviar

150

Como evitaria a atualização da página ao pressionar o botão enviar sem nenhum dado nos campos?

A validação está configurada funcionando bem, todos os campos ficam vermelhos, mas a página é atualizada imediatamente. Meu conhecimento de JS é relativamente básico.

Em particular, acho que a processForm()função na parte inferior é 'ruim'.

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
fonte

Respostas:

177

Você pode impedir que o formulário seja enviado com

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

Obviamente, na função, você pode procurar por campos vazios e, se algo não parecer certo, e.preventDefault() interromperá o envio.

Sem jQuery:

var form = document.getElementById("myForm");
function handleForm(event) { event.preventDefault(); } 
form.addEventListener('submit', handleForm);
Overcode
fonte
4
Este método requer jQuery. Eu acho que é sempre uma prática melhor evitá-lo com o atributo de tipo de botão.
Vicky Gonsalves
25
Esse método pode ser feito sem o jQuery com algo como: var form = document.getElementById("myForm"); function handleForm(event) { event.preventDefault(); } form.addEventListener('submit', handleForm); E eu não tenho idéia de como formatar um comentário corretamente, ao que parece.
Tynach 6/12/19
1
Basicamente, inclua event.preventDefault();no seu código de manipulação de envio de formulários. Uma variante de uma linha do que eu coloquei no meu outro comentário (basicamente o mesmo que a versão do jQuery) seria: document.getElementById("prospects_form").addEventListener('submit', function(event){event.preventDefault();});Pode haver uma maneira de tornar isso mais curto (por não usar addEventListener(), mas parece que essas maneiras de fazer as coisas geralmente são mal vistas) em cima.
Tynach
84

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

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

Isso consertou para mim. Ele ainda executará a função onClick que você especificar

user3413723
fonte
4
E ainda executará a validação de formulário do navegador HTML5.
Daniel Sokolowski
1
Sem bibliotecas necessárias, o jquery é incrível, o nativo é melhor nesse caso.
calbertts
4
Esta é a solução mais limpa sem o JQuery. Além disso, você também pode usá-lo como; onsubmit = "retorne submitFoo ()" e retorne false no submitFoo () se você precisar chamar uma função ao enviar.
bmkorkut
8
mas nunca permitirá que o formulário seja enviado.
Arun Raaj
75

Substitua o tipo de botão por button:

<button type="button">My Cool Button</button>
Vicky Gonsalves
fonte
3
Esse é o único método sugerido que impede a atualização da página, mesmo se houver um erro de Javascript que possa ser útil para teste e desenvolvimento.
Jjz 30/04
14
Isso é útil, mas não impede o envio / recarregamento quando o usuário pressiona [Enter].
precisa
14
não é bom para a validação de formulário: / você precisa de um botão enviar em um elemento de formulário
Romone
Eu acho que isso funcionará se você tiver certeza de que o lado do cliente sempre usará JavaScript, caso contrário, um botão do tipo enviar não deve ser excluído
briancollins081 09/01
1
@ briancollins081 Esta não é uma solução global. Esta resposta refere-se apenas à situação atual do OP e, se não houver javascript, o OP nunca poderá enviar o formulário em nenhum lugar, mesmo que button type="submit"ele tenha enviado o formulário na ação do botão usando o jQuery.
Vicky Gonsalves
16

Você pode usar esse código para enviar formulários sem atualizar a página. Eu fiz isso no meu projeto.

$(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
fonte
Essa resposta é a única que mantém a forma funcionando como deveria. No meu caso, é a única solução, pois estou recebendo meu formulário de terceiros e não posso brincar muito com ele.
rustypaper
12

Uma ótima maneira de impedir o recarregamento da página ao enviar usando um formulário é adicionando return falsecom o atributo onsubmit.

<form action="#" onsubmit="yourJsFunction();return false">
    <input type="text"/>
    <input type="submit"/>
</form>
arunavkonwar
fonte
3
Isso funcionou totalmente para mim. Essa resposta deve ser aceita. action='#'
Ashok MA
1
Segmento super antigo, mas para quem já se deparar com isso agora, não tente, action="#"porque não funciona e não é uma solução apropriada. A chave é realmenteonsubmit="yourJsFunction();return false"
Jeff
mas você não acha que retornar falso não é gracioso?
Vicky Gonsalves
8

Esse problema se torna mais complexo quando você oferece ao usuário 2 possibilidades para enviar o formulário:

  1. clicando em um botão ad hoc
  2. pressionando a tecla Enter

Nesse caso, você precisará de uma função que detecte a tecla pressionada na qual você enviará o formulário se a tecla Enter for pressionada.

E agora vem o problema com o IE (em qualquer caso, versão 11) Observação: Esse problema não existe no Chrome nem no FireFox!

  • Quando você clica no botão enviar, o formulário é enviado uma vez; bem.
  • Quando você pressiona Enter, o formulário é enviado duas vezes ... e seu servlet será executado duas vezes. Se você não tiver servidores de arquitetura PRG (pós-redirecionamento, obter) ao lado, o resultado poderá ser inesperado.

Embora a solução pareça trivial, levei muitas horas para resolver esse problema, por isso espero que seja útil para outras pessoas. Esta solução foi testada com sucesso, entre outros, no IE (v 11.0.9600.18426), FF (v 40.03) e Chrome (v 53.02785.143 m 64 bits)

O código-fonte HTML & js estão no snippet. O princípio é descrito lá. Aviso:

Você não pode testá-lo no snippet porque a ação de postagem não está definida e pressionar a tecla Enter pode interferir no fluxo de pilha.

Se você enfrentou esse problema, basta copiar / colar o código js no seu ambiente e adaptá-lo ao seu 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
fonte
5

Em Javascript puro, use: e.preventDefault()

e.preventDefault() é usado no jquery, mas funciona em javascript.

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

  //some code

  e.preventDefault();
})
Deke
fonte
4

A maioria das pessoas impediria o envio do formulário ligando para o event.preventDefault() função.

Outro meio é remover o atributo onclick do botão e processForm()inserir o código .submit(function() {porque return false;o formulário não é enviado. Além disso, faça com que as formBlaSubmit()funções retornem booleanas com base na validade, para uso emprocessForm();

katshA resposta é a mesma, apenas mais fácil de digerir.

(A propósito, eu sou novo no stackoverflow, dê-me orientação, por favor.)

ambrosechua
fonte
2
Embora seja bom saber que return false;também pára evento borbulhando o DOM - é uma abreviação paraevent.preventDefault(); event.stopPropagation();
Terry
4

A melhor solução é enviar uma chamada para qualquer função que desejar e retornar falso depois dela.

onsubmit="xxx_xxx(); return false;"
xyz xyz
fonte
3

Pessoalmente, gosto de validar o formulário ao enviar e, se houver erros, basta retornar false.

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

    var error;

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

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

});

http://jsfiddle.net/dfyXY/

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

Se você deseja usar o Javascript puro, o snippet a seguir será melhor do que qualquer outra coisa.

Suponha :

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 você !!

Mr. Suryaa Jha
fonte
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;
}

Não checou como funciona. Você também pode ligar (this) para que funcione como jquery ajaxForm

use-o 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();

retorna nós para que você possa fazer algo como enviar i acima do exemplo

longe da perfeição, mas deve funcionar, você deve adicionar tratamento de erros ou remover a condição de desativação

Łukasz Szpak
fonte
0

Basta usar "javascript:" no atributo de ação do formulário, se você não estiver usando a ação.

Kailash Kaswan
fonte
1
Inclua um exemplo para esclarecer melhor sua solução.
Vikash Pathak
0

Às vezes e.preventDefault (); funciona, então os desenvolvedores estão felizes, mas às vezes não funcionam, então os desenvolvedores estão tristes, então eu encontrei a solução porque às vezes não funciona

primeiro código às vezes funciona

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

segunda opção por que não trabalhar? Isso não funciona porque o jquery ou outra biblioteca javascript não está carregando corretamente. Você pode verificar no console se todos os arquivos jquery e javascript estão carregados corretamente ou não.

Isso resolve meu problema. Espero que isso seja útil para você.

Sumit Kumar Gupta
fonte
0

Na minha opinião, a maioria das respostas está tentando resolver o problema da sua pergunta, mas não acho que seja a melhor abordagem para o seu cenário.

Como evitaria a atualização da página ao pressionar o botão enviar sem nenhum dado nos campos?

A de .preventDefault()fato não atualiza a página. Mas acho que um simples requirenos campos que você deseja preencher com dados resolveria seu 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 a requiretag adicionada no final de cada um input. O resultado será o mesmo: não atualizando a página sem nenhum dado nos campos.

Zebiano
fonte
0

Espero que esta seja a última resposta


$('#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>

fonte
-1

Para JavaScript puro, use o método click

<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
fonte
-1

Acabei de encontrar uma solução muito simples e funcional, removendo <form></form>da seção que queria impedir a publicação e a atualização.

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

Aqui apenas os botões são enviados como deveriam.

John_FistaH
fonte
Remova o atributo name nos campos que você não deseja enviar ao servidor. stackoverflow.com/a/12827917/458321
TamusJRoyce
-2

Basta colocar o retorno assim:

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>

Retorne verdadeiro e falso de validate (); função conforme a exigência

Mohd Jahid
fonte
você deveria dar uma dica ou fornecer um trecho de código em vez deste grande pedaço de código
Felix Geenen