Invia modulo utilizzando un pulsante esterno al tag <form>


301

Dì che ho:

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

<input type="submit" />

Come posso fare per inviare il modulo con quel pulsante di invio al di fuori del modulo, penso che in HTML5 ci sia un attributo di azione per l'invio, ma non sono sicuro che sia completamente cross-browser e se non lo è, c'è comunque Fai questo?


2
Non penso che tu possa farlo senza javascript. Come farà il browser a sapere che forma è? Ce ne potrebbero essere diversi. Perché non riesci a inserire il pulsante di invio nel modulo?
Keith l'

1
se non vuoi usare JS, a me sembra impossibile in html (<5), solo per curiosità, perché dovresti avere questo tipo di accordo nel codice?
Kumar,

1
Ho un'area delle impostazioni a più schede con un pulsante per aggiornare tutto, a causa della sua progettazione il pulsante sarebbe fuori dal modulo. Ho intenzione di rollare con l'opzione HTML5 o una soluzione JS poiché questa domanda sembra essere ridondante.
daryl l'

1
@Kumar, ho anche pensato che sarebbe stato impossibile, ma sembra che non è stackoverflow.com/a/23456905/932473
DAV

Risposte:


84

Aggiornamento: nei browser moderni è possibile utilizzare l' formattributo per farlo .


Per quanto ne so, non puoi farlo senza javascript.

Ecco cosa dice la specifica

Gli elementi utilizzati per creare i controlli compaiono generalmente all'interno di un elemento FORM, ma possono anche apparire al di fuori di una dichiarazione dell'elemento FORM quando vengono utilizzati per creare interfacce utente. Questo è discusso nella sezione sugli eventi intrinseci. Si noti che i controlli all'esterno di un modulo non possono essere controlli riusciti.

Questo è il mio audace

Un submitpulsante è considerato un controllo.

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

Dai commenti

Ho un'area delle impostazioni a più schede con un pulsante per aggiornare tutto, a causa della sua progettazione il pulsante sarebbe fuori dal modulo.

Perché non posizionare l' inputinterno del modulo, ma utilizzare CSS per posizionarlo altrove sulla pagina?


19
Cordiali saluti, supporto HTML5, non ancora perfetto ma ci sta arrivando: impressivewebs.com/html5-form-attribute
Shackrock

6
Sono un po 'in ritardo qui, ma come si può inserire l'input nel modulo, ma posizionarlo altrove?
CG

È possibile utilizzare il tag <button> a questo scopo per html4
degr

La risposta non è più valida, poiché la risposta di Joe lo scoiattolo funziona - a partire dal 2016.
Peter,

c'è un problema con le soluzioni JavaScript proposte. nell'ultimo Chrome, ad esempio, la convalida HTML5 (obbligatoria, ecc.) viene saltata. una soluzione che mi viene in mente è avere due pulsanti di invio, uno nascosto. un clic dovrebbe essere attivato sul pulsante nascosto. il modulo non deve essere inviato senza un'adeguata convalida.
vincitore n.

612

In HTML5, c'è l'attributo form . Fondamentalmente

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

<input type="submit" form="myform" />

35
Questo non funziona su IE per chiunque abbia intenzione di usarlo. L'ho usato ma poi ho deciso di aggiungere il callback della funzione di invio evento per inviare manualmente il modulo sui browser IE.
racl101,

1
Quali versioni di IE esattamente?
mwld,

11
L'ho fatto come un grazioso fallback: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">come hanno rivelato gli esperimenti, this.form è il modulo allegato DomElement, mentre altrimenti è nullo. // modifica: jQuery, ma possibile anche con la vaniglia, spesso
Adrian Föder

2
Se si desidera visualizzare l'attributo del modulo in MS Edge, si prega di votare qui: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz,

2
Una versione vanilla-JS di @ AdrianFöder fallback sarebbe:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

Una soluzione che funziona alla grande per me, manca ancora qui. Richiede di avere un elemento visivamente nascosto <submit>o <input type="submit">all'interno di <form>un <label>elemento associato all'esterno di esso. Sarebbe così:

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

Ora questo collegamento consente di "fare clic" <submit>sull'elemento modulo facendo clic <label>sull'elemento.


4
soluzione migliore imho senza richiedere js e grandi cambiamenti :)
Anton Hasan,

52
Funziona anche con IE 11. Lo so, spesso non vedi "funziona" e "IE" nella stessa frase.
shim

2
Soluzione migliore senza incompatibilità. Se usi Twitter Bootstrap, puoi semplicemente usare "btn btn-primary" per la classe etichetta css e funziona perfettamente.
Juanda,

