Como enviar um formulário quando a tecla Enter é pressionada?

84

Alguém pode me dizer como enviar um formulário HTML quando a tecla Enter é pressionada e se não há botões no formulário? O botão de envio não está lá . Estou usando um div personalizado em vez disso.

Niyaz
fonte

Respostas:

61

IMO, esta é a resposta mais limpa:

<form action="" method="get">
  Name: <input type="text" name="name"/><br/>
  Pwd: <input type="password" name="password"/><br/>
  <div class="yourCustomDiv"/>
  <input type="submit" style="display:none"/>
</form>

Melhor ainda, se você estiver usando javascript para enviar o formulário usando o div personalizado, você também deve usar javascript para criá-lo e para definir o estilo display: none no botão. Desta forma, os usuários com javascript desabilitado ainda verão o botão enviar e poderão clicar nele.


Foi observado que display: none fará com que o IE ignore a entrada. Eu criei um novo exemplo de JSFiddle que começa como um formulário padrão e usa o aprimoramento progressivo para ocultar o envio e criar o novo div. Usei o estilo CSS do StriplingWarrior .

Chris Marasti-Georg
fonte
7
A forma descrita acima não funciona no IE. O IE ignora o botão de envio oculto.
Chuck Phillips
@ChuckPhillips A resposta foi atualizada com um novo exemplo que deve funcionar corretamente no IE também.
Chris Marasti-Georg,
1
Tentei fazer isso no Safari (5.1.2) e não funciona. Eu apenas fico na mesma página. Tentei remover o estilo "display: none". E funcionou! Parece que o Safari precisa do botão enviar para ficar visível.
3
Também não funciona na versão 19.0.1084.56 do Chrome - o botão enviar precisa estar visível para funcionar. Veja a resposta de StriplingWarrior abaixo para uma correção confiável que funciona no Chrome, Safari e IE.
user2398029
87

Para enviar o formulário quando a tecla Enter for pressionada, crie uma função javascript ao longo dessas linhas.

function checkSubmit(e) {
   if(e && e.keyCode == 13) {
      document.forms[0].submit();
   }
}

Em seguida, adicione o evento a qualquer escopo necessário, por exemplo, na tag div:

<div onKeyPress="return checkSubmit(event)"/>

Porém, este também é o comportamento padrão do Internet Explorer 7 (provavelmente versões anteriores também).

John Hunter
fonte
1
Parece que o bloqueador de pop-up do firefoxes captura este = |.
João
4
Eu prefiro "keyup" para que o ato de manter a tecla enter pressionada não seja multi-trigger.
Justin Skiles
54

Tentei várias estratégias baseadas em javascript / jQuery, mas continuei tendo problemas. O último problema que surgiu envolveu o envio acidental quando o usuário usa a tecla enter para selecionar na lista de preenchimento automático integrada do navegador. Finalmente mudei para esta estratégia, que parece funcionar em todos os navegadores que minha empresa suporta:

<div class="hidden-submit"><input type="submit" tabindex="-1"/></div>
.hidden-submit {
    border: 0 none;
    height: 0;
    width: 0;
    padding: 0;
    margin: 0;
    overflow: hidden;
}

Isso é semelhante à resposta atualmente aceita por Chris Marasti-Georg, mas ao evitar display: none, parece funcionar corretamente em todos os navegadores.

Atualizar

Eu editei o código acima para incluir um negativo, de tabindexmodo que não capture a tecla tab. Embora isso tecnicamente não seja validado no HTML 4, a especificação do HTML5 inclui linguagem para fazê-lo funcionar da maneira que a maioria dos navegadores já estava implementando de qualquer maneira.

StriplingWarrior
fonte
14

Use a <button>tag. Do padrão W3C:

