Senden Sie das Formular über eine Schaltfläche außerhalb des <form> -Tags

301

Sagen wir, ich habe:

<form method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" />

Wie gehe ich vor, um dieses Formular mit dieser Schaltfläche zum Senden außerhalb des Formulars zu senden? Ich denke, in HTML5 gibt es ein Aktionsattribut für das Senden, aber ich bin mir nicht sicher, ob dies vollständig browserübergreifend ist und ob es sowieso nicht vorhanden ist mach das?

Daryl
quelle
2
Ich glaube nicht, dass Sie das ohne Javascript tun können. Woher weiß der Browser, um welche Form es sich handelt? Es könnte mehrere geben. Warum können Sie den Senden-Button nicht in das Formular einfügen?
Keith
1
Wenn Sie JS nicht verwenden möchten, erscheint es mir in HTML (<5) unmöglich, nur aus Neugier, warum sollten Sie eine solche Anordnung im Code haben?
Kumar
1
Ich habe einen Einstellungsbereich mit mehreren Registerkarten und einer Schaltfläche, mit der alle aktualisiert werden können. Aufgrund des Designs befindet sich die Schaltfläche außerhalb des Formulars. Ich werde nur mit der HTML5-Option oder einer JS-Lösung rollen, da diese Frage überflüssig zu sein scheint.
Daryl
1
@ Kumar, ich dachte auch, es wäre unmöglich, aber es sieht so aus, als wäre es nicht stackoverflow.com/a/23456905/932473
dav
2
Heutzutage lautet die Antwort developer.mozilla.org/en-US/docs/Web/HTML/Element/…
caub

Antworten:

84

Update: In modernen Browsern können Sie dazu das formAttribut verwenden .


Soweit ich weiß, können Sie dies nicht ohne Javascript tun.

Hier ist, was die Spezifikation sagt

Die zum Erstellen von Steuerelementen verwendeten Elemente werden im Allgemeinen innerhalb eines FORM-Elements angezeigt, können jedoch auch außerhalb einer FORM-Elementdeklaration angezeigt werden, wenn sie zum Erstellen von Benutzeroberflächen verwendet werden. Dies wird im Abschnitt über intrinsische Ereignisse erläutert. Beachten Sie, dass Steuerelemente außerhalb eines Formulars keine erfolgreichen Steuerelemente sein können.

Das ist meine Kühnheit

Eine submitSchaltfläche wird als Steuerelement betrachtet.

http://www.w3.org/TR/html4/interact/forms.html#h-17.2.1

Aus den Kommentaren

Ich habe einen Einstellungsbereich mit mehreren Registerkarten und einer Schaltfläche, mit der alle aktualisiert werden können. Aufgrund des Designs befindet sich die Schaltfläche außerhalb des Formulars.

Warum platzieren Sie das inputFormular nicht innerhalb des Formulars, sondern verwenden CSS, um es an einer anderen Stelle auf der Seite zu positionieren?

Jason Gennaro
quelle
19
Zu
Ihrer Information
6
Ich bin hier etwas spät dran, aber wie können Sie die Eingabe in das Formular einfügen, aber woanders positionieren?
cgf
Sie können das <button> -Tag für diese Zwecke für html4
degr
Die Antwort ist nicht mehr gültig, da die Antwort von Joe the Squirrel ab 2016 funktioniert.
Peter
Es gibt Bedenken hinsichtlich der vorgeschlagenen JavaScript-Lösungen. In der neuesten Version von Chrome wird beispielsweise die HTML5-Validierung (erforderlich usw.) übersprungen. Eine Lösung, die ich mir vorstellen kann, sind zwei Senden-Schaltflächen, eine ausgeblendete. Ein Klick sollte auf die versteckte Schaltfläche ausgelöst werden. Das Formular sollte nicht ohne ordnungsgemäße Validierung eingereicht werden.
Sieger n.
612

In HTML5 gibt es das Formularattribut . Grundsätzlich

