Senden eines Formulars durch Drücken der Eingabetaste ohne Senden-Schaltfläche

322

Nun, ich versuche, ein Formular zu senden, indem ich die Eingabetaste drücke, aber keine Schaltfläche zum Senden anzeige. Ich möchte nach Möglichkeit nicht in JavaScript einsteigen, da alles in allen Browsern funktionieren soll (die einzige mir bekannte JS-Methode sind Ereignisse).

Im Moment sieht das Formular folgendermaßen aus:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" style="height: 0px; width: 0px; border: none; padding: 0px;" hidefocus="true" />
</form>

Welches funktioniert ziemlich gut. Die Senden-Schaltfläche funktioniert, wenn der Benutzer die Eingabetaste drückt, und die Schaltfläche wird in Firefox, IE, Safari, Opera und Chrome nicht angezeigt. Die Lösung gefällt mir jedoch immer noch nicht, da es schwierig ist zu wissen, ob sie auf allen Plattformen mit allen Browsern funktioniert.

Kann jemand eine bessere Methode vorschlagen? Oder ist das so gut wie es nur geht?

abatishchev
quelle
7
Ein kleiner Punkt, der möglicherweise einige Zeichen aus Ihrem CSS entfernt und in der Regel automatisch ausgeführt wird, sind Minifizierer. Für Messungen mit der Länge Null benötigen Sie keine Einheiten. 0px = 0pt = 0em = 0em usw.
pwdst
@pwdst, danke, dass Sie darauf hingewiesen haben - ich komme aus der Python-Welt, also "explizit ist besser als implizit" und frage mich wirklich, ob dies in CSS der Fall ist oder haben CSS-Ersteller eine andere Sprache?
Ericmjl
2
Null ist hier die Ausnahme von der Regel @ericmjl - 0px == 0em == 0% == 0vh == 0vh usw. Bei anderen (Nicht-Null-) Längenmessungen ist es nicht nur eine schlechte Praxis, sondern gegen Standards, keine Einheiten und anzugeben In Benutzeragenten (Browsern) wird ein unterschiedliches Verhalten festgestellt. Siehe developer.mozilla.org/en-US/docs/Web/CSS/length und Drafts.csswg.org/css-values-3/#lengths
pwdst
2
Geben Sie im Zweifelsfall eine explizite Längeneinheit an.
pwdst
3
Es tut sicherlich nicht weh, die Einheit mit 0 zu addieren, aber keine zu haben, sollte unabhängig von der Sprache zu 100% gültig sein, und zwar bis hin zu mathematischen Abstraktionen. OTOH, eine praktische Verwendung von Haben gegen Nicht-Haben besteht darin, die Nachricht zu übermitteln, ob die gegebene Eigenschaft "wirklich 0 sein soll und so bleiben soll" (keine Einheit), vs. "das Ding ist jetzt zufällig Null". könnte aber nach Geschmack eingestellt sein oder was auch immer ... "(mit Einheit).
Gr.

Antworten:

237

Versuchen:

<input type="submit" style="position: absolute; left: -9999px"/>

Dadurch wird der Knopf nach links aus dem Bildschirm gedrückt. Das Schöne daran ist, dass Sie eine angemessene Verschlechterung erhalten, wenn CSS deaktiviert ist.

Update - Problemumgehung für IE7

Wie von Bryan Downing + vorgeschlagen tabindex, um zu verhindern, dass der Tab diese Schaltfläche erreicht (von Ates Goral):

<input type="submit" 
       style="position: absolute; left: -9999px; width: 1px; height: 1px;"
       tabindex="-1" />
