Jak przesłać formularz po naciśnięciu klawisza powrotu?

84

Czy ktoś może mi powiedzieć, jak wysłać formularz HTML po naciśnięciu klawisza powrotu i jeśli w formularzu nie ma przycisków? Nie ma przycisku przesyłania . Zamiast tego używam niestandardowego elementu div.

Niyaz
źródło

Odpowiedzi:

61

IMO, to najczystsza odpowiedź:

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

Jeszcze lepiej, jeśli używasz javascript do przesyłania formularza za pomocą niestandardowego div, powinieneś również użyć javascript do jego utworzenia i ustawić styl display: none na przycisku. W ten sposób użytkownicy z wyłączoną obsługą javascript nadal będą widzieć przycisk przesyłania i będą mogli go kliknąć.


Zauważono, że display: none spowoduje ignorowanie danych wejściowych przez IE. Utworzyłem nowy przykład JSFiddle, który zaczyna się jako standardowy formularz i używa progresywnego ulepszania, aby ukryć przesyłanie i utworzyć nowy element div. Użyłem stylu CSS ze StriplingWarrior .

Chris Marasti-Georg
źródło
7
Opisany powyżej sposób nie działa w IE. IE ignoruje ukryty przycisk przesyłania.
Chuck Phillips,
@ChuckPhillips Odpowiedź została zaktualizowana o nowy przykład, który powinien działać poprawnie również w IE.
Chris Marasti-Georg
1
Próbowałem tego w Safari (5.1.2) i to nie działa. Po prostu zostaję na tej samej stronie. Próbowałem usunąć styl „display: none”. I zadziałało! Wygląda na to, że Safari potrzebuje przycisku przesyłania, aby był widoczny.
3
Nie działa również w Chrome w wersji 19.0.1084.56 - przycisk przesyłania musi być widoczny, aby działał. Zobacz odpowiedź StriplingWarrior poniżej, aby uzyskać niezawodną poprawkę, która działa w Chrome, Safari i IE.
user2398029
87

Aby wysłać formularz po naciśnięciu klawisza Enter, utwórz funkcję javascript wzdłuż tych linii.

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

Następnie dodaj zdarzenie do dowolnego zakresu, którego potrzebujesz, np. W znaczniku DIV:

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

Jest to jednak i tak domyślne zachowanie przeglądarki Internet Explorer 7 (prawdopodobnie również wcześniejszych wersji).

John Hunter
źródło
1
Wygląda na to, że program blokujący wyskakujące okienka firefoxów przechwytuje ten = |.
John
4
Wolę "keyup", aby czynność przytrzymania klawisza enter nie była wielokrotnym wyzwalaniem.
Justin Skiles
54

Próbowałem różnych strategii opartych na javascript / jQuery, ale wciąż miałem problemy. Ostatni problem, który się pojawił, dotyczył przypadkowego przesłania, gdy użytkownik użył klawisza Enter, aby wybrać z wbudowanej listy autouzupełniania przeglądarki. W końcu przeszedłem na tę strategię, która wydaje się działać na wszystkich przeglądarkach obsługiwanych przez moją firmę:

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

Jest to podobne do obecnie akceptowanej odpowiedzi Chrisa Marasti-Georga, ale unikając display: nonejej, wydaje się, że działa poprawnie we wszystkich przeglądarkach.

Aktualizacja

Edytowałem powyższy kod, aby uwzględnić negatyw, tabindexwięc nie przechwytuje klawisza tabulacji. Chociaż technicznie nie sprawdza się to w HTML 4, specyfikacja HTML5 zawiera język, dzięki któremu działa tak, jak większość przeglądarek już ją implementowała.

StriplingWarrior
źródło
14

Użyj <button>tagu. Ze standardu W3C:

Przyciski utworzone za pomocą elementu BUTTON działają podobnie jak przyciski utworzone za pomocą elementu INPUT, ale oferują bogatsze możliwości renderowania: element BUTTON może mieć treść. Na przykład element BUTTON zawierający obraz działa jak i może przypominać element INPUT, którego typ jest ustawiony na „obraz”, ale typ elementu BUTTON dopuszcza zawartość.

Zasadniczo istnieje inny tag, <button>który nie wymaga javascript , a który również może przesłać formularz. Można go stylizować na wzór <div>tagu (w tym <img />wewnątrz tagu przycisku). Przyciski z <input />tagu nie są tak elastyczne.

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

Istnieją trzy typy do ustawienia <button>; odwzorowują <input>typy przycisków.

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

Normy

Używam <button>tagów z i trochę stylizacja, aby uzyskać kolorowe i funkcjonalne guziki. Zwróć uwagę, że można napisać css, na przykład dla <a class="button">linków współdzielonych ze stylizacją z <button>elementem.

Joel Purra
źródło
9

Wierzę, że tego chcesz.

//<![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();
}
//]]>

