Como impedir que a tecla ENTER seja pressionada para enviar um formulário da web?


207

Como você evita que um ENTERpressionamento de tecla envie um formulário em um aplicativo baseado na Web?

Respostas:


99

[ revisão 2012, sem manipulador embutido, preservar área de texto ao manipular]

function checkEnter(e){
 e = e || event;
 var txtArea = /textarea/i.test((e.target || e.srcElement).tagName);
 return txtArea || (e.keyCode || e.which || e.charCode || 0) !== 13;
}

Agora você pode definir um manipulador de pressionamento de tecla no formulário:
<form [...] onkeypress = "return checkEnter (event)">

document.querySelector('form').onkeypress = checkEnter;

3
A propósito: você pode adicionar uma verificação para o tipo de entrada (via fonte de eventos) na função checkEnter para excluir as áreas de texto.
25410 KooiInc

1
Trabalho. Adicionei isso a uma única entrada porque queria evitar que o <enter> enviasse o formulário. Ele tinha um botão para realizar uma pesquisa interna e, na verdade, melhora a usabilidade.
Foxinni

1
Um problema com essa abordagem (usando essa função com um manipulador de eventos no formulário como um todo) é que ela também evita a ocorrência de entradas nas áreas de texto que também estão no formulário (onde as entradas geralmente são desejáveis).
Lonnie Best

1
@LonnieBest: obrigado por perceber. Você se ler meu comentário sobre esta resposta (ver acima), não é? Enfim, revisei essa resposta bastante antiga.
KooiInc

1
@ Jonathan: você pode anexar o manipulador a campos de entrada únicos ou a alguma div que contenha uma coleção de campos de entrada (mas não os botões) em vez de todo o formulário.
KooiInc

57

Aqui está um manipulador de jQuery que pode ser usado para parar de enviar envios e também para parar a tecla de retrocesso -> voltar. Os pares (keyCode: selectorString) no objeto "keyStop" são usados ​​para corresponder aos nós que não devem disparar sua ação padrão.

Lembre-se de que a web deve ser um local acessível, e isso está quebrando as expectativas dos usuários de teclado. Dito isto, no meu caso, o aplicativo da Web em que estou trabalhando não gosta do botão voltar, de modo que desativar o atalho de tecla é OK. A discussão "deve entrar -> enviar" é importante, mas não está relacionada à pergunta real.

Aqui está o código, você decide sobre acessibilidade e por que realmente deseja fazer isso!

$(function(){
 var keyStop = {
   8: ":not(input:text, textarea, input:file, input:password)", // stop backspace = back
   13: "input:text, input:password", // stop enter = submit 

   end: null
 };
 $(document).bind("keydown", function(event){
  var selector = keyStop[event.which];

  if(selector !== undefined && $(event.target).is(selector)) {
      event.preventDefault(); //stop event
  }
  return true;
 });
});

12
De uma maneira mais simples: $ ("# myinput"). Keydown (function (e) {if (e.which == 13) e.preventDefault ();}); A chave é usar "keydown" e event.preventDefault () juntos. Não funciona com "keyup".
Lepe

Isso tem a vantagem sobre outras soluções que simplesmente bloqueiam a chave 13 que a sugestão automática do navegador continuará funcionando corretamente.
Jsalvata 13/10/12

52

Simplesmente retorne false do manipulador de envio

<form onsubmit="return false;">

ou se você quiser um manipulador no meio

<script>
var submitHandler = function() {
  // do stuff
  return false;
}
</script>
<form onsubmit="return submitHandler()">

5
Esta parece ser a resposta mais simples. Eu tentei no Google Chrome e funciona bem. Você já testou isso em todos os navegadores?
precisa saber é

22
Esta não é uma boa idéia se você quiser que o seu formulário a ser enviado ao pressionar o submitbotão
AliBZ

13
Não funciona porque o botão enviar não envia o formulário
paullb

