2008-08-01 7 views
229

Angenommen, Sie erstellen einen Assistenten in einem HTML-Formular. Ein Knopf geht zurück und einer geht vorwärts. Da die Schaltfläche zurück zuerst im Markup angezeigt wird, wenn Sie die Eingabetaste drücken, wird diese Schaltfläche verwendet, um das Formular zu senden.Mehrere Übermittlungsschaltflächen in einem HTML-Formular

Beispiel:

<form> 
 
    <!-- put your cursor in this field and press Enter --> 
 
    <input type="text" name="field1" /> 
 

 
    <!-- This is the button that will submit --> 
 
    <input type="submit" name="prev" value="Previous Page" /> 
 

 
    <!-- But this is the button that I WANT to submit --> 
 
    <input type="submit" name="next" value="Next Page" /> 
 
</form>

Was ich tun möchte, ist zu entscheiden, erhalten, auf die Taste wird das Formular abzuschicken, wenn ein Benutzer die Eingabetaste drückt. Auf diese Weise wird beim Drücken der Eingabetaste der Assistent zur nächsten Seite und nicht zur vorherigen Seite verschoben. Müssen Sie dazu tabindex verwenden?

Antwort

131

Ich hoffe, das hilft. Ich mache nur den Trick von float die Knöpfe auf der rechten Seite.

diese Weise wird die vorherige Taste der Schaltfläche Weiter links ist, aber der nächste kommt zuerst im HTML-Code:

.f { 
 
    float: right; 
 
} 
 
.clr { 
 
    clear: both; 
 
}
<form action="action" method="get"> 
 
    <input type="text" name="abc"> 
 
    <div id="buttons"> 
 
    <input type="submit" class="f" name="next" value="Next"> 
 
    <input type="submit" class="f" name="prev" value="Prev"> 
 
    <div class="clr"></div><!-- This div prevents later elements from floating with the buttons. Keeps them 'inside' div#buttons --> 
 
    </div> 
 
</form>

Edit: Vorteile über andere Vorschläge: kein JavaScript, zugänglich, beide Tasten bleiben type="submit"

+20

Bitte tun Sie dies nicht, ohne auch die Tabulatorreihenfolge zu ändern, so dass Sie durch Drücken der Tabulatortaste die Schaltflächen durchlaufen, wie sie auf dem Bildschirm erscheinen. – Steve

53

Geben Sie Ihrem einreichen Tasten gleichen Namen wie folgt aus:

<input type="submit" name="submitButton" value="Previous Page" /> 
<input type="submit" name="submitButton" value="Next Page" /> 

Wenn der Benutzer eingeben und die Anfrage geht an den Server, können Sie den Wert für submitButton auf dem serverseitigen Code überprüfen, welche ein enthält Sammlung von Formular name/value Paare. Zum Beispiel im klassischen ASP:

If Request.Form("submitButton") = "Previous Page" Then 
    ' Code for Previous Page 
ElseIf Request.Form("submitButton") = "Next Page" Then 
    ' Code for Next Page 
End If 

Referenz: Using multiple submit buttons on a single form

+25

Dies ist nicht das, was der Benutzer gefragt. Der Benutzer wollte wissen, wie er steuert, welcher Submit-Button in einem Formular aktiviert wird, wenn Enter gedrückt wird, dh. Das ist die Standardschaltfläche. – kosoant

+20

funktioniert nicht in einer I18n-Anwendung, wo Sie nicht einmal die Beschriftung der Schaltfläche kennen. – Chris

60

Wäre es möglich sein, dass Sie die vorherige Taste Typ in eine Schaltfläche wie folgt zu ändern:

<input type="button" name="prev" value="Previous Page" /> 

Jetzt auf die Schaltfläche Weiter würde Als Standard können Sie auch das Attribut default hinzufügen, damit Ihr Browser es so hervorhebt:

<input type="submit" name="next" value="Next Page" default /> 

Hoffe, dass hilft.

+37