Ates Goral
quelle
9
Ich habe gerade diese Lösung in IE7 mit dem gleichen Ergebnis wie Erebus ausprobiert. Der folgende Code behebt es:position: absolute; width: 1px; height: 1px; left: -9999px;
Bryan Downing
84
Was für ein schrecklicher Hack :( Warum ist HTML überhaupt so? Gibt es einen guten Grund für die Eingabe, in diesem Fall nicht zu arbeiten?
Nornagon
28
@nornagon: Wenn Sie der Meinung sind, dass dieser Hack schrecklich ist, können Sie einen weniger schrecklichen vorschlagen. HTML ist was es ist ...
Ates Goral
13
@ MooseFactorytabindex="-1"
Ates Goral
14
"Das Schöne ist ... eine anmutige Verschlechterung, wenn CSS deaktiviert ist"?! Ich meine sicher, das funktioniert großartig, aber der Teil "anmutige Verschlechterung" ist nur Marketingtaktik. Ich hatte noch nicht einmal davon gehört, bis ich diese Seite aus dem Jahr 2002 gefunden hatte . Richtig, das einzige Google-Ergebnis auf der ersten Seite für "CSS ist im Browser deaktiviert" stammt von vor 10 Jahren (oder 7, wenn man bedenkt, dass diese Antwort 2009 veröffentlicht wurde).
Vicky Chijwani
97

Ich denke, Sie sollten den Javascript-Weg gehen, oder zumindest würde ich:

<script type="text/javascript">
// Using jQuery.

$(function() {
    $('form').each(function() {
        $(this).find('input').keypress(function(e) {
            // Enter pressed?
            if(e.which == 10 || e.which == 13) {
                this.form.submit();
            }
        });

        $(this).find('input[type=submit]').hide();
    });
});
</script>


<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" />
</form>
Strager
quelle
6
schön, getestet und funktioniert gut. Denken Sie jedoch daran, dass das Senden eines Formulars über Javascript einige Browser nicht dazu veranlasst, das Passwort zu speichern, bevor Sie so etwas versuchen.
Andyk
3
Dadurch wird die Schaltfläche "Senden" für einen Moment angezeigt (bis die Seite geladen und der JS ausgeführt wird).
Nornagon
15
Ein Tastendruck wird auch für eine Auswahl aus der automatischen Vervollständigung ausgelöst. Wenn der Benutzer eine E-Mail-Adresse eingibt und durch Drücken der Eingabetaste eine zuvor angegebene Adresse aus der automatischen Vervollständigung des Browsers auswählt, wird Ihr Formular gesendet. Nicht das, was Ihre Benutzer erwarten.
Burger
2
Ich habe keydownvon keypressfür eine breitere Unterstützung gewechselt , aber Sie müssen auch e.preventDefault();vor dem hinzufügen, ifwenn Sie Chrome unterstützen möchten.
Campbeln
1
@Campbeln können Sie möglicherweise .on('keypress'...)stattdessen verwenden. Die Dokumente .on()sehen so aus, als würden sie den .preventDefault()Anruf für Sie erledigen .
Jinglesthula
79

Hast du das versucht?

<input type="submit" style="visibility: hidden;" />

Da die meisten Browser verstehen visibility:hiddenund es nicht wirklich so funktioniert display:none, denke ich, dass es in Ordnung sein sollte. Ich habe es nicht wirklich selbst getestet, also CMIIW.

andyk
quelle
3
Es gibt nur eine Sache visibility: hidden: Wie Sie in w3schools lesen können , Visibity: Keine beeinflusst noch das Layout. Wenn Sie dieses Leerzeichen vermeiden möchten, scheint die Lösung mit absoluter Positionierung für mich besser zu sein.
Loybert
8
Sie können beide Lösungen kombinieren:<input type="submit" style="visibility: hidden; position: absolute;" />
VaclavSir
2
Verdammt, das funktioniert nicht in IE8 (es position: absolute; left: -100px; width: 1px; height: 1px;
sendet
31

Eine andere Lösung ohne die Schaltfläche "Senden":

HTML

<form>
  <input class="submit_on_enter" type="text" name="q" placeholder="Search...">
</form>

jQuery

$(document).ready(function() {

  $('.submit_on_enter').keydown(function(event) {
    // enter has keyCode = 13, change it if you want to use another button
    if (event.keyCode == 13) {
      this.form.submit();
      return false;
    }
  });

});
Damoiser
quelle
1
Komischer Trick. Dass du deinen Button in ein Textfeld machst! Aber da der Trick für alle Browser funktioniert, habe ich Sie gutgeschrieben!
Jenna Leaf
danke @JennaLeaf ;-) Wie auch immer, ich denke, dass es nicht so seltsam ist - viele Online-Formulare verwenden, um das einfache "Auslösen" des Keydowns einzureichen. Ein Beispiel könnte die Google-Suchleiste sein (vielleicht verwenden sie nicht genau diesen Code, aber wahrscheinlich etwas Ähnliches).
Damoiser
16

Für alle, die sich diese Antwort in Zukunft ansehen, implementiert HTML5 ein neues Attribut für Formularelemente hidden, das automatisch angewendet wirddisplay:none auf Ihr Element angewendet wird.

z.B

<input type="submit" hidden />
Panomosh
quelle
Während es mit Desktop-Chrome zu funktionieren scheint, scheint es nicht mit Chrome oder Safari auf dem iPhone zu funktionieren.
Ulf Adams
@UlfAdams Es funktioniert mit Chrome und Safari auf dem iPhone 12.1.2.
Matthew Campbell
13

Verwenden Sie folgenden Code, dies hat mein Problem in allen 3 Browsern (FF, IE und Chrome) behoben:

<input  type="submit" name="update" value=" Apply " 
    style="position: absolute; height: 0px; width: 0px; border: none; padding: 0px;"
    hidefocus="true" tabindex="-1"/>

Fügen Sie die obige Zeile als erste Zeile in Ihren Code mit dem entsprechenden Wert für Name und Wert ein.

Mayank Gupta
quelle
7

Anstelle des Hacks, mit dem Sie die Schaltfläche derzeit ausblenden, ist es viel einfacher, visibility: collapse;das Stilattribut festzulegen. Ich würde jedoch weiterhin empfehlen, ein wenig einfaches Javascript zu verwenden, um das Formular einzureichen. Soweit ich weiß, ist die Unterstützung für solche Dinge heutzutage allgegenwärtig.

Noldorin
quelle
7

Setzen Sie einfach das versteckte Attribut auf true:

<form name="loginBox" target="#here" method="post">
    <input name="username" type="text" /><br />
    <input name="password" type="password" />
    <input type="submit" hidden="true" />
</form>
Jumpnett
quelle
4
Das ausgeblendete Attribut deaktiviert das Senden durch Drücken der Eingabetaste.
66Ton99
@ 66Ton99 Einfach in FF testen. Es deaktiviert nicht die Einreichung
Eugen Konkov
1
"es funktioniert auf meinem Computer";) Es gibt viel mehr Browser als Firefox. Man kann sich wohl eine Lösung wünschen, die zuverlässig browserübergreifend funktioniert.
Félix Gagnon-Grenier
Funktioniert auf Chrome 63
piotr_cz
Funktioniert derzeit nicht in Chrome oder Safari auf dem iPhone.
Ulf Adams
7