<form id="myform" method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" form="myform" />
Lie Ryan
quelle
35
Dies funktioniert im IE nicht für Personen, die es verwenden möchten. Ich habe es verwendet, aber dann beschlossen, einen Rückruf für die Funktion zum Senden von Ereignissen hinzuzufügen, um das Formular manuell in IE-Browsern zu senden.
racl101
1
Welche IE-Versionen genau?
mwld
11
Ich habe dies als anmutigen Fallback getan: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">Wie Experimente gezeigt haben, ist this.form das angehängte Formular DomElement, während es ansonsten null ist. // edit: jQuery, aber auch mit Vanille möglich ofc
Adrian Föder
2
Wenn Sie das Formularattribut in MS Edge sehen möchten, stimmen Sie bitte hier ab: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
2
Eine Vanille-JS-Version von @ AdrianFöder Fallback wäre:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
Romaricdrigon
318

Eine Lösung, die für mich gut funktioniert, fehlt hier noch. Es erfordert ein visuell verborgenes <submit>oder <input type="submit">Element innerhalb des <form>und ein zugehöriges <label>Element außerhalb davon. Es würde so aussehen:

<form method="get" action="something.php">
     <input type="text" name="name" />
     <input type="submit" id="submit-form" class="hidden" />
</form>

<label for="submit-form" tabindex="0">Submit</label>

Über diesen Link können Sie nun auf das Formularelement klicken, <submit>indem Sie auf das <label>Element klicken .

Offereins
quelle
4
Bessere Lösung imho ohne js und größere Änderungen erforderlich :)
Anton Hasan
52
Funktioniert auch in IE 11. Ich weiß, man sieht nicht oft "Werke" und "IE" im selben Satz.
Shim
2
Bessere Lösung ohne Inkompatibilitäten. Wenn Sie Twitter Bootstrap verwenden, können Sie einfach "btn btn-primary" für die Label-CSS-Klasse verwenden und es funktioniert perfekt.
Juanda
7
Sehr schöne Lösung, es könnte jedoch einen Einwand gegen die Verwendung dieser Methode geben. A labelist kein fokussierbares Element (AFAIK), daher ist es für einen Benutzer nicht intuitiv, der nur mit der Tastatur zur Schaltfläche navigiert und dann die Leertaste drückt, um diese Schaltfläche beispielsweise zu aktivieren. (Mir ist klar, dass Sie <enter>stattdessen drücken können , aber das ist nicht die einzige Möglichkeit, mit der Tastatur durch Formulare zu navigieren.)
Auke
11
Um die labelSchaltfläche über die Registerkarte zu fokussieren , können Sie das tabindexHTML-Attribut verwenden: <label for="submit-form" tabindex="0">Submit</label>gemäß dieser Frage
MarthyM
47

Wenn Sie jQuery verwenden können, können Sie dies verwenden

<form method="get" action="something.php" id="myForm">
    <input type="text" name="name" />

    <input type="submit" style="display:none" />
</form>

<input type="button" value="Submit" id="myButton" />

<script type="text/javascript">
    $(document).ready(function() {
       $("#myButton").click(function() {
           $("#myForm").submit();
       });
    });
</script>

Die Quintessenz besteht also darin, eine Schaltfläche wie "Senden" zu erstellen, die eigentliche Schaltfläche "Senden" in das Formular einzufügen (natürlich auszublenden) und das Formular per Abfrage zu senden, indem Sie auf die Schaltfläche "Gefälschtes Senden" klicken. Ich hoffe es hilft.

dav
quelle
1
Damit es sowohl mit HTML5-fähigen Browsern als auch mit IE funktioniert, hier ist mein jQuery$('button[form]').click(function (){ var formId = $(this).attr('form'); $('#' + formId).submit(); });
Snook
35
<form method="get" id="form1" action="something.php">

</form>

<!-- External button-->
<button type="submit" form="form1">Click me!</button>

Dies funktionierte für mich, um eine Remote-Senden-Schaltfläche für ein Formular zu haben.

Joe das Eichhörnchen
quelle
Danke Mann, für diese einfache Funktion möchte ich keine Zeilen JS-Code schreiben. PS: Meine App muss IE
Mani
1
Bitte stimmen Sie hier ab, wenn Sie die Formularattributfunktion in MS Edge sehen möchten
mkurz
22

Ähnlich wie bei einer anderen Lösung hier, mit geringfügigen Änderungen:

<form method="METHOD" id="FORMID">
   <!-- ...your inputs -->
</form>
<button type="submit" form="FORMID" value="Submit">Submit</button>