** Über welches 'Standard'-Attribut sprichst du? ** Es gibt kein" Standard "-Attribut, das gültig wäre: http: //www.w3.org/html/wg/Entwürfe/html/master/single-page.html # the-input-element (nicht in HTML5, HTML 4.01 Transitional/Streng, XHTML 1.0 Strict). Und ich sehe nicht, warum es besser wäre, den Eingangstyp von 'submit' zu' button' zu ändern. Sie können mehrere Übergabetyp-Eingabeelemente in einem Formular ohne Probleme haben. Ich verstehe nicht wirklich, warum diese Antwort so hochgestuft ist. – Sk8erPeter

+3

Eine Eingabe vom Typ "button" führt die Formularaktion nicht aus. Sie können einen onclick oder etwas haben und so eine andere Funktion ausführen als die Formularaktion "default" (die durch Drücken der Schaltfläche "submit" ausgeführt wird). Das habe ich gesucht und deshalb habe ich es aufgewertet. Kann nicht für das "Standard" -Attribut sprechen, war nicht Teil meines Problems;) Danke für Ihre Klarstellung, obwohl. – Jonas

+2

@ Sk8erPeter, @Jonas .... hmm .. Ich vermute, dass dieses 'default' Attribut ein globales Attribut ist; Aufzählungsattribut, das mit Aufzählungszuständen verknüpft ist: http://www.w3.org/html/wg/drafts/html/master/single-page.html#keywords-and-enumerated-attributes. Abgesehen von diesem Punkt .. der Knopf Aspekt der diese Antwort ist keine Antwort .. Es ist ein '** bedingter Vorschlag **' oder eine Abfrage (** Frage selbst **). –

30

Wenn die Tatsache, dass die erste Schaltfläche standardmäßig verwendet wird, in allen Browsern konsistent ist, warum sollten Sie sie nicht im Quellcode korrigieren und dann CSS verwenden, um ihre scheinbaren Positionen zu wechseln? float sie links und rechts, um sie zum Beispiel visuell umzuschalten.

15

Ich würde Javascript verwenden, um das Formular zu senden. Die Funktion würde durch das Ereignis OnKeyPress des Formularelements ausgelöst und würde erkennen, ob die Eingabetaste ausgewählt wurde. Wenn dies der Fall ist, wird das Formular gesendet.

Hier sind zwei Seiten, die Techniken zur Vorgehensweise angeben: 1, 2. Auf dieser Grundlage ist hier ein Beispiel für die Nutzung (basierend auf here):

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

<INPUT NAME="MyText" TYPE="Text" onKeyPress="return submitenter(this,event)" /> 
+2

Was passiert wenn Javascript? ist behindert? –

+2

Sie sollten nicht verwenden, um JS zu kommentieren, diese Tags sind keine JavaScript-Sprachtokens – Marecky

+2

@Marecky Sie sind JS nicht auskommentieren. Sie werden ignoriert, wenn der Inhalt von

17

Kevin, das kann nicht mit reinem HTML getan werden. Für diesen Trick müssen Sie sich auf JavaScript verlassen.

Wenn Sie jedoch zwei Formulare auf der HTML-Seite platzieren, können Sie dies tun.

Form1 hätte die vorherige Schaltfläche.

Form2 hätte alle Benutzereingaben + die nächste Schaltfläche.

Wenn der Benutzer drückt, geben Sie in Form2 ein, die Schaltfläche Next submit wird ausgelöst.

14

Kevin,

Dies funktioniert ohne Javascript oder CSS in den meisten Browsern:

<form> 
<p><input type="text" name="field1" /></p> 
<p><a href="previous.html"> 
<button type="button">Previous Page</button></a> 
<button type="submit">Next Page</button></p> 
</form> 

Firefox, Opera, Safari, Google Chrome alle Arbeiten.
Wie immer ist IE das Problem.

Diese Version funktioniert, wenn JavaScript eingeschaltet:

<form> 
<p><input type="text" name="field1" /></p> 
<p><a href="previous.html"> 
<button type="button" onclick="window.location='previous.html'">Previous Page</button></a> 
<button type="submit">Next Page</button></p> 
</form> 