Die eleganteste Art, dies zu tun, besteht darin, die Senden-Schaltfläche beizubehalten, aber den Rand, den Abstand und die Schriftgröße auf 0 zu setzen.

Dadurch werden die Schaltflächenabmessungen auf 0x0 gesetzt.

<input type="submit" style="border:0; padding:0; font-size:0">

Sie können dies selbst versuchen. Wenn Sie einen Umriss für das Element festlegen, wird ein Punkt angezeigt, der den äußeren Rand darstellt, der das 0x0 px-Element "umgibt".

Keine Notwendigkeit für Sichtbarkeit: versteckt, aber wenn es Sie nachts schlafen lässt, können Sie das auch in die Mischung werfen.

JS Fiddle

Waltur Buerk
quelle
5

Der IE erlaubt nicht das Drücken der EINGABETASTE zum Senden von Formularen, wenn die Schaltfläche zum Senden nicht sichtbar ist und das Formular mehr als ein Feld enthält. Geben Sie ihm das, was er will, indem Sie ein transparentes Bild mit 1 x 1 Pixel als Senden-Schaltfläche bereitstellen. Natürlich nimmt es ein Pixel des Layouts ein, aber schauen Sie, was Sie tun müssen, um es auszublenden.

<input type="image" src="img/1x1trans.gif"/>
Winston Tamblyn
quelle
4

