Soumettre le formulaire en utilisant un bouton en dehors de la balise <form>

301

Dis que j'ai:

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

<input type="submit" />

Comment puis-je envoyer ce formulaire avec ce bouton de soumission en dehors du formulaire, je pense qu'en HTML5, il y a un attribut d'action pour la soumission, mais je ne sais pas si c'est entièrement cross-browser et s'il ne l'est pas, est-il de toute façon faire ça?

daryl
la source
2
Je ne pense pas que vous puissiez le faire sans Javascript. Comment le navigateur saura-t-il de quelle forme il s'agit? Il pourrait y en avoir plusieurs. Pourquoi ne pouvez-vous pas mettre le bouton d'envoi dans le formulaire?
Keith
1
si vous ne voulez pas utiliser JS, cela me semble impossible en html (<5), juste par curiosité, pourquoi auriez-vous un tel arrangement dans le code?
Kumar
1
J'ai une zone de paramètres à onglets multiples avec un bouton pour tout mettre à jour, en raison de sa conception, le bouton serait en dehors du formulaire. Je vais simplement rouler avec l'option HTML5 ou une solution JS car cette question semble être redondante.
daryl
1
@Kumar, je pensais aussi que ce serait impossible, mais il semble que ce ne soit pas stackoverflow.com/a/23456905/932473
dav
2
de nos jours la réponse est developer.mozilla.org/en-US/docs/Web/HTML/Element/…
caub

Réponses:

84

Mise à jour: dans les navigateurs modernes, vous pouvez utiliser l' formattribut pour ce faire .


Pour autant que je sache, vous ne pouvez pas le faire sans javascript.

Voici ce que dit la spécification

Les éléments utilisés pour créer des contrôles apparaissent généralement à l'intérieur d'un élément FORM, mais peuvent également apparaître à l'extérieur d'une déclaration d'élément FORM lorsqu'ils sont utilisés pour créer des interfaces utilisateur. Ceci est discuté dans la section sur les événements intrinsèques. Notez que les contrôles en dehors d'un formulaire ne peuvent pas être des contrôles réussis.

C'est mon audacieux

Un submitbouton est considéré comme un contrôle.

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

D'après les commentaires

J'ai une zone de paramètres à onglets multiples avec un bouton pour tout mettre à jour, en raison de sa conception, le bouton serait en dehors du formulaire.

Pourquoi ne pas placer l' inputintérieur du formulaire, mais utiliser CSS pour le positionner ailleurs sur la page?

Jason Gennaro
la source
19
Pour info, prise en charge HTML5, pas encore parfait mais ça y
arrive
6
Je suis un peu en retard ici, mais comment pouvez-vous mettre l'entrée dans le formulaire, mais la positionner ailleurs?
cgf
Vous pouvez utiliser la balise <button> à cet effet pour html4
degr
La réponse n'est plus valable, car la réponse de Joe l'écureuil fonctionne - à partir de 2016.
Peter
il y a un problème avec les solutions JavaScript proposées. dans le dernier Chrome par exemple, la validation HTML5 (obligatoire, etc.) est ignorée. une solution à laquelle je peux penser est d'avoir deux boutons de soumission, un caché. un clic doit être déclenché sur le bouton caché. le formulaire ne doit pas être soumis sans validation appropriée.
victor n.
612

En HTML5, il y a l'attribut formulaire . Fondamentalement

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

<input type="submit" form="myform" />
Lie Ryan
la source
35
Cela ne fonctionne pas sur IE pour quiconque envisage de l'utiliser. Je l'ai utilisé mais j'ai ensuite décidé d'ajouter le rappel de la fonction d'envoi d'événement pour soumettre manuellement le formulaire sur les navigateurs IE.
racl101
1
Quelles versions d'IE exactement?
mwld
11
J'ai fait cela comme une <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">solution de rechange gracieuse: comme l'ont révélé des expériences, this.form est le formulaire attaché DomElement, alors qu'il est nul sinon. // edit: jQuery, mais possible avec de la vanille, trop ofc
Adrian Föder
2
Si vous voulez voir l'attribut de formulaire dans MS Edge, veuillez voter ici: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
2
Une version vanilla-JS de @ AdrianFöder fallback serait:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon
318