39
@Paul, Como isso conseguiu 38 votos positivos? Parar <form>de ficar submetido em tudo é deitar fora o bebé com a água do banho.
Pacerier

8
@Pacerier No contexto de um SPA, você quase sempre desejará lidar com o envio de formulários manualmente. Sempre parar o navegador de enviar um formulário (e atualizar a página, que reinicia o aplicativo) é razoável nesse caso.
Nathan Friend

44
//Turn off submit on "Enter" key

$("form").bind("keypress", function (e) {
    if (e.keyCode == 13) {
        $("#btnSearch").attr('value');
        //add more buttons here
        return false;
    }
});

5
Isso funciona muito bem. e.preventDefault()em vez de return falseatingir o mesmo fim, mas permitir que o evento alcance manipuladores nos elementos pai. A ação padrão (summission do formulário) ainda será impedida
willscripted

24

Você precisará chamar essa função, que cancelará o comportamento de envio padrão do formulário. Você pode anexá-lo a qualquer campo ou evento de entrada.

function doNothing() {  
var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if( keyCode == 13 ) {


    if(!e) var e = window.event;

    e.cancelBubble = true;
    e.returnValue = false;

    if (e.stopPropagation) {
        e.stopPropagation();
        e.preventDefault();
    }
}

2
e deve ser um argumento e, em seguida, você deve verificar o window.event. Além disso, você deve obter o código-chave do evento. Finalmente, você deve retornar false.
precisa saber é o seguinte

9
Você pode explicar onde e como chamar essa função?
mydoghasworms

17

A tecla ENTER apenas ativa o botão de envio padrão do formulário, que será o primeiro

<input type="submit" />

o navegador encontra no formulário.

Portanto, não tem um botão de envio, mas algo como

<input type="button" value="Submit" onclick="submitform()" /> 

EDIT : Em resposta à discussão nos comentários:

Isso não funciona se você tiver apenas um campo de texto - mas pode ser o comportamento desejado nesse caso.

A outra questão é que isso depende do Javascript para enviar o formulário. Isso pode ser um problema do ponto de vista da acessibilidade. Isso pode ser resolvido escrevendo o <input type='button'/>com javascript e, em seguida, coloque um <input type='submit' />dentro de uma <noscript>tag. A desvantagem dessa abordagem é que, para navegadores desativados em javascript, você terá envios de formulário em ENTER. Cabe ao OP decidir qual é o comportamento desejado nesse caso.

Não conheço nenhuma maneira de fazer isso sem chamar o javascript.


Estranhamente, isso não funciona no Firefox se houver apenas um campo.
25909 DanSingerman

5
Terrível para acessibilidade? Talvez. No entanto, se a resposta de que cara pergunta, que é o SO é para ... Talvez uma edição para a resposta de apontar a questão da acessibilidade é um bom compromisso?
30509 Neil Barnwell

1
@ Bobince - talvez a pergunta merece -1 devido à acessibilidade, mas esta resposta precisa à pergunta? Não pense assim. Além disso, existem casos de uso válidos nos quais você deseja fazer isso.
25909 DanSingerman

Você não precisa impossibilitar o envio do formulário sem JavaScript, hein. Porém, se funcionou, o que não acontece porque os navegadores enviarão com prazer um formulário que não contém botão de envio.
22990

2
Testado em todos eles, além do Opera, com uma entrada de texto e um botão de entrada: todos ainda enviaram o formulário em Enter. Obviamente, você precisa do JavaScript para 'resolver' o problema do Enter, mas o truque é fazer isso sem tornar a página completamente inoperante onde o JS não está disponível.
25909 bobince

13

Em suma, a resposta em Javascript puro é:

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

Isso desativa apenas a ação de pressionar a tecla "Enter" para o tipo de entrada = 'texto'. Os visitantes ainda podem usar a tecla "Enter" em todo o site.

Se você deseja desativar "Enter" para outras ações também, você pode 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 ...

Veja minha resposta detalhada para uma pergunta semelhante aqui


3
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

1
Esta é a solução mais eficaz e mais econômica. Obrigado a @AlexandrePires a! Aqui está o meu script de trabalho completo: stackoverflow.com/a/40686327/1589669
eapo

1
A única solução de trabalho; pelo menos na minha situação.
Hex494D49

9

Todas as respostas que encontrei sobre esse assunto, aqui ou em outros posts, têm uma desvantagem e evitam o gatilho de alteração real no elemento do formulário. Portanto, se você executar essas soluções, o evento onchange também não será acionado. Para superar esse problema, modifiquei esses códigos e desenvolvi o código a seguir. Espero que isso se torne útil para os outros. Eu dei uma aula ao meu formulário "prevent_auto_submit" e adicionei o seguinte JavaScript:

$(document).ready(function() 
{
    $('form.prevent_auto_submit input,form.prevent_auto_submit select').keypress(function(event) 
    { 
        if (event.keyCode == 13)
        {
            event.preventDefault();
            $(this).trigger("change");
        }
    });
});

7

Eu sempre fiz isso com um manipulador de teclas como o anterior, mas hoje encontrei uma solução mais simples. A tecla Enter apenas aciona o primeiro botão de envio não desativado no formulário. Portanto, na verdade, tudo o que é necessário é interceptar esse botão tentando enviar:

<form>
  <div style="display: none;">
    <input type="submit" name="prevent-enter-submit" onclick="return false;">
  </div>
  <!-- rest of your form markup -->
</form>

É isso aí. As teclas pressionadas serão tratadas como de costume pelo navegador / campos / etc. Se a lógica de envio e entrada for acionada, o navegador encontrará o botão de envio oculto e o acionará. E o manipulador de javascript impedirá o envio.


1
Geralmente não gosto de hacks, mas este é realmente eficaz.
TechWisdom 14/05/19

1
remover a div e apenas colocar attr hiddenna entrada seria mais curto. nice hack :)
Nik