Dies ist meine Lösung, getestet in Chrome, Firefox 6 und IE7 +:

.hidden{
    height: 1px;
    width: 1px;
    position: absolute;
    z-index: -100;
}
vjnrv
quelle
Scheint, als ob IE8 Position nicht mag: absolut, es wird nicht eingereicht.
Maxxyme
4
<input type="submit" style="display:none;"/>

Dies funktioniert gut und ist die expliziteste Version dessen, was Sie erreichen möchten.

Beachten Sie, dass es einen Unterschied zwischen display:noneund visibility:hiddenfür andere Formularelemente gibt.

Shammoo
quelle
4

HTML5-Lösung

<input type="submit" hidden />
Andrew Luca
quelle
Wie oben - funktioniert nicht mit Chrome oder Safari auf dem iPhone.
Ulf Adams
3

der einfachste Weg

<input type="submit" style="width:0px; height:0px; opacity:0;"/>
Shahin Mammadzada
quelle
2

Für diejenigen, die Probleme mit dem Internet Explorer haben und auch für andere.

{
    float: left;
    width: 1px;
    height: 1px;
    background-color: transparent;
    border: none;
}
Jekis
quelle
Ich würde immer noch position verwenden: absolut, float beeinflusst das Layout.
SuperDuck
Scheint, als ob IE8 Position nicht mag: absolut, es wird nicht eingereicht. Ich benutze:
Maxxyme
Gleiches gilt für das float: left;Entfernen, wenn es entfernt wird.
Maxxyme
2

Sie könnten auch dies versuchen

<INPUT TYPE="image" SRC="0piximage.gif" HEIGHT="0" WIDTH="0" BORDER="0">

Sie können ein Bild mit der Breite / Höhe = 0 px einfügen

waney
quelle
1
WICHTIG: Sie MÜSSEN eine gültige Bild-URL verwenden, sonst zeigt Firefox auf Ihrer Seite den Text "Abfrage senden" an
PH.
2
Wenn Sie ein vorhandenes Bild hinzufügen und Höhe und Breite auf Null setzen oder ein nicht vorhandenes Bild hinzufügen, muss der Browser eine verschwendete GET-Anforderung für die Ressource stellen.
pwdst
2

Ich arbeite mit einer Reihe von UI-Frameworks. Viele von ihnen haben eine integrierte Klasse, mit der Sie Dinge visuell verbergen können.

Bootstrap

<input type="submit" class="sr-only" tabindex="-1">

Winkelmaterial

<input type="submit" class="cdk-visually-hidden" tabindex="-1">

Brillante Köpfe, die diese Frameworks erstellt haben, haben diese Stile wie folgt definiert:

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.cdk-visually-hidden {
    border: 0;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
    outline: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
}
H Hund
quelle
1

Ich habe es einer Funktion auf Dokument fertig hinzugefügt. Wenn das Formular keine Schaltfläche zum Senden enthält (alle meine Jquery-Dialogformulare haben keine Schaltflächen zum Senden), fügen Sie es hinzu.

$(document).ready(function (){
    addHiddenSubmitButtonsSoICanHitEnter();
});
function addHiddenSubmitButtonsSoICanHitEnter(){
    var hiddenSubmit = "<input type='submit' style='position: absolute; left: -9999px; width: 1px; height: 1px;' tabindex='-1'/>";
    $("form").each(function(i,el){
        if($(this).find(":submit").length==0)
            $(this).append(hiddenSubmit);
    });
}
seePatCode
quelle
0
input.on('keypress', function(event) {
    if ( event.which === 13 ) {
        form.submit();
        return false;
    }
});
Marty
quelle
-2

Ich habe verwendet:

<input class="hidden" type="submit" value="" 
onclick="document.getElementById('loginform').submit();"/>

und:

 .hidden {
        border:0;
        padding:0;
        font-size:0;
        width: 0px;
        height: 0px;
    }

in der CSS-Datei. Es hat auch für mich magisch funktioniert. :) :)

Mihai Savin
quelle