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
/////////////////
});
javascript
jquery
html
forms
M_Willett
fonte
fonte
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.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 usaraddEventListener()
, mas parece que essas maneiras de fazer as coisas geralmente são mal vistas) em cima.Adicione este código onsubmit = "return false":
Isso consertou para mim. Ele ainda executará a função onClick que você especificar
fonte
Substitua o tipo de botão por
button
:fonte
button type="submit"
ele tenha enviado o formulário na ação do botão usando o jQuery.Você pode usar esse código para enviar formulários sem atualizar a página. Eu fiz isso no meu projeto.
fonte
Uma ótima maneira de impedir o recarregamento da página ao enviar usando um formulário é adicionando
return false
com o atributo onsubmit.fonte
action='#'
action="#"
porque não funciona e não é uma solução apropriada. A chave é realmenteonsubmit="yourJsFunction();return false"
Esse problema se torna mais complexo quando você oferece ao usuário 2 possibilidades para enviar o formulário:
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!
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:
Se você enfrentou esse problema, basta copiar / colar o código js no seu ambiente e adaptá-lo ao seu contexto.
fonte
Em Javascript puro, use:
e.preventDefault()
e.preventDefault()
é usado no jquery, mas funciona em javascript.fonte
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() {
porquereturn false;
o formulário não é enviado. Além disso, faça com que asformBlaSubmit()
funções retornem booleanas com base na validade, para uso emprocessForm();
katsh
A resposta é a mesma, apenas mais fácil de digerir.(A propósito, eu sou novo no stackoverflow, dê-me orientação, por favor.)
fonte
return false;
também pára evento borbulhando o DOM - é uma abreviação paraevent.preventDefault(); event.stopPropagation();
A melhor solução é enviar uma chamada para qualquer função que desejar e retornar falso depois dela.
fonte
Pessoalmente, gosto de validar o formulário ao enviar e, se houver erros, basta retornar false.
http://jsfiddle.net/dfyXY/
fonte
fonte
Se você deseja usar o Javascript puro, o snippet a seguir será melhor do que qualquer outra coisa.
Suponha :
HTML :
Espero que funcione para você !!
fonte
Não checou como funciona. Você também pode ligar (this) para que funcione como jquery ajaxForm
use-o como:
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
fonte
Basta usar "javascript:" no atributo de ação do formulário, se você não estiver usando a ação.
fonte
À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
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ê.
fonte
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.
A de
.preventDefault()
fato não atualiza a página. Mas acho que um simplesrequire
nos campos que você deseja preencher com dados resolveria seu problema.Observe a
require
tag adicionada no final de cada uminput
. O resultado será o mesmo: não atualizando a página sem nenhum dado nos campos.fonte
Espero que esta seja a última resposta