5

Passei algum tempo criando esse navegador para IE8,9,10, Opera 9+, Firefox 23, Safari (PC) e Safari (MAC)

Exemplo do JSFiddle: http://jsfiddle.net/greatbigmassive/ZyeHe/

Código base - chame essa função via "onkeypress" anexado ao seu formulário e passe "window.event" para ele.

function stopEnterSubmitting(e) {
    if (e.keyCode == 13) {
        var src = e.srcElement || e.target;
        if (src.tagName.toLowerCase() != "textarea") {
            if (e.preventDefault) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        }
    }
}

4
stopSubmitOnEnter (e) {
  var eve = e || window.event;
  var keycode = eve.keyCode || eve.which || eve.charCode;

  if (keycode == 13) {
    eve.cancelBubble = true;
    eve.returnValue = false;

    if (eve.stopPropagation) {   
      eve.stopPropagation();
      eve.preventDefault();
    }

    return false;
  }
}

Em seguida, no seu formulário:

<form id="foo" onkeypress="stopSubmitOnEnter(e);">

No entanto, seria melhor se você não usasse JavaScript invasivo.


Eu gosto desta versão porque é mais legível que a do @hash. Um problema, no entanto, você deve retornar false dentro do bloco "if (keycode == 13)". Como você tem, esta função evita qualquer entrada do teclado no campo. Além disso, a versão do @ hash inclui e.keyCode, e.which e e.charCode ... não tenho certeza se o e.charCode é importante, mas eu o coloco assim mesmo: "var keycode = eve.keyCode || eve.which || eve.charCode; ".
Jack Senechal

Obrigado Jack. Eu editei a resposta para verificar charCode. Também mudei o return falseinterior do bloco if. Boa pegada.
N /

3

No meu caso, esse JavaScript jQuery resolveu o problema