Une solution qui fonctionne très bien pour moi, manque toujours ici. Cela nécessite d'avoir un élément <submit>ou un <input type="submit">élément visuellement caché à l' intérieur du <form>, et un <label>élément associé à l' extérieur. Cela ressemblerait à ceci:

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

Ce lien vous permet désormais de «cliquer» sur l' <submit>élément de formulaire en cliquant sur l' <label>élément.

Offereins
la source
4
meilleure solution à mon humble avis sans besoin de js et de changements majeurs :)
Anton Hasan
52
Fonctionne également dans IE 11. Je sais, vous ne voyez pas souvent "travaux" et "IE" dans la même phrase.
shim
2
Meilleure solution sans aucune incompatibilité. Si vous utilisez Twitter Bootstrap, vous pouvez simplement utiliser "btn btn-primary" pour la classe label css et cela fonctionne parfaitement.
Juanda
7
Très bonne solution, mais il pourrait y avoir une objection à l'utilisation de cette méthode. A labeln'est pas un élément focalisable (AFAIK), donc ce n'est pas intuitif pour un utilisateur qui utilise uniquement le clavier pour naviguer vers le `` bouton '', puis appuyez sur espace pour activer ce bouton par exemple. (Je me rends compte que vous pouvez appuyer à la <enter>place, mais ce n'est pas la seule façon dont les gens ont l'habitude de naviguer dans les formulaires avec le clavier)
Auke
11
Pour concentrer le labelbouton de l'onglet via, vous pouvez utiliser l' tabindexattribut HTML: <label for="submit-form" tabindex="0">Submit</label>selon cette question
MarthyM
47

si vous pouvez utiliser jQuery, vous pouvez l'utiliser

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

Donc, l'essentiel est de créer un bouton comme Soumettre, et de mettre le vrai bouton de soumission dans le formulaire (bien sûr, le cacher), et de soumettre le formulaire par jquery en cliquant sur le bouton 'Fake Submit'. J'espère que ça aide.

dav
la source
1
Pour le faire fonctionner à la fois sur le navigateur HTML5 et IE, voici ma 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>

Cela a fonctionné pour moi, d'avoir un bouton d'envoi à distance pour un formulaire.

Joe l'écureuil
la source
merci mec, pour cette fonctionnalité simple, je ne veux pas écrire de lignes de code JS. PS: mon application n'a pas besoin de prendre en charge IE
Mani
1
Veuillez voter ici si vous voulez voir la fonctionnalité d'attribut de formulaire dans MS Edge: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
22

Similaire à une autre solution ici, avec des modifications mineures:

<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
la source
C'est la meilleure réponse, OMI. Directement à partir de MDN sur l'attribut de formulaire du bouton: l'élément de formulaire auquel le bouton est associé (son propriétaire de formulaire). La valeur de l'attribut doit être l'attribut id d'un élément <form> dans le même document. Si cet attribut n'est pas spécifié, l'élément <button> sera associé à un élément ancêtre <form>, s'il en existe un. Cet attribut vous permet d'associer des éléments <button> à des éléments <form> n'importe où dans un document, pas seulement en tant que descendants d'éléments <form>.
AlexSashaRegan
Attention: cela ne fonctionne pas dans Internet Explorer 11. Essayez-le ici: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix
19

Essaye ça:

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

Bien que je suggère d'ajouter un idau formulaire et d'y accéder au lieu de document.forms[index].

Mrchief
la source
1
Oui, je sais comment le faire avec javascript, si vous regardez, je ne l'ai pas marqué comme javascript.
daryl
Je suis désolé, votre message ne disait pas clairement que vous recherchiez un moyen non JS (je pensais que vous aviez manqué de le marquer sous JS).
Mrchief
1
C'est la meilleure façon de le faire si vous souhaitez soumettre un formulaire externe à l'aide d'un bouton dans un autre formulaire.
Vahid Amiri
11

Vous pouvez toujours utiliser jQuery:

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

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