7
Ottima soluzione, tuttavia potrebbe esserci un'obiezione all'utilizzo di questo metodo. A labelnon è un elemento focalizzabile (AFAIK) quindi non è intuitivo per un utente che sta solo usando la tastiera per navigare verso il 'pulsante' e quindi premere spazio per attivare quel pulsante, ad esempio. (Mi rendo conto che puoi premere <enter>invece, ma non è l'unico modo in cui le persone sono abituate a navigare nei moduli con la tastiera)
Auke

11
Per focalizzare il labelpulsante tramite la scheda, puoi usare l' tabindexattributo HTML: <label for="submit-form" tabindex="0">Submit</label>secondo questa domanda
MarthyM,

47

se puoi usare jQuery puoi usare questo

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

Quindi, la linea di fondo è quella di creare un pulsante come Invia e inserire il pulsante di invio reale nel modulo (ovviamente nascondendolo) e inviare il modulo tramite jquery facendo clic sul pulsante "Invia falso". Spero che sia d'aiuto.


1
Per farlo funzionare sia su browser predisposto per HTML5 che su IE, ecco il mio 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>

Per me ha funzionato, avere un pulsante di invio remoto per un modulo.


grazie amico, per questa semplice funzione non voglio scrivere righe di codice JS. PS: la mia app non deve supportare IE
Mani,


22

Simile a un'altra soluzione qui, con modifiche minori:

<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


Questa è la risposta migliore, IMO. Direttamente da MDN sull'attributo del modulo del pulsante: l'elemento del modulo a cui è associato il pulsante (il suo proprietario del modulo). Il valore dell'attributo deve essere l'attributo id di un elemento <form> nello stesso documento. Se questo attributo non viene specificato, l'elemento <button> verrà associato a un elemento <form> antenato, se presente. Questo attributo ti consente di associare gli elementi <button> agli elementi <form> ovunque all'interno di un documento, non solo come discendenti degli elementi <form>.
AlexSashaRegan

Attenzione: non funziona in Internet Explorer 11. Provalo qui: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix,

19

Prova questo:

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

Anche se suggerirei di aggiungere un idmodulo al modulo e accedervi tramite quello invece di document.forms[index].


1
Sì, so come farlo con javascript, se guardi non l'ho taggato come javascript.
daryl,

Mi dispiace, non è chiaro dal tuo post che stai cercando un modo non JS (pensavo che ti mancasse taggarlo sotto JS).
Mrchief,

1
Questo è il modo migliore per farlo se si desidera inviare un modulo esterno utilizzando un pulsante all'interno di un altro modulo.
Vahid Amiri,

11

Puoi sempre usare jQuery:

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

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

8

Ecco una soluzione abbastanza solida che incorpora le idee migliori finora e include anche la mia soluzione a un problema evidenziato con Offerein. Non viene utilizzato JavaScript.

Se ti interessa la retrocompatibilità con IE (e persino Edge 13), non puoi utilizzare l' form="your-form" attributo .

Utilizzare un input di invio standard con display none e aggiungere un'etichetta al di fuori del modulo:

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

Nota l'uso di display: none;. Questo è intenzionale. L'uso della .hiddenclasse bootstrap è in conflitto con jQuery .show()e .hide(), e da allora è stato deprecato in Bootstrap 4.

Ora aggiungi semplicemente un'etichetta per il tuo invio (in stile bootstrap):

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

A differenza di altre soluzioni, sto anche usando tabindex - impostato su 0 - il che significa che ora siamo compatibili con la tabulazione della tastiera. L'aggiunta role="button"dell'attributo gli conferisce lo stile CSS cursor: pointer. Et voilà. ( Vedi questo violino ).


Bello! Ha funzionato benissimo con IE11 e Firefox. Grazie!
eaglei22,

@ eaglei22 felice di sentirlo :)
Jonathan

È molto utile per te mettere insieme tutte le caratteristiche / i suggerimenti da altrove, quindi grazie. Tuttavia, anche se ora puoi passare al pulsante / etichetta, non riesco a vedere alcun "clic" dalla tastiera, ad esempio premendo Enternon ha alcun effetto. Pertanto, essere in grado di eseguire la tabulazione sembra un po 'inutile. C'è un modo per farlo senza usare JavaScript?
Andrew Willems

@AndrewWillems è un buon punto. Sfortunatamente non vedo un modo per aggirare l'utilizzo della tastiera per attivare un evento clic senza javascript. PS: se il post ti è stato utile, ti preghiamo di votare. Non ti costa nulla ma significa molto per chiunque produca risposte utili.
Jonathan

1
E ti amo anche per aver fissato la <input... />sintassi sciatta e non valida a chiusura automatica, che quasi tutti usano palesemente e in modo errato qui (anche), sul tag no-close vuoto giusto! :) Complimenti!
Sz.

3

Questo funziona perfettamente! ;)

Questo può essere fatto usando Ajax e con quello che chiamo: "un elemento mirror modulo". Invece di inviare un modulo con un elemento esterno, è possibile creare un modulo falso. Il modulo precedente non è necessario.

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

Il codice ajax sarebbe come:

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

Questo è molto utile se si desidera inviare alcuni dati all'interno di un altro modulo senza inviare il modulo principale.

Questo codice probabilmente può essere adattato / ottimizzato in base alle necessità. Funziona perfettamente !! ;) Funziona anche se vuoi una casella di opzione di selezione come questa:

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

Spero che abbia aiutato qualcuno come me ha aiutato me. ;)


1

Forse questo potrebbe funzionare, ma non so se sia un HTML valido.

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

3
Questa risposta esiste già per questa stessa domanda. stackoverflow.com/a/23456905/2968465
Jayant Bhawal

0

Ho avuto un problema in cui stavo cercando di nascondere il modulo da un elemento cella di tabella, ma mostravo ancora il pulsante di invio dei moduli. Il problema era che l'elemento del modulo stava ancora occupando uno spazio extra, rendendo strano il formato della mia cella di tabella. Il display: nessuno e la visibilità: gli attributi nascosti non funzionavano perché nascondeva anche il pulsante di invio, poiché era contenuto nel modulo che stavo cercando di nascondere. La semplice risposta era di impostare l'altezza dei moduli a malapena a nulla usando i CSS

Così,

CSS -

    #formID {height:4px;}

ha funzionato per me.


0

Ho usato in questo modo, e mi è piaciuto molto, convalida il modulo prima di inviare anche è compatibile con Safari / Google. no 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.