https://www.w3schools.com/tags/att_form.asp

mster
quelle
Dies ist die beste Antwort, IMO. Direkt aus MDN für das Formularattribut der Schaltfläche: Das Formularelement, dem die Schaltfläche zugeordnet ist (ihr Formularbesitzer). Der Wert des Attributs muss das ID-Attribut eines <form> -Elements im selben Dokument sein. Wenn dieses Attribut nicht angegeben wird, wird das <button> -Element einem Vorfahren <form> -Element zugeordnet, sofern eines vorhanden ist. Mit diesem Attribut können Sie <button> -Elemente <form> -Elementen an einer beliebigen Stelle innerhalb eines Dokuments zuordnen, nicht nur als Nachkommen von <form> -Elementen.
AlexSashaRegan
Beachten
Marc Dix
19

Versuche dies:

<input type="submit" onclick="document.forms[0].submit();" />

Obwohl ich vorschlagen würde id, dem Formular ein hinzuzufügen und stattdessen darauf zuzugreifen document.forms[index].

Mrchief
quelle
1
Ja, ich weiß, wie man es mit Javascript macht. Wenn Sie so aussehen, habe ich es nicht als Javascript markiert.
Daryl
Es tut mir leid, aus Ihrem Beitrag war nicht klar, dass Sie nach einem Weg suchen, der nicht von JS stammt (ich dachte, Sie haben es verpasst, ihn unter JS zu markieren).
Mrchief
1
Dies ist der beste Weg, wenn Sie ein externes Formular über eine Schaltfläche in einem anderen Formular senden möchten.
Vahid Amiri
11

Sie können jQuery jederzeit verwenden:

<form id="myForm">
  <!-- form controls -->
</form>
<input type="submit" id="myButton">

<script>
$(document).ready(function () {
  $("#myButton").click(function () {
    $("#myForm").submit();
  });
});
</script>
Aravind Suresh
quelle
8

Hier ist eine ziemlich solide Lösung, die die bisher besten Ideen enthält und meine Lösung für ein mit Offereins hervorgehobenes Problem enthält. Es wird kein Javascript verwendet.

Wenn Sie sich für die Abwärtskompatibilität mit IE (und sogar Edge 13) interessieren, können Sie das form="your-form" Attribut nicht verwenden .

Verwenden Sie eine Standard-Übermittlungseingabe mit Anzeige keine und fügen Sie eine Beschriftung außerhalb des Formulars hinzu:

<form id="your-form">
  <input type="submit" id="your-form-submit" style="display: none;">
</form>

Beachten Sie die Verwendung von display: none;. Dies ist beabsichtigt. Die Verwendung der Bootstrap- .hiddenKlasse steht in Konflikt mit jQuery's .show()und .hide()und ist seitdem in Bootstrap 4 veraltet.

Fügen Sie nun einfach eine Bezeichnung für Ihre Übermittlung hinzu (gestylt für Bootstrap):

<label for="your-form-submit" role="button" class="btn btn-primary" tabindex="0">
  Submit
</label>

Im Gegensatz zu anderen Lösungen verwende ich auch tabindex - auf 0 gesetzt - was bedeutet, dass wir jetzt mit Tastatur-Tabs kompatibel sind. Durch Hinzufügen des role="button"Attributs erhält es den CSS-Stil cursor: pointer. Et voila. ( Siehe diese Geige ).

Jonathan
quelle
Nett! Funktionierte hervorragend mit IE11 und Firefox. Vielen Dank!
eaglei22
@ eaglei22 froh, es zu hören :)
Jonathan
Es ist sehr hilfreich für Sie, alle Funktionen / Vorschläge von anderen zusammenzustellen. Vielen Dank. Obwohl Sie jetzt auf die Schaltfläche / Beschriftung zugreifen können, kann ich keine Möglichkeit sehen, sie über die Tastatur zu "klicken", z. B. hat das Drücken Enterkeine Auswirkung. Daher erscheint es ein wenig sinnlos, darauf zugreifen zu können. Gibt es eine Möglichkeit, dies ohne Verwendung von JavaScript zu tun?
Andrew Willems
@ AndrewWillems das ist ein guter Punkt. Leider sehe ich keinen Weg, mit Ihrer Tastatur ein Klickereignis ohne Javascript auszulösen. PS: Wenn der Beitrag für Sie hilfreich war, stimmen Sie bitte ab. Es kostet Sie nichts, aber es bedeutet viel für jeden, der hilfreiche Antworten liefert.
Jonathan
1
Und ich liebe dich auch dafür, dass du die schlampige und ungültige <input... />selbstschließende Syntax, die fast jeder hier (auch) offen und falsch verwendet, auf das richtige leere No-Close-Tag korrigiert hast ! :) Ein dickes Lob!
Gr.
3

