jquery desativar o envio do formulário ao entrar

207

Eu tenho o seguinte javascript na minha página que não parece estar funcionando.

$('form').bind("keypress", function(e) {
  if (e.keyCode == 13) {               
    e.preventDefault();
    return false;
  }
});

Gostaria de desativar o envio do formulário em enter, ou melhor ainda, para chamar meu envio de formulário ajax. Qualquer uma das soluções é aceitável, mas o código que estou incluindo acima não impede o envio do formulário.

Adam Levitt
fonte
3
Aqui está uma solução simples apenas para HTML: stackoverflow.com/a/51507806/337934
SamB

Respostas:

420

Se keyCodenão for pego, pegue which:

$('#formid').on('keyup keypress', function(e) {
  var keyCode = e.keyCode || e.which;
  if (keyCode === 13) { 
    e.preventDefault();
    return false;
  }
});

EDIT: perdeu, é melhor usar em keyupvez dekeypress

EDIÇÃO 2: como em algumas versões mais recentes do Firefox o envio de formulários não é impedido, é mais seguro adicionar o evento de pressionamento de tecla ao formulário. Também não funciona (mais?), Apenas vinculando o evento ao formulário "nome", mas apenas ao ID do formulário. Portanto, tornei isso mais óbvio, alterando o exemplo de código adequadamente.

EDIT 3: Alterado bind()paraon()

zessx
fonte
15
O jQuery o normaliza e.which, portanto você não precisa testar e.keyCode, mas +1 para a causa mais provável desse problema.
Bojangles
4
Você precisa return false;disso? e.preventDefault();parece
suficiente
10
Importante! Esse bloco de solução quebra na área de texto.
German Khokhlov
4
O problema é que, se eu tenho da mesma forma uma caixa de texto, agora não consigo adicionar uma entrada (para criar uma nova linha) na caixa de texto.
Tikky
3
keyCode === 13 && !$(e.target).is('textarea')
teran
62

Normalmente, o formulário é enviado Enterquando você se concentra nos elementos de entrada.

Podemos desativar a Enterchave (código 13) nos elementos de entrada em um formulário:

$('form input').on('keypress', function(e) {
    return e.which !== 13;
});

DEMO: http://jsfiddle.net/bnx96/325/

Visão
fonte
O botão Ir para iOS foi meu problema em um campo de entrada de preenchimento automático personalizado. Isso resolveu.
Dylan Valade 27/09/2013
11
Isso evita que a tecla Enter seja usada no textareasmesmo formulário. Usar em $("form input")vez de $("form :input")parece corrigi-lo. Demonstração: jsfiddle.net/bnx96/279
shaneparsons
43

Ainda mais curto:

$('myform').submit(function() {
  return false;
});
user1017926
fonte
35
Mas isso também evitará o clique do usuário?
haibuihoang
5
@haibuihoang Sim, isso desativará o envio do formulário.
Tom
7
Você deve usar function(e) {e.preventDefault();}como valores de retorno nos manipuladores de eventos que foram descontinuados: stackoverflow.com/a/20045473/601386
flu
6
@ user1111929 Isso funciona muito bem, mas não deve ser a melhor resposta, pois a pergunta é feita apenas sobre Entere não sobre a desativação do envio de formulários pelo Submitbotão.
precisa saber é
Uma situação comum em que você pode querer preservar o envio do formulário, mas desativar o envio ao pressionar a tecla 'enter', é se você decidir usar um onClickevento jQuery para validar um formulário e ainda enviar usando o jQuery. Em outras palavras, há casos em que você deseja enviar apenas via javascript / jQuery. Embora você ainda possa usar o AJAX com esta solução, ele desabilita a funcionalidade básica do submitmétodo.
JRad the Bad
23
$('form').keyup(function(e) {
  return e.which !== 13  
});

A propriedade event.which normaliza event.keyCode e event.charCode. Recomenda-se assistir a event.which para inserir as teclas do teclado.

which docs.

gdoron está apoiando Monica
fonte
14
$(document).on('keyup keypress', 'form input[type="text"]', function(e) {
  if(e.which == 13) {
    e.preventDefault();
    return false;
  }
});

