Envie o formulário usando um botão fora da tag <form>

301

Diga que tenho:

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

<input type="submit" />

Como faço para enviar esse formulário com esse botão de envio fora do formulário, acho que no HTML5 há um atributo de ação para o envio, mas não tenho certeza se isso é totalmente compatível com vários navegadores e se não existe. faça isso?

daryl
fonte
2
Eu não acho que você pode fazer isso sem javascript. Como o navegador saberá de que forma é? Pode haver vários. Por que você não pode colocar o botão enviar dentro do formulário?
Keith
1
se você não quiser usar JS, parece impossível para mim em html (<5), apenas por curiosidade, por que você teria esse tipo de disposição no código?
Kumar
1
Eu tenho uma área de configurações com várias guias com um botão para atualizar tudo, devido ao design dele, o botão estaria fora do formulário. Eu só vou rolar com a opção HTML5 ou uma solução JS, pois essa pergunta parece ser redundante.
Daryl
1
@Kumar, eu também pensei que seria impossível, mas parece que ele não é stackoverflow.com/a/23456905/932473
DAV

Respostas:

84

Atualização: nos navegadores modernos, você pode usar o formatributo para fazer isso .


Tanto quanto eu sei, você não pode fazer isso sem javascript.

Aqui está o que a especificação diz

Os elementos usados ​​para criar controles geralmente aparecem dentro de um elemento FORM, mas também podem aparecer fora de uma declaração de elemento FORM quando são usados ​​para criar interfaces com o usuário. Isso é discutido na seção sobre eventos intrínsecos. Observe que controles fora de um formulário não podem ser controles bem-sucedidos.

Esse é o meu negrito

Um submitbotão é considerado um controle.

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

Dos comentários

Eu tenho uma área de configurações com várias guias com um botão para atualizar tudo, devido ao design dele, o botão estaria fora do formulário.

Por que não colocar o inputinterior do formulário, mas usar CSS para posicioná-lo em outro lugar da página?

Jason Gennaro
fonte
19
FYI, suporte HTML5, não perfeito ainda, mas está chegando lá: impressivewebs.com/html5-form-attribute
Shackrock
6
Estou um pouco atrasado aqui, mas como você pode colocar a entrada no formulário, mas posicioná-la em outro lugar?
CGF
Você pode usar o tag <button> para este fim para html4
degr
A resposta não é mais válido, como Joe resposta do esquilo funciona - a partir de 2016.
Peter
existe uma preocupação com as soluções JavaScript propostas. no Chrome mais recente, por exemplo, a validação HTML5 (necessária, etc.) é ignorada. uma solução que consigo pensar é ter dois botões de envio, um oculto. um clique deve ser acionado no botão oculto. o formulário não deve ser enviado sem a devida validação.
victor n.
612

No HTML5, existe o atributo form . Basicamente

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

<input type="submit" form="myform" />
Lie Ryan
fonte
35
Isso não funciona no IE para quem planeja usá-lo. Eu usei, mas decidi adicionar a função de evento de envio de retorno de chamada para enviar manualmente o formulário nos navegadores IE.
racl101
1
Quais versões do IE exatamente?
Mwld
11
Fiz isso como uma alternativa elegante: <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">como as experiências revelaram, this.form é o formulário anexado DomElement, enquanto é nulo de outra forma. // edit: jQuery, mas também é possível com baunilha
Adrian Föder 15/03
2
Se você quiser ver o atributo de formulário em MS Borda Por favor vote aqui: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/...
mkurz
2
Uma versão de baunilha-JS de @ AdrianFöder fallback seria:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon
318

Uma solução que funciona muito bem para mim ainda está faltando aqui. Requer ter um elemento visualmente oculto <submit>ou <input type="submit">dentro do elemento <form>e um <label>elemento associado fora dele. Seria assim:

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

Agora, esse link permite que você 'clique' no <submit>elemento do formulário clicando no <label>elemento.

Offereins
fonte
4
melhor solução IMHO sem exigir js e grandes mudanças :)
Anton Hasan
52
Também funciona no IE 11. Eu sei, você não costuma ver "obras" e "IE" na mesma frase.
shim
2
Melhor solução sem incompatibilidades. Se estiver usando o Twitter Bootstrap, basta usar "btn btn-primary" para a classe label css e ela funciona perfeitamente.
Juanda #
7
Solução muito boa, no entanto, pode haver uma objeção ao uso desse método. A labelnão é um elemento focalizável (AFAIK), portanto, não é intuitivo para um usuário que está apenas usando o teclado para navegar até o 'botão' e, em seguida, pressione espaço para ativar esse botão, por exemplo. (Eu sei que você pode pressionar <enter>em vez disso, mas isso não é a única maneira que as pessoas são usadas para formas navegação com o teclado)
Auke
11
Para focar o labelbotão da guia via, você pode usar o tabindexatributo HTML: <label for="submit-form" tabindex="0">Submit</label>conforme esta pergunta
MarthyM 27/17/17
47

se você pode usar o jQuery, você pode usar este

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

Portanto, a linha inferior é criar um botão como Enviar e colocar o botão de envio real no formulário (é claro, ocultá-lo) e enviar o formulário por jquery, clicando no botão 'Enviar falso'. Espero que ajude.

dav
fonte
1
Para fazê-lo funcionar em ambos navegador pronto HTML5 e IE, aqui é o meu 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>

