Tenho uma pesquisa em um site e parece haver alguns problemas com os usuários pressionando enter (não sei por que) e enviando acidentalmente a pesquisa (formulário) sem clicar no botão enviar. Há uma maneira de prevenir isto?
Estou usando HTML, PHP 5.2.9 e jQuery na pesquisa.
jquery
html
forms
form-submit
DForck42
fonte
fonte
Respostas:
Você pode usar um método como
Ao ler os comentários na postagem original, torne-a mais utilizável e permita que as pessoas pressionem Enterse tiverem preenchido todos os campos:
fonte
keydown
nadocument
vez dowindow
para que isso funcione.&& !$(document.activeElement).is('textarea')
à condição ou então novas linhas dentro de uma área de texto são bloqueadas (pelo menos no IE).Não permitir a tecla enter em qualquer lugar
Se você não tiver um
<textarea>
no seu formulário, adicione o seguinte ao seu<form>
:Ou com jQuery:
Isso fará com que todas as teclas pressionadas dentro do formulário sejam verificadas no
key
. Caso contrárioEnter
, ele retornarátrue
e tudo continuará como de costume. Se forEnter
, retornaráfalse
e tudo será interrompido imediatamente, para que o formulário não seja enviado.O
keydown
evento é preferido,keyup
poiskeyup
é muito tarde para bloquear o envio do formulário. Historicamente, havia também okeypress
, mas isso é preterido, assim como oKeyboardEvent.keyCode
. Você deve usar oKeyboardEvent.key
que retorna o nome da tecla que está sendo pressionada. QuandoEnter
está marcado, isso verifica 13 (entrada normal) e 108 (entrada do teclado numérico).Observe que,
$(window)
conforme sugerido em algumas outras respostas, em vez de$(document)
não funcionar parakeydown
/keyup
no IE <= 8, não é uma boa opção se você também deseja cobrir esses usuários pobres.Permitir tecla enter apenas em áreas de texto
Se você tiver um
<textarea>
no seu formulário (que obviamente deve aceitar a tecla Enter), adicione o manipulador de teclas a cada elemento de entrada individual que não seja a<textarea>
.Para reduzir o boilerplate, é melhor fazer isso com o jQuery:
Se você tiver outras funções de manipulador de eventos anexadas a esses elementos de entrada, que também gostaria de chamar na tecla enter por algum motivo, evite apenas o comportamento padrão do evento em vez de retornar false, para que possa propagar adequadamente para outros manipuladores.
Permitir inserir tecla nas áreas de texto e enviar apenas os botões
Se você também deseja permitir a tecla Enter nos botões de envio
<input|button type="submit">
, sempre pode refinar o seletor como abaixo.Observe que,
input[type=text]
conforme sugerido em algumas outras respostas, não abrange as entradas que não são de texto em HTML5, portanto, esse não é um bom seletor.fonte
":input:not(textarea):not([type=submit]):not(button)"
se você estiver usando em<button>
vez de<input type=submit>
input
?Seção 4.10.22.2 O envio implícito da especificação HTML5 do W3C diz:
Portanto, uma maneira compatível com os padrões de desativar qualquer envio implícito do formulário é colocar um botão de envio desativado como o primeiro botão de envio no formulário:
Um bom recurso dessa abordagem é que ela funciona sem JavaScript ; esteja o JavaScript ativado ou não, é necessário um navegador da Web em conformidade com os padrões para impedir o envio implícito de formulário.
fonte
<input type="submit" disabled style="display: none" aria-hidden="true" />
e você pode reduzir o tamanho da sua página em alguns caracteres. :-PEu tive que capturar todos os três eventos relacionados ao pressionamento de teclas para impedir que o formulário fosse enviado:
Você pode combinar tudo isso em uma boa versão compacta:
fonte
$("#search").bind('keypress keyup keydown',preventSubmit)
;<form>
tag, a tecla enter irá enviar o formulário ... Esta solução desativada a tecla enter e corrigiu o problema, porém, graças @ Dave! Ativei a tecla Enter para determinados campos porid
.console.log
, eu atualizei minha resposta.keypress keyup keydown
você aciona qualquer código na condição if duas vezes .Se você usar um script para fazer o envio real, poderá adicionar a linha "return false" ao manipulador onsubmit como este:
Chamar submit () no formulário a partir do JavaScript não acionará o evento.
fonte
Usar:
Essa solução funciona em todos os formulários de um site (também nos formulários inseridos com o Ajax), impedindo apenas Enters nos textos de entrada. Coloque-o em uma função pronta para documento e esqueça esse problema por toda a vida.
fonte
e.which
foi boa; não há necessidade de mudar parae.keyCode
. Ambos retornam o valor 13 para a tecla enter. Consulte stackoverflow.com/a/4471635/292060 e stackoverflow.com/a/18184976/292060Em vez de impedir que os usuários pressionem Enter, o que pode parecer antinatural, você pode deixar o formulário como está e adicionar uma validação extra no lado do cliente: Quando a pesquisa não termina, o resultado não é enviado ao servidor e o usuário recebe uma boa mensagem informando o que precisa ser concluído para preencher o formulário. Se você estiver usando jQuery, tente o plug-in Validação:
http://docs.jquery.com/Plugins/Validation
Isso exigirá mais trabalho do que pegar o Enterbotão, mas certamente proporcionará uma experiência mais rica ao usuário.
fonte
Uma boa e simples solução jQuery:
fonte
var key = event.keyCode || event.which; if (key == 13) return false;
Ainda não posso comentar, por isso vou postar uma nova resposta
A resposta aceita está correta, mas não para de enviar no teclado numérico. Pelo menos na versão atual do Chrome. Eu tive que alterar a condição do código de chave para isso, então funciona.
fonte
É a minha solução para atingir a meta, é limpa e eficaz.
fonte
Uma abordagem completamente diferente:
<button type="submit">
no formulário será ativado ao pressionar Enter.style="display:none;
false
, o que interrompe o processo de envio.<button type=submit>
para enviar o formulário. Basta retornartrue
para fazer a cascata da submissão.<textarea>
ou outros controles de formulário se comportará normalmente.<input>
controles do formulário acionará o primeiro<button type=submit>
, que retornafalse
e, portanto, nada acontece.Portanto:
fonte
<button onclick="this.disabled=true;this.form.submit();" type="submit"">submit</button>
Dando ao formulário uma ação de 'javascript: void (0);' parece fazer o truque
fonte
Não colocar um botão de envio poderia funcionar. Basta colocar um script na entrada (type = button) ou adicionar eventListener se desejar enviar os dados no formulário.
Em vez disso, use isso
do que usar isso
fonte
fonte
Eu precisava impedir que apenas entradas específicas fossem enviadas, então usei um seletor de classe, para permitir que esse seja um recurso "global" onde eu precisar.
E este código jQuery:
Como alternativa, se o pressionamento de tecla for insuficiente:
Algumas notas:
Modificando várias boas respostas aqui, a Enterchave parece funcionar
keydown
em todos os navegadores. Para a alternativa, eu atualizeibind()
para oon()
métodoSou um grande fã de seletores de classe, avaliando todos os prós e contras e discussões sobre desempenho. Minha convenção de nomenclatura é 'idSomething' para indicar que o jQuery está usando-o como um ID, para separá-lo do estilo CSS.
fonte
Você pode criar um método JavaScript para verificar se a Entertecla foi pressionada e, se for, para interromper o envio.
Basta chamar isso no método de envio.
fonte
SOMENTE ENVIAR EM BLOCO, mas não outra funcionalidade importante da tecla enter, como criar um novo parágrafo em
<textarea>
:fonte
function(e)
, deveria serfunction(event)
. Caso contrário, funciona para mim. Obrigado.on("keydown", function(event) { enterPressed = true; }
e, em seguida, no evento de envio, façaon("submit", function(e) { if (pressedEnter == true) { pressedEnter = false; e.preventDefault(); return false;}
Isso garantirá que funcione independentemente do atraso.Esta é a maneira perfeita. Você não será redirecionado da sua página
fonte
Eu tive um problema semelhante, onde eu tinha uma grade com "campos de texto ajax" (Yii CGridView) e apenas um botão de envio. Toda vez que eu fazia uma pesquisa em um campo de texto e pressione Enter, digite o formulário enviado. Eu tive que fazer algo com o botão porque era o único botão comum entre as visualizações (padrão MVC). Tudo o que eu precisava fazer era remover
type="submit"
e colocaronclick="document.forms[0].submit()
fonte
Eu acho que está bem coberto com todas as respostas, mas se você estiver usando um botão com algum código de validação JavaScript, poderá definir o onkeypress do formulário para Enter para chamar seu envio conforme o esperado:
O onkeypress JS pode ser o que você precisa fazer. Não há necessidade de uma mudança global maior. Isso é especialmente verdadeiro se você não é o único que codifica o aplicativo do zero e foi levado para consertar o site de outra pessoa sem rasgá-lo e testá-lo novamente.
fonte
Já existem muitas boas respostas, só quero contribuir com algo da perspectiva do UX. Os controles do teclado nos formulários são muito importantes.
A questão é como desativar o envio ao pressionar teclas
Enter
. Não é como ignorarEnter
em um aplicativo inteiro. Portanto, considere anexar o manipulador a um elemento do formulário, não à janela.A desativação
Enter
para envio de formulários ainda deve permitir o seguinte:Enter
quando o botão Enviar está focado.Enter
.Este é apenas um padrão, mas segue as três condições.
fonte
Algo que eu não vi respondido aqui: quando você percorre os elementos da página, pressionar Enterao chegar no botão enviar acionará o manipulador de envio no formulário, mas gravará o evento como um MouseEvent. Aqui está minha pequena solução para cobrir a maioria das bases:
Esta não é uma resposta relacionada ao jQuery
HTML
Javascript
Para encontrar um exemplo de trabalho: https://jsfiddle.net/nemesarial/6rhogva2/
fonte
No meu caso específico, eu tive que parar o ENTER de enviar o formulário e também simular o clique do botão enviar. Isso ocorre porque o botão enviar tinha um manipulador de cliques, porque estávamos dentro de uma janela modal (código antigo herdado). De qualquer forma, aqui estão as minhas soluções combinadas para este caso.
Este caso de uso é especificamente útil para pessoas que trabalham com o IE8.
fonte
Isso funciona para mim
fonte
Gostaria de adicionar um pouco de código CoffeeScript (não testado em campo):
(Espero que você goste do truque legal da cláusula salvo.)
fonte
Usando Javascript (sem verificar nenhum campo de entrada):
Se alguém quiser aplicar isso em campos específicos, por exemplo, digite o texto do texto:
Isso funciona bem no meu caso.
fonte
Vá para o seu css e acrescentar que para ele, então vai bloquear automaticamente a apresentação de seu formular contanto que você tem submeter entrada se você não quer, você pode excluí-lo ou tipo
activate
edeactivate
, em vezfonte
Você também pode usar
javascript:void(0)
para impedir o envio de formulários.fonte
method="post"
em seu formulário. Por exemplo, quero que o formulário seja enviado por botões, mas não ao pressionar enter enquanto estiver focado na entrada.method="post"
no formulário e seus trabalhos, verifique novamente.Isso funcionou para mim em todos os navegadores após muita frustração com outras soluções. A função externa name_space é apenas para evitar declarar globais, algo que eu também recomendo.
Uso da amostra:
fonte
Usar:
fonte