Envíe el formulario usando un botón fuera de la etiqueta <form>

301

Digamos que tengo:

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

<input type="submit" />

¿Cómo hago para enviar ese formulario con ese botón de envío fuera del formulario? Creo que en HTML5 hay un atributo de acción para el envío, pero no estoy seguro de si eso es completamente entre navegadores y si no está ahí para ¿hacer esto?

daryl
fuente
2
No creo que puedas hacer eso sin javascript. ¿Cómo sabrá el navegador qué forma tiene? Podría haber varios. ¿Por qué no puedes poner el botón de enviar dentro del formulario?
Keith
1
si no quieres usar JS, entonces para mí parece imposible en html (<5), solo por curiosidad, ¿por qué tendrías ese tipo de disposición en el código?
Kumar
1
Tengo un área de configuración de múltiples pestañas con un botón para actualizar todo, debido al diseño del mismo, el botón estaría fuera del formulario. Solo voy a rodar con la opción HTML5 o una solución JS ya que esta pregunta parece ser redundante.
daryl
1
@Kumar, también pensé que sería imposible, pero parece que no es stackoverflow.com/a/23456905/932473
DAV
2
hoy en día la respuesta es developer.mozilla.org/en-US/docs/Web/HTML/Element/…
caub

Respuestas:

84

Actualización: en los navegadores modernos puede usar el formatributo para hacer esto .


Que yo sepa, no puedes hacer esto sin javascript.

Esto es lo que dice la especificación

Los elementos utilizados para crear controles generalmente aparecen dentro de un elemento FORM, pero también pueden aparecer fuera de una declaración de elemento FORM cuando se utilizan para crear interfaces de usuario. Esto se discute en la sección sobre eventos intrínsecos. Tenga en cuenta que los controles fuera de un formulario no pueden ser controles exitosos.

Esa es mi atrevida

Un submitbotón se considera un control.

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

De los comentarios

Tengo un área de configuración de múltiples pestañas con un botón para actualizar todo, debido al diseño del mismo, el botón estaría fuera del formulario.

¿Por qué no colocar el inputinterior del formulario, pero usar CSS para colocarlo en otra parte de la página?

Jason Gennaro
fuente
19
FYI, soporte HTML5, aún no es perfecto, pero está llegando a él: impresionantewebs.com/html5-form-attribute
Shackrock
66
Llego un poco tarde aquí, pero ¿cómo puede poner la entrada en el formulario, pero posicionarla en otro lugar?
cgf
Se puede utilizar la etiqueta <botón> a estos efectos para html4
grado d
La respuesta ya no es válida, ya que la respuesta de Joe la ardilla funciona, a partir de 2016.
Peter
Existe una preocupación con las soluciones JavaScript propuestas. en la última versión de Chrome, por ejemplo, se omite la validación HTML5 (requerida, etc.). Una solución que se me ocurre es tener dos botones de envío, uno oculto. Se debe activar un clic en el botón oculto. el formulario no debe enviarse sin la validación adecuada.
victor n.
612

En HTML5, existe el atributo de formulario . Básicamente

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

<input type="submit" form="myform" />
Lie Ryan
fuente
35
Esto no funciona en IE para cualquiera que planee usarlo. Lo usé pero luego decidí agregar la devolución de llamada de la función de evento de envío para enviar manualmente el formulario en los navegadores IE.
racl101
1
¿Qué versiones de IE exactamente?
mwld
11
Hice esto como una alternativa elegante: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">como revelaron los experimentos, this.form es la forma adjunta DomElement, mientras que, de lo contrario, es nula. // edit: jQuery, pero posible también con vainilla
Adrian Föder
2
Si desea ver el atributo de formulario en MS Edge, vote aquí: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
2
Una versión vainilla-JS del respaldo de @ AdrianFöder sería:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon
318

Una solución que funciona muy bien para mí, todavía falta aquí. Requiere tener un elemento visualmente oculto <submit>o <input type="submit">dentro del elemento <form>y un <label>elemento asociado fuera de él. Se vería así:

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

Ahora este enlace le permite 'hacer clic' en el <submit>elemento del formulario haciendo clic en el <label>elemento.

Offereins
fuente
44
mejor solución en mi humilde opinión sin requerir js y cambios importantes :)
Anton Hasan
52
Funciona en IE 11 también. Lo sé, a menudo no ves "trabajos" e "IE" en la misma oración.
cuña
2
Mejor solución sin incompatibilidades. Si usa Twitter Bootstrap, puede usar "btn btn-primary" para la clase de etiqueta css y funciona perfectamente.
Juanda
77
Muy buena solución, sin embargo, puede haber una objeción al uso de este método. A labelno es un elemento enfocable (AFAIK), por lo que no es intuitivo para un usuario que solo usa el teclado para navegar al 'botón' y luego presiona la barra espaciadora para activar ese botón, por ejemplo. (Me doy cuenta de que puedes presionar en su <enter>lugar, pero esa no es la única forma en que las personas están acostumbradas a navegar por los formularios con el teclado)
Auke
11
Para enfocar el labelbotón vía tab, puede usar el tabindexatributo HTML: <label for="submit-form" tabindex="0">Submit</label>según esta pregunta
MarthyM
47

si puedes usar jQuery puedes usar esto

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

Por lo tanto, la conclusión es crear un botón como Enviar y colocar el botón de envío real en el formulario (por supuesto, ocultarlo) y enviar el formulario mediante jquery haciendo clic en el botón 'Enviar falso'. Espero eso ayude.