Das funktioniert perfekt! ;)

Dies kann mit Ajax und mit dem, was ich nenne: "einem Formspiegelelement" erfolgen. Um ein Formular mit einem Element außerhalb zu senden, können Sie ein gefälschtes Formular erstellen. Das vorherige Formular wird nicht benötigt.

<!-- This will do the trick -->
<div >
    <input id="mirror_element" type="text" name="your_input_name">
    <input type="button" value="Send Form">
</div>

Code Ajax wäre wie folgt:

    <script>
        ajax_form_mirror("#mirror_element", "your_file.php", "#your_element_response", "POST");

        function ajax_form_mirror(form, file, element, method) {
            $(document).ready(function() {
                // Ajax
                $(form).change(function() { // catch the forms submit event
                    $.ajax({                // create an AJAX call...
                        data: $(this).serialize(),      // get the form data
                        type: method,                   // GET or POST
                        url: file,                      // the file to call
                        success: function (response) {   // on success..
                        $(element).html(response);  // update the DIV
                        }
                    });

                    return false; // cancel original event to prevent form submitting
                });
            });
        }
   </script>

Dies ist sehr nützlich, wenn Sie einige Daten in einem anderen Formular senden möchten, ohne das übergeordnete Formular zu senden.

Dieser Code kann wahrscheinlich je nach Bedarf angepasst / optimiert werden. Es funktioniert perfekt !! ;) Funktioniert auch, wenn Sie ein Auswahlfeld wie das folgende wünschen:

<div>
    <select id="mirror_element" name="your_input_name">
        <option id="1" value="1">A</option>
        <option id="2" value="2">B</option>
        <option id="3" value="3">C</option>
        <option id="4" value="4">D</option>
    </select>
</div>

Ich hoffe es hat jemandem geholfen wie es mir geholfen hat. ;)

Franks
quelle
1

Vielleicht könnte das funktionieren, aber ich weiß nicht, ob dies gültiges HTML ist.

<form method="get" action="something.php">
    <input type="text" name="name" />
    <input id="submitButton" type="submit" class="hide-submit" />
</form>

<label for="submitButton">Submit</label>
Emmanuel Lozoya
quelle
3
Diese Antwort existiert bereits für genau diese Frage. stackoverflow.com/a/23456905/2968465
Jayant Bhawal
0

Ich hatte ein Problem, bei dem ich versuchte, das Formular vor einem Tabellenzellenelement auszublenden, aber dennoch die Schaltfläche zum Senden von Formularen anzuzeigen. Das Problem war, dass das Formularelement immer noch einen zusätzlichen Leerraum einnahm, wodurch das Format meiner Tabellenzelle seltsam aussah. Die Anzeige: keine und Sichtbarkeit: versteckte Attribute funktionierten nicht, da dadurch auch die Schaltfläche zum Senden ausgeblendet wurde, da sie in dem Formular enthalten war, das ich ausblenden wollte. Die einfache Antwort bestand darin, die Formularhöhe mithilfe von CSS auf kaum etwas festzulegen

So,

CSS -

    #formID {height:4px;}

arbeitete für mich.

Shawn Game
quelle
0

Ich habe diese Methode verwendet und es hat mir gut gefallen. Sie überprüft das Formular vor dem Senden und ist auch mit Safari / Google kompatibel. keine jquery nn

        <module-body>
            <form id="testform" method="post">
                <label>Input Title</label>
                <input name="named1" placeholder="Placeholder"  title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>
            </form>
        </module-body>
        <module-footer>
            <input type="button" onclick='if (document.querySelector("#testform").reportValidity()) { document.querySelector("#testform").submit(); }' value="Submit">
            <input type="button" value="Reset">
        </module-footer>
SotoArmando
quelle