Os botões criados com o elemento BUTTON funcionam da mesma forma que os botões criados com o elemento INPUT, mas oferecem possibilidades de renderização mais ricas: o elemento BUTTON pode ter conteúdo. Por exemplo, um elemento BUTTON que contém uma imagem funciona como e pode ser semelhante a um elemento INPUT cujo tipo é definido como "imagem", mas o tipo de elemento BUTTON permite conteúdo.

Basicamente, há outra tag, <button>que não requer javascript , que também pode enviar um formulário. Ele pode ser estilizado na forma de uma <div>tag (incluindo <img />dentro da tag do botão). Os botões da <input />tag não são tão flexíveis.

<button type="submit">
    <img src="my-icon.png" />
    Clicking will submit the form
</button>

Existem três tipos de configuração no <button>; eles mapeiam para os <input>tipos de botão.

<button type="submit">Will submit the form</button>
<button type="reset">Will reset the form</button>
<button type="button">Will do nothing; add javascript onclick hooks</button>

Padrões

Eu uso <button>tags com e um pouco de estilo para obter botões coloridos e funcionais. Observe que é possível escrever css para, por exemplo, <a class="button">links compartilhados para estilização com o <button>elemento.

Joel Purra
fonte
9

Eu acredito que é isso que você quer.

//<![CDATA[

//Send form if they hit enter.
document.onkeypress = enter;
function enter(e) {
  if (e.which == 13) { sendform(); }
}

//Form to send
function sendform() {
  document.forms[0].submit();
}
//]]>

Cada vez que uma tecla é pressionada, a função enter () será chamada. Se a tecla pressionada corresponder à tecla Enter (13), sendform () será chamado e o primeiro formulário encontrado será enviado. Isso é apenas para Firefox e outros navegadores compatíveis com os padrões.

Se você achar este código útil, não deixe de votar em mim!

Falcão
fonte
1
E se um usuário quiser inserir uma nova linha em shift, antes de enviar o formulário?
Gaʀʀʏ
7

Aqui está como faço isso com jQuery

j(".textBoxClass").keypress(function(e)
{
    // if the key pressed is the enter key
    if (e.which == 13)
    {
        // do work
    }
});

Outro javascript não seria muito diferente. o problema é verificar o argumento de tecla "13", que é a tecla enter