Esta solução funciona em todos os formulários do site (também nos formulários inseridos com ajax), impedindo apenas a inserção de textos de entrada. Coloque-o em uma função pronta para documento e esqueça esse problema por toda a vida.

Buzogany Laszlo
fonte
9

A maioria das respostas acima impedirá que os usuários adicionem novas linhas em um campo de área de texto. Se é algo que você deseja evitar, você pode excluir esse caso específico, verificando qual elemento atualmente tem foco:

var keyCode = e.keyCode || e.which;
if (keyCode === 13 && !$(document.activeElement).is('textarea')) {
  e.preventDefault();
  return false;
}
jean-baptiste
fonte
8

O exagero de ter que capturar e testar cada pressionamento de tecla para a tecla ENTER realmente me incomoda, então minha solução depende do seguinte comportamento do navegador:

Pressionar ENTER disparará um evento de clique no botão enviar (testado no IE11, Chrome 38, FF 31) ** (ref: http://mattsnider.com/how-forms-submit-when-pressing-enter/ )

Portanto, minha solução é remover o botão de envio padrão (ou seja <input type="submit">) para que o comportamento acima falhe porque não há botão de envio para clicar magicamente quando pressionar ENTER. Em vez disso, eu uso um manipulador de cliques do jQuery em um botão regular para enviar o formulário pelo .submit()método do jQuery .

<form id="myform" method="post">
  <input name="fav_color" type="text">
  <input name="fav_color_2" type="text">
<button type="button" id="form-button-submit">DO IT!</button>
</form>

<script>
 $('#form-button-submit').click(function(){
    $('#myform').submit();
  });
</script>

Demonstração: http://codepen.io/anon/pen/fxeyv?editors=101

** esse comportamento não é aplicável se o formulário tiver apenas 1 campo de entrada e esse campo for uma entrada de 'texto'; nesse caso, o formulário será enviado com a tecla ENTER, mesmo que nenhum botão de envio esteja presente na marcação HTML (por exemplo, um campo de pesquisa). Esse é o comportamento padrão do navegador desde os anos 90.

Costa
fonte
Eu adicionei uma caixa de entrada invisível para combater "o formulário será enviado após a tecla ENTER" causada por "o formulário possui apenas 1 campo de entrada e esse campo é uma entrada de 'texto'".
Luo Jiong Hui
6

se você quiser apenas desativar o botão enviar e enviar, use o evento de envio do formulário

<form onsubmit="return false;">

Você pode substituir "return false" pela chamada à função JS, que fará o que for necessário e também enviará o formulário como uma última etapa.

Perica Zivkovic
fonte
1
Isso desativará todos os envios de formulários, incluindo clicar no botão enviar.
21414 Nick
não 100% ... trabalhar um regular enviar uma chave ... melhor jquery uso para evitar
KingRider
Boa resposta alternativa (com as ressalvas acima) porque ... bem, às vezes isso é tudo que você precisa.
Emilys
este é exatamente o que eu precisava para uma situação, obrigado
shababhsiddique
4

Você pode fazer isso perfeitamente em Javascript puro, simples e sem necessidade de biblioteca. Aqui está minha resposta detalhada para um tópico semelhante: Desabilitando a tecla Enter para Formulário

Em resumo, aqui está o código:

<script type="text/javascript">
window.addEventListener('keydown',function(e){if(e.keyIdentifier=='U+000A'||e.keyIdentifier=='Enter'||e.keyCode==13){if(e.target.nodeName=='INPUT'&&e.target.type=='text'){e.preventDefault();return false;}}},true);
</script>

Este código é para impedir a tecla "Enter" apenas para o tipo de entrada = 'texto'. (Como o visitante pode precisar pressionar Enter na página) Se você desejar desativar "Enter" para outras ações também, poderá adicionar console.log (e); para fins de teste, e pressione F12 no chrome, vá para a guia "console" e pressione "backspace" na página e olhe dentro dela para ver quais valores são retornados. Em seguida, você pode direcionar todos esses parâmetros para aprimorar ainda mais o código acima para atender às suas necessidades de "e.target.nodeName" , "e.target.type" e muito mais ...

Tarik
fonte
2
Na verdade deveria ser e.target.nodeName === 'INPUT' && e.target.type !== 'textarea'. Com o código especificado, será possível enviar formulários se um rádio ou caixa de seleção estiver focada.
afnpires
3

Não sei se você já resolveu esse problema ou se alguém está tentando resolver isso agora, mas aqui está a minha solução para isso!

$j(':input:not(textarea)').keydown(function(event){
    var kc = event.witch || event.keyCode;
    if(kc == 13){
    event.preventDefault();
        $j(this).closest('form').attr('data-oldaction', function(){
            return $(this).attr('action');
        }).attr('action', 'javascript:;');

        alert('some_text_if_you_want');

        $j(this).closest('form').attr('action', function(){
            return $(this).attr('data-oldaction');
        });
        return false;
    }
});
Don Marconha Neves
fonte
2

A maneira simples é mudar o tipo de botão para botão - em html e adicionar evento em js ...

Mude a partir disso:

<form id="myForm">
   <button type="submit">Submit</button>
</form>

Para

<form id="myForm">
   <button type="button" id="btnSubmit">Submit</button>
</form>

E em js ou jquery adicione:

("#btnSubmit").click(function () {
    $('#myForm').submit();
});
Zvi Redler
fonte
1

O código a seguir impedirá que a tecla Enter seja usada para enviar um formulário, mas ainda permitirá que você use a tecla Enter em uma área de texto. Você pode editá-lo ainda mais, dependendo de suas necessidades.

<script type="text/javascript">
        function stopRKey(evt) {
          var evt = (evt) ? evt : ((event) ? event : null);
          var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
          if ((evt.keyCode == 13) && ((node.type=="text") || (node.type=="radio") || (node.type=="checkbox")) )  {return false;}
        }

        document.onkeypress = stopRKey;
</script> 
Rabanete
fonte
1

No firefox, quando você digita e pressiona enter, ele envia sua forma superior. A solução está no formulário de envio, adicione isto:

<input type="submit" onclick="return false;" style="display:none" />
passear
fonte
1

3 anos depois e nenhuma pessoa respondeu completamente a essa pergunta.

O solicitante deseja cancelar o envio do formulário padrão e chamar seu próprio Ajax. Esta é uma solicitação simples com uma solução simples. Não há necessidade de interceptar todos os caracteres inseridos em cada entrada.

Supondo que o formulário tenha um botão de envio, seja um <button id="save-form">ou um <input id="save-form" type="submit">, faça:

$("#save-form").on("click", function () {
    $.ajax({
        ...
    });
    return false;
});
derekm
fonte
-2

Quando o arquivo é concluído (carregamento concluído), o script detecta cada evento para a tecla "Entry" e ele desativa o evento para trás.

<script>
            $(document).ready(function () {
                $(window).keydown(function(event){
                    if(event.keyCode == 13) {
                        e.preventDefault(); // Disable the " Entry " key
                        return false;               
                    }
                });
            });
        </script>
McNavy
fonte
adicione alguma explicação
HaveNoDisplayName 22/16/16
@HaveNoDisplayName: Atualizado.
McNavy
-4

Solução completa em JavaScript para todos os navegadores

O código acima e a maioria das soluções são perfeitas. No entanto, acho que a mais curta "resposta curta", que está incompleta.

Então aqui está a resposta completa. em JavaScript com suporte nativo para o IE 7 também.

var form = document.getElementById("testForm");
form.addEventListener("submit",function(e){e.preventDefault(); return false;});

Agora, essa solução impedirá que o usuário envie usando a tecla Enter e não recarregará a página, nem o levará ao topo da página, se o formulário estiver em algum lugar abaixo.

Tarandeep Singh
fonte
8
Isso também impede que o formulário seja enviado se você clicar no botão "Enviar".
Mario Werner
-10

Que tal agora:

$(":submit").closest("form").submit(function(){
    $(':submit').attr('disabled', 'disabled');
});

Isso deve desativar todos os formulários com os botões de envio no seu aplicativo.

Shreekar Patel
fonte