jQuery(function() {
            jQuery("form.myform").submit(function(event) {
               event.preventDefault();
               return false;
            });
}

Incrível, obrigado @Kirby! Sendo que a tecla Enter agora está desativada no formulário, como você pode ativar a tecla Enter para todos os <input>campos no formulário?
111313 Ian Campbell

3

Impedir que "ENTER" envie o formulário pode incomodar alguns de seus usuários. Portanto, seria melhor se você seguir o procedimento abaixo:

Escreva o evento 'onSubmit' em sua tag de formulário:

<form name="formname" id="formId" onSubmit="return testSubmit()" ...>
 ....
 ....
 ....
</form>

escreva a função Javascript da seguinte maneira:

function testSubmit(){
  if(jQuery("#formId").valid())
      {
        return true;
      }
       return false;

     } 

     (OR)

Seja qual for o motivo, se você deseja impedir o envio do formulário ao pressionar a tecla Enter, é possível escrever a seguinte função em javascript:

    $(document).ready(function() {
          $(window).keydown(function(event){
          if(event.keyCode == 13) {
               event.preventDefault();
               return false;
              }
           });
         });

obrigado.


3

Adicione esta tag ao seu formulário - onsubmit="return false;" você poderá enviar seu formulário apenas com alguma função JavaScript.


O OP (como a maioria dos que foram mordidos por esse recurso do navegador) provavelmente ainda desejava permitir o envio com um clique do mouse, o que esse método (infelizmente recomendado frequentemente) também desativaria. Não há uma maneira agradável de resolver isso, mas, por exemplo, a resposta acima (neste momento), de Adam, faz um trabalho melhor.
Sz.

3

Para impedir o envio do formulário ao pressionar enterum campo textareaou input, verifique o evento de envio para descobrir que tipo de elemento enviou o evento.

Exemplo 1

HTML

<button type="submit" form="my-form">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.type!=="submit") {
        e.preventDefault();
    }
});

Uma solução melhor é se você não tiver um botão de envio e disparar o evento com um botão normal. É melhor porque, no primeiro exemplo, 2 eventos de envio são disparados, mas no segundo exemplo, apenas 1 evento de envio é disparado.

Exemplo 2

HTML

<button type="button" onclick="$('#my-form').submit();">Submit</button>
<form id="my-form">
...
</form>

jQuery

$(document).on('submit', 'form', function(e) {
    if (e.delegateTarget.activeElement.localName!=="button") {
        e.preventDefault();
    }
});

3

Você achará isso mais simples e útil: D

$(document).on('submit', 'form', function(e){
    /* on form submit find the trigger */
    if( $(e.delegateTarget.activeElement).not('input, textarea').length == 0 ){
        /* if the trigger is not between selectors list, return super false */
        e.preventDefault();
        return false;
    } 
});

2

E se:

<asp:Button ID="button" UseSubmitBehavior="false"/>

2

Por favor, verifique este artigo Como impedir que a tecla ENTER seja pressionada para enviar um formulário da web?