dav
fuente
1
Para que funcione tanto en el navegador HTML5 listo como en IE, aquí está mi 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>

Esto funcionó para mí, tener un botón de envío remoto para un formulario.

Joe la ardilla
fuente
gracias hombre, por esta característica simple no quiero escribir líneas de código JS. PD: mi aplicación no necesita soportar IE
Mani
1
Vote aquí si desea ver la función de atributo de formulario en MS Edge: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz
22

Similar a otra solución aquí, con modificaciones menores:

<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
fuente
Esta es la mejor respuesta, OMI. Directamente desde MDN en el atributo de formulario del botón: El elemento de formulario con el que está asociado el botón (su propietario del formulario). El valor del atributo debe ser el atributo id de un elemento <form> en el mismo documento. Si no se especifica este atributo, el elemento <button> se asociará a un elemento ancestro <form>, si existe. Este atributo le permite asociar elementos <button> a elementos <form> en cualquier lugar dentro de un documento, no solo como descendientes de elementos <form>.
AlexSashaRegan
Tenga en cuenta: eso no funciona en Internet Explorer 11. Pruébelo aquí: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix
19

Prueba esto:

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

Aunque sugeriría agregar un idal formulario y acceder por eso en lugar de document.forms[index].

Mrchief
fuente
1
Sí, sé cómo hacerlo con JavaScript, si miras, no lo etiqueté como JavaScript.
daryl
Lo siento, no estaba claro en tu publicación que estás buscando una forma que no sea JS (pensé que te perdiste etiquetarla bajo JS).
Mrchief
1
Esta es la mejor manera de hacerlo si desea enviar un formulario externo utilizando un botón dentro de otro formulario.
Vahid Amiri
11

Siempre puedes usar jQuery:

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

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

Aquí hay una solución bastante sólida que incorpora las mejores ideas hasta ahora, así como también incluye mi solución a un problema destacado con Offerein. No se usa javascript.

Si le importa la compatibilidad con IE (e incluso Edge 13), no puede usar el form="your-form" atributo .

Use una entrada de envío estándar con display none y agregue una etiqueta fuera del formulario:

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

Tenga en cuenta el uso de display: none;. Esto es intencional El uso de la .hiddenclase bootstrap entra en conflicto con el de jQuery .show()y .hide(), y desde entonces ha quedado en desuso en Bootstrap 4.

Ahora simplemente agregue una etiqueta para su envío, (diseñado para bootstrap):

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

A diferencia de otras soluciones, también estoy usando tabindex , establecido en 0, lo que significa que ahora somos compatibles con la tabulación del teclado. Agregar el role="button"atributo le da el estilo CSS cursor: pointer. Et voila. ( Ver este violín ).

Jonathan
fuente
¡Agradable! Funcionó muy bien con IE11 y Firefox. ¡Gracias!
eaglei22
@ eaglei22 contento de escucharlo :)
Jonathan
Es muy útil para usted reunir todas las características / sugerencias de otros lugares, así que gracias. Sin embargo, aunque ahora puede presionar el botón / etiqueta, no veo ninguna forma de "hacer clic" desde el teclado, por ejemplo, presionar Enterno tiene ningún efecto. Por lo tanto, poder tabularlo parece un poco inútil. ¿Hay alguna manera de hacer esto sin usar JavaScript?
Andrew Willems
@ AndrewWillems, ese es un buen punto. Desafortunadamente, no veo una forma de evitar el uso de su teclado para activar un evento de clic sin javascript. PD: si la publicación fue útil para usted, favor de votar. No le cuesta nada, pero significa mucho para cualquiera que produzca respuestas útiles.
Jonathan
1
¡Y también te amo por arreglar la <input... />sintaxis de cierre automático descuidada e inválida , que casi todo el mundo usa de manera descarada e incorrecta aquí (también), en la etiqueta nula de cierre correcta! :) Felicitaciones!
Sz.
3

¡Esto funciona perfectamente! ;)

Esto se puede hacer usando Ajax y con lo que yo llamo: "un elemento espejo de forma". En lugar de enviar un formulario con un elemento externo, puede crear un formulario falso. El formulario anterior no es necesario.

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

El código ajax sería como:

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

Esto es muy útil si desea enviar algunos datos dentro de otro formulario sin enviar el formulario principal.

Este código probablemente se puede adaptar / optimizar según la necesidad. ¡Funciona perfectamente! ;) También funciona si desea un cuadro de opción de selección como este:

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

Espero que haya ayudado a alguien así me ayudó. ;)

Francos
fuente
1

Quizás esto podría funcionar, pero no sé si es HTML válido.

<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
fuente
3
Esta respuesta ya existe para esta misma pregunta. stackoverflow.com/a/23456905/2968465
Jayant Bhawal
0

Tuve un problema en el que intentaba ocultar el formulario de un elemento de celda de tabla, pero aún mostraba el botón de envío de formularios. El problema era que el elemento de formulario todavía ocupaba un espacio en blanco adicional, haciendo que el formato de la celda de mi tabla se viera extraño. La pantalla: ninguno y visibilidad: los atributos ocultos no funcionaron porque también ocultaría el botón de envío, ya que estaba contenido en el formulario que estaba tratando de ocultar. La respuesta simple fue establecer la altura de los formularios en casi nada usando CSS

Entonces,

CSS -

    #formID {height:4px;}

trabajó para mi.

Shawn Game
fuente
0

Lo utilicé de esta manera, y me gustó, valida el formulario antes de enviarlo y también es compatible 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>
SotoArmando
fuente