Isso funcionou para mim, ter um botão de envio remoto para um formulário.

Joe, o esquilo
fonte
obrigado cara, por esse recurso simples, não quero escrever linhas de código JS. PS: minha necessidade aplicativo não apoiar IE
Mani
1
Por favor vote aqui se você quiser ver o recurso atributo formulário em MS Borda: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/...
mkurz
22

Semelhante a outra solução aqui, com pequenas modificações:

<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
fonte
Esta é a melhor resposta, IMO. Diretamente do MDN no atributo de formulário do botão: O elemento do formulário ao qual o botão está associado (seu proprietário do formulário). O valor do atributo deve ser o atributo id de um elemento <form> no mesmo documento. Se esse atributo não for especificado, o elemento <button> será associado a um elemento <form> ancestral, se houver algum. Este atributo permite associar elementos <button> a elementos <form> em qualquer lugar do documento, não apenas como descendentes dos elementos <form>.
AlexSashaRegan
Esteja ciente: isso não funciona no Internet Explorer 11. Experimente aqui: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix
19

Tente o seguinte:

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

Embora eu sugira adicionar um idao formulário e acessar por isso em vez de document.forms[index].

Mrchief
fonte
1
Sim, eu sei como fazê-lo com javascript, se você olhar, não o marquei como javascript.
Daryl
Sinto muito, mas não ficou claro em sua postagem que você está procurando um caminho não JS (pensei que você não tivesse marcado a tag em JS).
Mrchief
1
Essa é a melhor maneira de fazer isso, se você quiser enviar um formulário externo usando um botão dentro de outro formulário.
Vahid Amiri
11

Você sempre pode usar o jQuery:

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

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

Aqui está uma solução bastante sólida que incorpora as melhores idéias até o momento e inclui minha solução para um problema destacado nas ofertas de Offerein. Nenhum javascript é usado.

Se você se preocupa com a compatibilidade com o IE (e mesmo com o Edge 13), não pode usar o form="your-form" atributo .

Use uma entrada de envio padrão com nenhuma exibição e adicione um rótulo para ela fora do formulário:

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

Observe o uso de display: none;. Isso é intencional. O uso da .hiddenclasse do bootstrap entra em conflito com o jQuery .show()e .hide(), e, desde então, foi preterido no Bootstrap 4.

Agora basta adicionar um rótulo ao seu envio (com estilo para inicialização):

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

Ao contrário de outras soluções, também estou usando tabindex - definido como 0 - o que significa que agora somos compatíveis com as guias do teclado. A adição do role="button"atributo fornece o estilo CSS cursor: pointer. Et voila. ( Veja este violino ).

Jonathan
fonte
Agradável! Funcionou muito bem com o IE11 e o Firefox. Obrigado!
eaglei22
@ eaglei22 feliz em ouvir isso :)
Jonathan
É muito útil reunir todos os recursos / sugestões de outros lugares, por isso, obrigado. No entanto, embora agora você possa tabular o botão / rótulo, não consigo ver nenhuma maneira de "clicar" nele no teclado, por exemplo, pressionar Enternão tem efeito. Assim, ser capaz de tabular isso parece um pouco inútil. Existe uma maneira de fazer isso sem usar JavaScript?
Andrew Willems 02/03
@AndrewWillems esse é um bom ponto. Infelizmente, não vejo uma maneira de usar o teclado para acionar um evento de clique sem javascript. PS: se a postagem foi útil para você, por favor, vote. Não custa nada, mas significa muito para quem produz respostas úteis.
Jonathan
1
E também amo você por corrigir a <input... />sintaxe de fechamento automático desleixada e inválida , que quase todo mundo está usando de forma flagrante e incorreta aqui (também), na etiqueta de fechamento sem fechamento adequada! :) parabéns!
Sz.
3

Este trabalho perfeitamente! ;)

Isso pode ser feito usando o Ajax e com o que chamo de "um elemento de espelho de formulário". Em vez de enviar um formulário com um elemento externo, você pode criar um formulário falso. O formulário anterior não é necessário.

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

O código ajax seria 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>

Isso é muito útil se você deseja enviar alguns dados para outro formulário sem enviar o formulário pai.

Esse código provavelmente pode ser adaptado / otimizado de acordo com a necessidade. Funciona perfeitamente!! ;) Também funciona se você quiser uma caixa de opção de seleção como esta:

<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 tenha ajudado alguém assim me ajudou. ;)

Franks
fonte
1

Talvez isso possa funcionar, mas não sei se isso é 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
fonte
3
Essa resposta já existe para essa mesma pergunta. stackoverflow.com/a/23456905/2968465
Jayant Bhawal
0

Eu tive um problema em que estava tentando ocultar o formulário de um elemento da célula da tabela, mas ainda mostrava o botão de envio de formulários. O problema era que o elemento do formulário ainda estava ocupando um espaço em branco extra, tornando o formato da minha célula da tabela estranho. A exibição: none e visibilidade: atributos ocultos não funcionavam porque ocultava também o botão enviar, pois estava contido no formulário que eu estava tentando ocultar. A resposta simples foi definir a altura dos formulários para quase nada usando CSS

Assim,

CSS -

    #formID {height:4px;}

trabalhou para mim.

Jogo de Shawn
fonte
0

Eu usei dessa maneira, e gostei, valida o formulário antes de enviar também é compatível com o 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
fonte