evento Javascript onchange prevenção evento onsubmit no formulário HTML?
-
20-08-2019 - |
Pergunta
Considere um formulário HTML:
<form action="" method="POST" onsubmit="return checkValidArray()">
<input type="text" name="data" onchange="return validate(this);">
</form>
Parece (no IE 6 e Firefox 3) que quando você digita algum texto no campo de entrada e clique em enviar que os fogos evento OnChange para o campo de entrada, mas o evento onsubmit não dispara para o formulário até que você clique no botão enviar uma segunda vez (momento em que o onchange não dispara, é claro). Em outras palavras, o onchange parece impedir o onsubmit de disparar.
O desejo é o de verificar cada campo no formulário quando o usuário sai do campo a fim de proporcionar-lhes feedback validação imediata, e também para evitar a apresentação do formulário, se houver dados inválidos.
[EDIT:. Note-se que ambas as funções de validação conter um alerta ()]
Como se contornar este problema?
Solução
Solution (de uma espécie):
Acontece que é apenas a presença de um alerta () - ou um confirm () - durante o evento onchange do input que provoca evento onsubmit do formulário para não fogo. O segmento JS parece ficar bloqueado pelo alerta ().
A solução é não incluem qualquer alerta () ou confirm () na chamada onchange da entrada.
Navegadores conhecidos por serem afetados:
IE6 - Windows
IE8 - Win
FF3 - Win
Navegadores conhecidos não ser afetado:
Google Chrome - Win
Safari - Mac
FF - Mac
Outras dicas
Eu tentei com o Firefox 3 (Mac) com o seguinte código:
<html>
<head>
<script>
function validate(ele)
{
alert("vali");
return false;
}
function checkValidArray()
{
alert("checkValidArray");
}
</script>
</head>
<body>
<form action="" method="POST" onsubmit="return checkValidArray()">
<input type="text" name="data" onchange="return validate(this);">
<input type="submit" value="Ok">
</form>
</body>
</html>
Parece que funciona. Quando clico no botão Ok, tanto "Vali" e "Check matriz válida" pop up.
Inicialmente eu pensei return false
poderia ser a razão por que o formulário não foi apresentado, mas é apresentado (pelo menos, checkValidArray()
é chamado).
Agora, o que você está fazendo em seus checkValidArray()
e validate()
métodos? Algo especial? Você pode postar o código?
EDIT: Eu testei com o IE8 e FF3 em janelas, e aqui ambos os eventos não ser demitido. Eu não tenho ideia do porquê. Talvez onblur é uma solução, mas por que onchange não trabalho? Existe uma razão específica ou é apenas outra incoerência? (Funciona tanto em FF e Safari no Mac)
Você pode usar o evento onblur em suas entradas em vez de onchange.
É muito interessante que o comportamento é diferente no Mac, por isso parece plataforma do navegador dependentes e não dependentes. Deve ser uma pista lá em algum lugar ...
Eu tentei onblur com código Nivas', mas teve o mesmo resultado que com onchange (somente o alerta 'Vali').
O que faz a diferença é se você qualquer em validate (). Comentar o alerta de linha ( "vali"); e funciona! (O valor de retorno real do validate () não importa, embora eu não esperaria que ele.)
EDIT: Um colega apenas tentei isso no Google Chrome no Windows e funciona lá. Esta intuitivamente faz sentido por causa de como Chrome separa tópicos JS.
Algo sobre o primeiro alerta () bloqueando o fio faz com que o evento onsubmit para se perder. condição de corrida possível?
Não criar; botão de envio. Em vez disso, criar um botão normal e escrever uma função que pode ser chamado onClick com esse botão.
Função vai fazer a validação sobre os campos do formulário, e se tudo estiver bem, ele vai enviar o formulário. Caso contrário, ele não vai.
function validate
{
"Piece of code to Validate your form"
document.formName.action.value = "URL which you want to call"
document.propFile.submit(); // It will submit he page
}