Za każdym naciśnięciem klawisza wywoływana jest funkcja enter (). Jeśli naciśnięty klawisz pasuje do klawisza enter (13), to zostanie wywołana sendform () i zostanie wysłany pierwszy napotkany formularz. Dotyczy to tylko przeglądarki Firefox i innych przeglądarek zgodnych ze standardami.

Jeśli uznasz ten kod za przydatny, nie zapomnij zagłosować na mnie!

Jastrząb
źródło
1
Co jeśli użytkownik chce wprowadzić nową linię przed wysłaniem formularza?
Gaʀʀʏ
7

Oto jak to robię za pomocą jQuery

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

Inne javascript nie byłyby zbyt różne. haczyk sprawdza argument keypress o wartości „13”, czyli klawisz Enter

Sean Chambers
źródło
Używam odpowiedzi @ [Sean] (# 29951) w moim kodzie, z tym wyjątkiem, że stwierdziłem, że również muszę złapać e.which == 10.
travis
6

Użyj następującego skryptu.

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

W przypadku każdego pola, które powinno przesłać formularz, gdy użytkownik wejdzie w okno, wywołaj funkcję wysyłającą w następujący sposób.

<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
źródło
2

Używam tej metody:

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

Zasadniczo dodam tylko niewidoczne dane wejściowe typu image (gdzie „ spacer.gif ” to 1x1 przezroczysty gif).

W ten sposób mogę przesłać ten formularz za pomocą przycisku „wyślij” lub po prostu naciskając klawisz Enter na klawiaturze.

To jest sztuczka!

Niente
źródło
1
Pytanie brzmi: jak wysłać formularz BEZ pokazywania przycisku przesyłania.
Marco Demaio
0

Dlaczego po prostu nie zastosujesz stylów przesyłania div do przycisku przesyłania? Jestem pewien, że istnieje do tego javascript, ale to byłoby łatwiejsze.

Ross
źródło
Mam ten sam problem, używając przycisków jQUery UI. Dzięki tym widżetom masz możliwość dodania ładnej małej ikony do przycisku (lub nawet 2, jeśli chcesz). Ale ta opcja nie działa, jeśli używasz znacznika wejściowego jako przycisku przesyłania. Musisz więc użyć a, lub span lub div.
Pierre Henry
0

Jeśli używasz asp.net, możesz użyć atrybutu defaultButton w formularzu.

Corin Blaikie
źródło
0

Rozszerzając odpowiedzi, to mi się udało, może komuś się przyda.

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
źródło
-1

Podobnie jak w przykładzie Chrisa Marasti-Georga, zamiast tego używa wbudowanego javascript. Zasadniczo dodaj onkeypress do pól, z którymi ma współpracować klawisz Enter. Ten przykład działa w polu hasła.

<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
źródło
Nie o to chodziło w pytaniu. Celem było poddanie się bez przycisku przesyłania ...
jason
-1

Ponieważ display: noneprzyciski i dane wejściowe nie działają w Safari i IE, odkryłem, że najłatwiejszym sposobem, nie wymagającym dodatkowych hacków javascript , jest po prostu dodanie absolutnie pozycjonowanego <button />do formularza i umieszczenie go daleko poza ekranem.

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

Działa to w aktualnej wersji wszystkich głównych przeglądarek od września 2016 r.

Oczywiście jego zalecane (i bardziej poprawne semantycznie) po prostu stylizowanie <button/>według potrzeb.

AndrewH
źródło
Podkreślasz brak hacków JavaScript, a mimo to przedstawiasz hack CSS.
zreformowany
-2

Użycie atrybutu „autofocus” działa, aby domyślnie nadać fokus przyciskowi. W rzeczywistości kliknięcie dowolnego elementu sterującego w formularzu również powoduje uaktywnienie formularza, co jest wymogiem, aby formularz zareagował na POWRÓT. Tak więc „autofokus” robi to za Ciebie na wypadek, gdyby użytkownik nigdy nie kliknął żadnej innej kontrolki w formularzu.

Tak więc „autofokus” ma zasadnicze znaczenie, jeśli użytkownik nigdy nie kliknął żadnej kontrolki formularza przed naciśnięciem przycisku RETURN.

Ale nawet wtedy nadal istnieją 2 warunki, które muszą być spełnione, aby to działało bez JS:

a) musisz określić stronę, do której chcesz przejść (jeśli pozostanie pusta, nie zadziała). W moim przykładzie jest to hello.php

b) kontrola musi być widoczna. Można sobie wyobrazić, że można go usunąć ze strony, aby ukryć, ale nie można użyć display: none lub visibility: hidden. To, co zrobiłem, to użycie stylu wbudowanego, aby po prostu przesunąć go ze strony w lewo o 200 pikseli. Wysokość ustawiłem na 0px, aby nie zajmowała miejsca. Ponieważ w przeciwnym razie nadal może zakłócać inne kontrolki powyżej i poniżej. Lub możesz też unosić element.

<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
źródło
czy przeciwnik może powiedzieć mi, co było nie do przyjęcia w moim rozwiązaniu?
realtimeguy