$(“.pc_prevent_submit”).ready(function() {
  $(window).keydown(function(event) {
    if (event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form class=”pc_prevent_submit” action=”” method=”post”>
  <input type=”text” name=”username”>
  <input type=”password” name=”userpassword”>
  <input type=”submit” value=”submit”>
</form>


1

Você pode capturar a tecla pressionada em um formulário em javascript e impedir que borbulhe, acho. ENTER em uma página da Web basicamente envia o formulário em que o controle atualmente selecionado é colocado.


depende de um controle tho;) em uma área de texto, ele apenas se move para a próxima linha. Portanto, capturar todos os eventos de pressionamento de tecla 'enter' não é uma boa ideia.
Kender

Possivelmente, mas nesse caso o formulário teria um evento de keydown?
295 Neil Barnwell

Você faria isso diretamente em todo o texto do tipo de entrada e em outros controles semelhantes. É um pouco de dor e não realmente vale a pena incomodar-se com na maioria dos casos, mas se você tem que ...
bobince

1

Este link fornece uma solução que funcionou para mim no Chrome, FF e IE9, além do emulador para o IE7 e 8 que vem com a ferramenta de desenvolvimento do IE9 (F12).

http://webcheatsheet.com/javascript/disable_enter_key.php


Caso o link esteja quebrado, adicione esse código à área do cabeçalho da sua página. <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")) {return false;} } document.onkeypress = stopRKey; </script>
Miaka

1

Outra abordagem é anexar o botão de entrada de envio ao formulário somente quando ele deve ser enviado e substituí-lo por uma div simples durante o preenchimento do formulário


1

Basta adicionar este atributo à sua tag FORM:

onsubmit="return gbCanSubmit;"

Em seguida, na sua tag SCRIPT, adicione este:

var gbCanSubmit = false;

Então, quando você pressiona um botão ou por qualquer outro motivo (como em uma função), você finalmente permite o envio, basta virar o booleano global e fazer uma chamada .submit (), semelhante a este exemplo:

function submitClick(){

  // error handler code goes here and return false if bad data

  // okay, proceed...
  gbCanSubmit = true;
  $('#myform').submit(); // jQuery example

}

1

Eu já me deparei com isso porque tenho vários botões de envio com valores diferentes de 'nome', para que, quando enviados, façam coisas diferentes no mesmo arquivo php. O botão enter/ returnquebra isso, pois esses valores não são enviados. Então, eu estava pensando: o botão enter/ returnativa o primeiro botão de envio no formulário? Dessa forma, você pode ter um botão de envio 'baunilha' que está oculto ou tem um valor de 'nome' que retorna o arquivo php em execução de volta à página com o formulário. Ou então, um valor padrão (oculto) de 'nome' que a tecla pressionada ativa e os botões de envio sobrescrevem com seus próprios valores de 'nome'. Apenas um pensamento.


1

E se:

<script>
function isok(e) {
  var name = e.explicitOriginalTarget.name;
  if (name == "button") {
    return true
  }
  return false;
}
</script>
<form onsubmit="return isok(event);">
<input type="text" name="serial"/>
<input type="submit" name="button" value="Create Thing"/>
</form>

E apenas nomeie seu botão à direita e ele ainda será enviado, mas os campos de texto, isto é, o explícitoOriginalTarget quando você clicar em retornar em um, não terão o nome correto.


0

Isso funcionou para mim.
onkeydown = "return! (event.keyCode == 13)"

    <form id="form1" runat="server" onkeydown="return !(event.keyCode==13)">

   </form>

1
Se você tiver área de texto, não poderá pular para a próxima linha ao entrar da mesma forma #
Aamir Afridi

0

Aqui está como eu faria isso:

window.addEventListener('keydown', function(event)
{
    if (event.key === "Enter")
    {
        if(event.target.type !== 'submit')
        {
            event.preventDefault();
            return false;
        }
    }
}

-1

colocar em arquivo externo javascript

   (function ($) {
 $(window).keydown(function (event) {  

    if (event.keyCode == 13) {

        return false;
    }
});

 })(jQuery);

ou em algum lugar dentro da etiqueta corporal

<script>


$(document).ready(function() {
    $(window).keydown(function(event) {
        alert(1);

        if(event.keyCode == 13) {

            return false;
        }
    });
});

</script>

-2

Eu tive o mesmo problema (formulários com muitos campos de texto e usuários não qualificados).

Eu resolvi desta maneira:

function chkSubmit() {
    if (window.confirm('Do you want to store the data?')) {
        return true;
    } else {
        // some code to focus on a specific field
        return false;
    }
}

usando isso no código HTML:

<form
    action="go.php" 
    method="post"
    accept-charset="utf-8"  
    enctype="multipart/form-data"
    onsubmit="return chkSubmit()"
>

Dessa maneira, a ENTERtecla funciona como planejado, mas ENTERé necessária uma confirmação ( geralmente um segundo toque).

Deixo para os leitores a busca de um script enviando o usuário no campo em que ele pressionou ENTERse ele decidir permanecer no formulário.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.