So ist der Fehler in dieser Lösung ist:
Vorherige Seite funktioniert nicht, wenn Sie IE mit Javascript ausgeschaltet verwenden.
Wohlgemerkt, der Zurück-Button funktioniert immer noch!

+0

Ohne Javascript können Sie die Schaltfläche "vorherige Seite" nicht aktivieren, da der Typ = "Schaltfläche"! – riskop

17

Es kann mit CSS arbeiten

sie als die nächste Schaltfläche in der Markup-Put zuerst, dann als nächstes die vorherige Taste.

Dann CSS verwenden, um sie zu positionieren, wie Sie

den Namen
11

halten erscheinen sollen alle Tasten den gleichen einreichen - „prev“ Der einzige Unterschied ist das value Attribut mit eindeutigen Werten. Wenn wir das Skript erstellen, helfen uns diese eindeutigen Werte herauszufinden, welche der Übergabeschaltflächen gedrückt wurde.

Und follwing Codierung schreiben:

btnID = "" 
if Request.Form("prev") = "Previous Page" then 
    btnID = "1" 
else if Request.Form("prev") = "Next Page" then 
    btnID = "2" 
end if 
+0

Das Problem ist, dass das Drücken der Eingabetaste in einem Textfeld das Formular mit der ersten Übergabeschaltfläche sendet, nicht mit der beabsichtigten (die zweite im Beispiel). Herauszufinden, welcher Submit-Button zum Senden des Formulars verwendet wurde, ist einfach und das war nicht die Frage! – riskop

17

Manchmal ist die bereitgestellte Lösung von @palotasb nicht ausreichend. Es gibt Anwendungsfälle, bei denen zum Beispiel eine "Filter" Übermittlungsschaltfläche über Schaltflächen wie "Nächste und Vorherige" platziert wird. Ich habe einen Workaround dafür gefunden: kopieren Sie die Übermittlungsschaltfläche, die als die Standardübergabe-Schaltfläche in einem ausgeblendeten div fungieren und es in dem Formular über jedem anderen Senden-Button platzieren muss. Technisch wird es durch eine andere Taste beim Drücken der Eingabetaste und beim Klicken auf die sichtbare Schaltfläche Weiter gesendet. Aber da der Name und der Wert identisch sind, gibt es keinen Unterschied im Ergebnis.

<html> 
<head> 
    <style> 
     div.defaultsubmitbutton { 
      display: none; 
     } 
    </style> 
</head> 
<body> 
    <form action="action" method="get"> 
     <div class="defaultsubmitbutton"> 
      <input type="submit" name="next" value="Next"> 
     </div> 
     <p><input type="text" name="filter"><input type="submit" value="Filter"></p> 
     <p>Filtered results</p> 
     <input type="radio" name="choice" value="1">Filtered result 1 
     <input type="radio" name="choice" value="2">Filtered result 2 
     <input type="radio" name="choice" value="3">Filtered result 3 
     <div>     
      <input type="submit" name="prev" value="Prev"> 
      <input type="submit" name="next" value="Next"> 
     </div> 
    </form> 
</body> 
</html> 
12

Ändern der Tab-Reihenfolge sollte alles sein, um dies zu erreichen. Halte es einfach.

Eine andere einfache Option wäre, den Zurück-Button nach dem Senden-Button im HTML-Code zu setzen, ihn aber nach links zu verschieben, so dass er auf der Seite vor dem Senden-Button erscheint.

10

Dies ist, was ich ausprobiert habe: 1. Sie müssen sicherstellen, dass Sie Ihren Tasten verschiedene Namen geben 2. Schreiben Sie eine if-Anweisung, die die erforderliche Aktion ausführen, wenn beide Schaltfläche geklickt.

<form> 
<input type="text" name="field1" /> <!-- put your cursor in this field and press Enter --> 

<input type="submit" name="prev" value="Previous Page" /> <!-- This is the button that will submit --> 
<input type="submit" name="next" value="Next Page" /> <!-- But this is the button that I WANT to submit --> 
</form> 

In PHP,

if(isset($_POST['prev'])) 
{ 
header("Location: previous.html"); 
die(); 
} 