Sean Chambers
fonte
Eu uso a resposta de @ [Sean] (# 29951) em meu código, exceto que descobri que também tenho que capturar e.which == 10.
travis
6

Use o seguinte script.

<SCRIPT TYPE="text/javascript">
<!--
    function submitenter(myfield,e)
    {
        var keycode;
        if (window.event) keycode = window.event.keyCode;
        else if (e) keycode = e.which;
        else return true;

        if (keycode == 13)
        {
            myfield.form.submit();
            return false;
        }
        else
            return true;
    }
//-->
</SCRIPT>

Para cada campo que deve enviar o formulário quando o usuário clicar em Enter, chame a função submitenter da seguinte maneira.

<FORM ACTION="../cgi-bin/formaction.pl">
    name:     <INPUT NAME=realname SIZE=15><BR>
    password: <INPUT NAME=password TYPE=PASSWORD SIZE=10
       onKeyPress="return submitenter(this,event)"><BR>
<INPUT TYPE=SUBMIT VALUE="Submit">
</FORM>
Bill the Lizard
fonte
2

Eu uso este método:

<form name='test' method=post action='sendme.php'>
    <input type=text name='test1'>
    <input type=button value='send' onClick='document.test.submit()'>
    <input type=image src='spacer.gif'>  <!-- <<<< this is the secret! -->
</form>

Basicamente, acabei de adicionar uma entrada invisível do tipo imagem (onde " spacer.gif " é um gif transparente 1x1).

Desta forma, posso enviar este formulário com o botão 'enviar' ou simplesmente pressionando enter no teclado.

Esse é o truque!

Niente
fonte
1
A questão é como enviar o formulário SEM mostrar um botão de envio.
Marco Demaio
0

Por que você simplesmente não aplica os estilos de envio de div a um botão de envio? Tenho certeza de que há um javascript para isso, mas seria mais fácil.

Ross
fonte
Eu tenho o mesmo problema, usando os botões jQUery UI. Com esses widgets, você tem a opção de adicionar um pequeno ícone agradável ao botão (ou até 2, se desejar). Mas esta opção não funciona se você usar a tag de entrada como o botão de envio. Então você tem que usar a, ou span ou div.
Pierre Henry,
0

Se você estiver usando asp.net, poderá usar o atributo defaultButton no formulário.

Corin Blaikie
fonte
0

Estendendo as respostas, isso é o que funcionou para mim, talvez alguém ache útil.

Html

<form method="post" action="/url" id="editMeta">
   <textarea class="form-control" onkeypress="submitOnEnter(event)"></textarea>
</form>

Js

function submitOnEnter(e) {
  if (e.which == 13) {
    document.getElementById("editMeta").submit()
  }
}
f_i
fonte
-1

Semelhante ao exemplo de Chris Marasti-Georg, em vez de usar javascript embutido. Essencialmente, adicione onkeypress aos campos com os quais deseja que a tecla Enter funcione. Este exemplo atua no campo de senha.

<html>
<head><title>title</title></head>
<body>
  <form action="" method="get">
  Name: <input type="text" name="name"/><br/>
  Pwd: <input type="password" name="password" onkeypress="if(event.keyCode==13) {javascript:form.submit();}" /><br/>
  <input type="submit" onClick="javascript:form.submit();"/>
</form>
</body>
</html>
denn
fonte
Não é isso que a pergunta feita. O objetivo era finalizar sem um botão de envio ...
jason
-1

Como os display: nonebotões e entradas não funcionam no Safari e no IE, descobri que a maneira mais fácil, sem exigir hacks extras de javascript , é simplesmente adicionar um posicionado absolutamente <button />ao formulário e colocá-lo longe da tela.

<form action="" method="get">
  <input type="text" name="name" />
  <input type="password" name="password" />
  <div class="yourCustomDiv"/>
  <button style="position:absolute;left:-10000px;right:9990px"/>
</form>

Isso funciona na versão atual de todos os principais navegadores em setembro de 2016.

Obviamente, é recomendado (e mais semanticamente correto) estilizar <button/>como desejado.

AndrewH
fonte
Você não enfatiza nenhum hack de JavaScript e ainda apresenta um hack de CSS.
reformado em
-2

Usar o atributo "autofocus" funciona para dar foco de entrada ao botão por padrão. Na verdade, clicar em qualquer controle dentro do formulário também dá foco ao formulário, um requisito para que o formulário reaja ao RETORNO. Portanto, o "foco automático" faz isso por você, caso o usuário nunca tenha clicado em qualquer outro controle dentro do formulário.

Portanto, o "foco automático" faz a diferença crucial se o usuário nunca clicou em nenhum dos controles do formulário antes de clicar em RETORNAR.

Mas, mesmo assim, ainda há 2 condições a serem atendidas para que isso funcione sem JS:

a) você deve especificar uma página para ir (se deixada em branco, não funcionará). No meu exemplo, é hello.php

b) o controle deve ser visível. É possível que você o mova para fora da página para ocultá-lo, mas não pode usar display: none ou visibility: hidden. O que fiz foi usar o estilo embutido apenas para movê-lo para a esquerda em 200px. Fiz a altura 0px para que não ocupe espaço. Caso contrário, ele ainda pode interromper outros controles acima e abaixo. Ou você pode flutuar o elemento também.

<form action="hello.php" method="get">
  Name: <input type="text" name="name"/><br/>
  Pwd: <input type="password" name="password"/><br/>
  <div class="yourCustomDiv"/>
  <input autofocus type="submit" style="position:relative; left:-200px; height:0px;" />
</form>
realtimeguy
fonte
o downvoter poderia me informar o que foi questionável com minha solução?
realtimeguy