Voici une solution assez solide qui incorpore les meilleures idées jusqu'à présent ainsi que ma solution à un problème mis en évidence avec Offerein. Aucun javascript n'est utilisé.

Si vous vous souciez de la compatibilité descendante avec IE (et même Edge 13), vous ne pouvez pas utiliser l' form="your-form" attribut .

Utilisez une entrée de soumission standard sans affichage et ajoutez une étiquette pour celle-ci en dehors du formulaire:

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

Notez l'utilisation de display: none;. C'est intentionnel. L'utilisation de la .hiddenclasse de bootstrap est en conflit avec jQuery .show()et .hide(), et est depuis déconseillée dans Bootstrap 4.

Maintenant, ajoutez simplement une étiquette pour votre soumission, (conçue pour bootstrap):

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

Contrairement à d'autres solutions, j'utilise également tabindex - défini sur 0 - ce qui signifie que nous sommes désormais compatibles avec la tabulation du clavier. L'ajout de l' role="button"attribut lui donne le style CSS cursor: pointer. Et voilà. ( Voir ce violon ).

Jonathan
la source
Agréable! Fonctionne très bien avec IE11 et Firefox. Merci!
eaglei22
@ eaglei22 content de l'entendre :)
Jonathan
Il est très utile pour vous de rassembler toutes les fonctionnalités / suggestions d'ailleurs, alors merci. Cependant, même si vous pouvez maintenant taper sur le bouton / l'étiquette, je ne vois aucun moyen de "cliquer" sur le clavier, par exemple, appuyer Entern'a aucun effet. Ainsi, pouvoir y tabuler semble un peu inutile. Existe-t-il un moyen de le faire sans utiliser JavaScript?
Andrew Willems
@AndrewWillems c'est un bon point. Malheureusement, je ne vois pas moyen d'utiliser votre clavier pour déclencher un événement de clic sans javascript. PS: si le message vous a été utile, veuillez voter. Cela ne vous coûte rien, mais cela signifie beaucoup pour quiconque produit des réponses utiles.
Jonathan
1
Et je vous aime aussi pour avoir corrigé la <input... />syntaxe bâclée et invalide à fermeture automatique, que presque tout le monde utilise de manière flagrante et incorrecte ici (aussi), à la bonne balise no-close vide! :) Bravo!
Sz.
3

Cela fonctionne parfaitement! ;)

Cela peut être fait en utilisant Ajax et avec ce que j'appelle: "un élément de miroir de formulaire". Au lieu d'envoyer un formulaire avec un élément à l'extérieur, vous pouvez créer un faux formulaire. Le formulaire précédent n'est pas nécessaire.

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

Le code ajax serait comme:

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

Ceci est très utile si vous souhaitez envoyer des données dans un autre formulaire sans soumettre le formulaire parent.

Ce code peut probablement être adapté / optimisé en fonction des besoins. Cela fonctionne parfaitement !! ;) Fonctionne également si vous voulez une boîte d'option de sélection comme celle-ci:

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

J'espère que cela a aidé quelqu'un comme ça m'a aidé. ;)

Franks
la source
1

Peut-être que cela pourrait fonctionner, mais je ne sais pas si c'est du HTML valide.

<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
la source
3
Cette réponse existe déjà pour cette question même. stackoverflow.com/a/23456905/2968465
Jayant Bhawal
0

J'ai eu un problème où j'essayais de masquer le formulaire à partir d'un élément de cellule de tableau, mais toujours d'afficher le bouton d'envoi des formulaires. Le problème était que l'élément de formulaire occupait toujours un espace vierge supplémentaire, ce qui rend le format de ma cellule de tableau bizarre. L'affichage: aucun et la visibilité: les attributs cachés ne fonctionnaient pas car cela masquerait également le bouton d'envoi, car il était contenu dans le formulaire que j'essayais de cacher. La réponse simple était de définir la hauteur des formulaires à presque rien en utilisant CSS

Alors,

CSS -

    #formID {height:4px;}

travaillé pour moi.

Shawn Game
la source
0

J'ai utilisé de cette façon, et j'ai bien aimé, cela valide le formulaire avant de le soumettre est également compatible avec safari / google. pas de 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
la source