if(isset($_POST['next'])) 
{ 
header("Location: next.html"); 
die(); 

} 
+0

Das Problem ist, dass das Drücken der Eingabetaste in einem Textfeld das Formular mit der ersten Übergabeschaltfläche sendet, nicht mit der beabsichtigten (die zweite im Beispiel). Herauszufinden, welcher Submit-Button zum Senden des Formulars verwendet wurde, ist einfach und das war nicht die Frage! – riskop

12

Wenn Sie mehrere aktive Tasten auf einer Seite haben, dann können Sie etwas tun:

Markieren Sie die erste Taste, die Sie löst wollen auf keypress eingeben als Standardbutton auf dem Formular. Für die zweite Taste verknüpfen Sie es mit Backspace Taste auf der Tastatur. // Rück eventcode ist 8.

<form action="action" method="get" defaultbutton="TriggerOnEnter"> 
    <input type="submit" id="PreviousButton" name="prev" value="Prev" 
     class="secondary_button" /> 
    <input type="submit" id='TriggerOnEnter' name="next" value="Next" 
     class="primary_button" /> 
</form> 

<script type="text/javascript"> 
    $(document).on("keydown", function(event) { 
     if (event.which.toString() == "8") { 
      var findActiveElementsClosestForm = $(document.activeElement) 
                .closest("form"); 

      if (findActiveElementsClosestForm && 
       findActiveElementsClosestForm.length) { 
       $("form#" + findActiveElementsClosestForm[0].id 
        + " .secondary_button").trigger("click"); 
      } 
     } 
    }); 

</script> 

Hoffnung, das hilft.

12

Eine andere einfache Option wäre, den Zurück-Button nach dem Senden-Button im HTML-Code zu setzen, aber nach links zu verschieben, damit er auf der Seite vor dem Senden-Button erscheint.

Das Ändern der Tab-Reihenfolge sollte ausreichen, um dies zu erreichen. Halte es einfach.

10

Von https://html.spec.whatwg.org/multipage/forms.html#implicit-submission

Ein Standard-Schaltfläche des Formulars Element ist die erste Submit-Button in Baum um deren Form Eigentümer ist, dass Formularelement.

Wenn der User-Agent unterstützt Vermietung der Benutzer ein Formular einreichen implizit (zum Beispiel auf einigen Plattformen schlagen Sie die Taste „Enter“, während ein Text Feld trägt fokussiert wird implizit die Form) ...

Wenn die nächste Eingabe type = "submit" ist und die vorherige Eingabe in type = "button" geändert wird, sollte das gewünschte Standardverhalten erhalten werden.

7

Mit Javascript (hier jQuery) können Sie die Schaltfläche vor dem Abschicken des Formulars deaktivieren.

$('form').on('keypress', function(event) { 
    if (event.which == 13) { 
     $('input[name="prev"]').prop('type', 'button'); 
    } 
}); 
10

Das erste Mal, dass ich gegen diese kam ich mit einer Onclick kam()/js hacken, wenn Entscheidungen nicht prev/next sind, dass ich für seine Einfachheit noch mögen. Es geht so:

@model myApp.Models.myModel  

<script type="text/javascript"> 
    function doOperation(op) { 
     document.getElementById("OperationId").innerText = op; 
     // you could also use Ajax to reference the element. 
    } 
</script> 

<form> 
    <input type="text" id = "TextFieldId" name="TextField" value="" /> 
    <input type="hidden" id="OperationId" name="Operation" value="" /> 
    <input type="submit" name="write" value="Write" onclick='doOperation("Write")'/> 
    <input type="submit" name="read" value="Read" onclick='doOperation("Read")'/> 
</form> 

Wenn entweder Submit-Button geklickt wird es speichert die gewünschte Operation in einem versteckten Feld (das ist ein String-Feld ist in dem Modell enthalten die Form verknüpft ist) und sendet das Formular an den Controller , die alle Entscheidungen trifft. Im Controller schreiben Sie einfach:

