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?


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

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>

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.


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

});

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

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.


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.


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>

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


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

4

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

.hidden{
    height: 1px;
    width: 1px;
    position: absolute;
    z-index: -100;
}

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.


4

HTML5-Lösung

<input type="submit" hidden />

Wie oben - funktioniert nicht mit Chrome oder Safari auf dem iPhone.
Ulf Adams


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

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


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

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

0
input.on('keypress', function(event) {
    if ( event.which === 13 ) {
        form.submit();
        return false;
    }
});

-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. :) :)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.