// Do operation according to which submit button was clicked 
// based on the contents of the hidden Operation field. 
if (myModel.Operation == "Read") 
{ 
    // do read logic 
} 
else if (myModel.Operation == "Write") 
{ 
    // do write logic 
} 
else 
{ 
    // do error logic 
} 

Sie können dies auch etwas mit den Ziffernoperationscodes straffen, um die Zeichenfolgenanalyse zu vermeiden, aber wenn man mit Aufzählungen spielen, ist der Code weniger lesbar, modifizierbar und Selbst Dokumentieren und das Parsen ist sowieso trivial.

8

Ich stieß auf diese Frage beim Versuch, eine Antwort auf im Grunde die gleiche Sache zu finden, nur mit asp.net Kontrollen, als ich herausgefunden, dass die Asp-Taste eine Eigenschaft namens UseSubmitBehavior, die Sie einstellen können, was man tut Einreichen.

<asp:Button runat="server" ID="SumbitButton" UseSubmitBehavior="False" Text="Submit" /> 

Nur für den Fall, dass jemand für die ASP.NET-Taste Weg es zu tun sucht.

0

Versuchen Sie dies ..!

<form> 
    <input type="text" name="Name" /> <!-- Enter the value --> 

    <input type="button" name="prev" value="Previous Page" /> <!-- This is the button that will submit --> 
    <input type="submit" name="next" value="Next Page" /> <!-- But this is the button that I WANT to submit --> 
</form> 
0

ich ein sehr ähnliches Problem auf diese Weise gelöst:

  1. wenn javascript wird (in den meisten Fällen heute) aktiviert dann die alle Submit-Buttons sind Tasten auf Seite load " degradiert" über javascript (jquery). Click-Events auf den "degradierten" Button-Tasten werden auch über javascript gehandhabt.

  2. Wenn javascript nicht aktiviert ist, wird das Formular an den Browser mit mehreren Übergabeschaltflächen geliefert. In diesem Fall auf einem textfield in das Formular ein schlagen wird das Formular mit dem ersten Knopf statt der beabsichtigten Standard, aber zumindest legt die Form ist noch verwendbar: Sie können sowohl mit dem zurück und nächsten Tasten einreichen .

Arbeitsbeispiel:

<html> 
 
    <head> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 
 
    </head> 
 
    <body> 
 
    <form action="http://httpbin.org/post" method="post"> 
 
    If javascript is disabled, then you CAN submit the form with button1, button2 or button3. 
 
    If you press enter on a text field, then the form is submitted with the first submit button. 
 

 
    If javascript is enabled, then the submit typed buttons without the 'defaultSubmitButton' 
 
    style are converted to button typed buttons. 
 

 
    If you press enter on a text field, then the form is submitted with the only submit button 
 
    (the one with class defaultSubmitButton) 
 
    If you click on any other button in the form, then the form is submitted with that button's 
 
    value. 
 
    <br /> 
 
    <input type="text" name="text1" ></input> 
 
    <button type="submit" name="action" value="button1" >button 1</button> 
 
    <br /> 
 
    <input type="text" name="text2" ></input> 
 
    <button type="submit" name="action" value="button2" >button 2</button> 
 
    <br /> 
 
    <input type="text" name="text3" ></input> 
 
    <button class="defaultSubmitButton" type="submit" name="action" value="button3" >default button</button> 
 
    </form> 
 
    <script> 
 
    $(document).ready(function(){ 
 

 
    /* change submit typed buttons without the 'defaultSubmitButton' style to button typed buttons */ 
 
    $('form button[type=submit]').not('.defaultSubmitButton').each(function(){ 
 
     $(this).attr('type', 'button'); 
 
    }); 
 

 
    /* clicking on button typed buttons results in: 
 
     1. setting the form's submit button's value to the clicked button's value, 
 
     2. clicking on the form's submit button */ 
 
    $('form button[type=button]').click(function(event){ 
 
     var form = event.target.closest('form'); 
 
     var submit = $("button[type='submit']",form).first(); 
 
     submit.val(event.target.value); 
 
     submit.click(); 
 
    }); 
 

 
    }); 
 
    </script> 
 
    </body> 
 
    </html>