使用<form>标记外的按钮提交表单


300

说我有:

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

<input type="submit" />

我该如何使用表单外的“提交”按钮提交该表单,我认为在HTML5中有一个提交的action属性,但是我不确定那是否是完全跨浏览器的,如果不是,则不能做这个?


2
我认为如果没有JavaScript,您将无法做到这一点。浏览器将如何知道它是什么形式?可能有几个。为什么不能将“提交”按钮放在表单中?
基思

1
如果您不想使用JS,那么对我来说,出于好奇,在html(<5)中看起来是不可能的,为什么您会在代码中进行这种安排?
库玛,

1
我有一个带有多个选项卡的设置区域,其中的一个按钮可以全部更新,由于其设计的原因,该按钮将位于表单外部。我只打算使用HTML5选项或JS解决方案,因为这个问题似乎是多余的。
daryl

1
@Kumar,我也认为这不可能,但是看起来好像不是stackoverflow.com/a/23456905/932473
dav 2014年

Answers:


84

更新:在现代浏览器中,您可以使用form属性执行此操作


据我所知,如果没有javascript,您将无法做到这一点。

规格说明如下

用于创建控件的元素通常出现在FORM元素内部,但是当它们用于构建用户界面时也可能出现在FORM元素声明之外。有关内在事件的部分对此进行了讨论。请注意,窗体外部的控件不能成为成功的控件。

那是我的大胆

submit按钮被认为是一种控制。

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

从评论

我有一个带有多个选项卡的设置区域,其中的一个按钮可以全部更新,由于其设计的原因,该按钮将位于表单外部。

为什么不将input内部放置在表单中,而是使用CSS将其放置在页面上的其他位置?


19
仅供参考,对HTML5的支持尚不完善,但已经达到了目标:令人印象深刻的
webs.com/html5-form-attribute

6
我来晚了一点,但是如何将输入放入表格中,但将其放置在其他位置?
cgf

您可以使用<按钮>标记此目的的HTML4
DEGR

答案不再有效,因为松鼠乔的答案有效-截至2016
彼得

建议的JavaScript解决方案令人担忧。例如,在最新的Chrome浏览器中,跳过了HTML5验证(必填等)。我能想到的一种解决方案是有两个提交按钮,一个隐藏。应在隐藏按钮上触发点击。未经适当验证,不应提交该表格。
胜利者。

612

在HTML5中,有form属性。基本上

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

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

35
对于计划使用它的任何人,这在IE上均不起作用。我使用了它,但随后决定添加Submit事件函数回调以在IE浏览器上手动提交表单。
racl101 2013年

1
到底哪个IE版本?
mwld 2014年

11
我这样做是作为一个<button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">很好的备用:如实验所示,this.form是附加的形式DomElement,否则为null。//编辑:jQuery的,但可能有香草,太OFC
阿德里安Föder

2
如果您想在MS Edge中看到form属性,请在这里投票:wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…–
mkurz

2
@AdrianFöder后备广告的原始JS版本为:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

一个对我来说很好的解决方案,在这里仍然缺少。它要求在中具有视觉上隐藏的元素,<submit>或在其外部具有关联的元素。它看起来像这样:<input type="submit"><form><label>

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

现在,此链接使您可以<submit>通过单击<label>元素来“单击”表单元素。


4
不需要js和重大更改的更好解决方案imho :)
Anton Hasan 2014年

52
也可以在IE 11中使用。我知道,您通常不会在同一句话中看到“作品”和“ IE”。
shim 2014年

2
更好的解决方案,没有任何不兼容性。如果使用Twitter Bootstrap,则可以对标签css类使用“ btn btn-primary”,它可以完美工作。
2015年

7
非常好的解决方案,但是可能会反对使用此方法。A label不是可聚焦元素(AFAIK),因此对于仅使用键盘导航到“按钮”然后按空格键激活该按钮的用户来说,这是不直观的。(我知道您可以按<enter>,但是这不是人们习惯于使用键盘浏览表单的唯一方法)
Auke 2015年

11
要聚焦“ label通过”选项卡按钮,您可以使用tabindexHTML属性:<label for="submit-form" tabindex="0">Submit</label>根据此问题
MarthyM,2017年

47

如果可以使用jQuery,则可以使用

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

因此,最重要的是创建一个类似于Submit的按钮,然后将真正的Submit按钮放入表单中(当然将其隐藏),然后通过jquery通过单击“ Fake Submit”按钮来提交表单。希望能帮助到你。


1
为了使其能够在支持HTML5的浏览器和IE上运行,这是我的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>

这对我来说很有效,因为有一个表单的远程提交按钮。


谢谢男人,由于这个简单的功能,我不想编写JS代码行。PS:我的应用无需支持IE
Mani

1
如果您想在MS Edge中查看表单属性功能,请在此处投票:wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…–
mkurz

22

与此处的另一个解决方案类似,但进行了少量修改:

<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


IMO,这是最好的答案。直接从MDN上按钮的表单属性上开始:与按钮关联的表单元素(其表单所有者)。该属性的值必须是同一文档中<form>元素的id属性。如果未指定此属性,则<button>元素将与祖先<form>元素(如果存在)关联。此属性使您可以将<button>元素与文档中任何位置的<form>元素相关联,而不仅仅是<form>元素的后代。
AlexSashaRegan

请注意:这在Internet Explorer 11中不起作用。请在此处尝试:cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix

19

尝试这个:

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

尽管我建议id在表单中添加一个,然后通过而不是进行访问document.forms[index]


1
是的,我知道如何使用javascript,如果您没有将其标记为javascript。
daryl 2011年

抱歉,从您的帖子中不清楚您是否正在寻找非JS方式(我以为您错过了在JS下对其进行标记)。
Mrchief 2011年

1
如果要使用另一个表单中的按钮提交外部表单,这是最好的方法。
Vahid Amiri

11

您可以随时使用jQuery:

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

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

8

这是一个非常可靠的解决方案,它融合了迄今为止的最佳创意,还包括我对Offerein强调的问题的解决方案。没有使用JavaScript。

如果您关心与IE(甚至是Edge 13)的向后兼容性,则不能使用form="your-form" attribute

使用不显示任何内容的标准提交输入,并在表单外添加标签:

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

注意使用display: none;。这是故意的。使用bootstrap的.hidden类与jQuery的.show()和冲突,.hide()此后在Bootstrap 4中已弃用。

现在,只需为您的提交添加标签(为引导程序设置样式):

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

与其他解决方案不同,我还使用了tabindex-设置为0-这意味着我们现在与键盘制表符兼容。添加该role="button"属性将为其提供CSS样式cursor: pointer。等等。(请参阅此小提琴)。


真好!与IE11和Firefox搭配使用效果很好。谢谢!
eaglei22 '17

@ eaglei22很高兴听到它:)
乔纳森(Jonathan)

将其他地方的所有功能/建议汇总在一起对您很有帮助,所以谢谢。但是,即使您现在可以跳至按钮/标签,我也看不到从键盘“单击”它的任何方式,例如,按下Enter没有任何作用。因此,能够选择它似乎没有意义。有没有不使用JavaScript的方法?
Andrew Willems

@AndrewWillems很好。不幸的是,我没有办法在没有JavaScript的情况下使用键盘来触发点击事件。PS:如果该帖子对您有帮助,请投票。它不会花费您任何费用,但对产生有用答案的任何人来说意义重大。
乔纳森

1
我也爱您,因为它修复了草率和无效的<input... />自动关闭语法,几乎每个人都在这里公然错误地(太)错误地使用了这种语法,将其正确地设置为无效的no-close标签!:)荣誉!
Sz。

3

这工作完美!;)

这可以使用Ajax以及我所谓的“表单镜像元素”来完成。您可以创建一个伪造的表单,而不是发送一个外部元素的表单。不需要以前的表格。

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

代码ajax就像:

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

如果您想在另一个表单中发送一些数据而不提交父表单,这将非常有用。

该代码可能可以根据需要进行修改/优化。它完美地工作!;)如果您想要这样的选择选项框,也可以使用:

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

我希望它能帮助像我这样的人。;)



0

我有一个问题,我试图隐藏表格单元格元素中的表单,但仍显示表单的提交按钮。问题在于,表单元素仍在占用额外的空白,这使我的表格单元格的格式看起来很奇怪。display:none和visible:hidden属性不起作用,因为它也隐藏了提交按钮,因为它包含在我试图隐藏的表单中。简单的答案是使用CSS将表单高度设置为几乎没有

所以,

CSS-

    #formID {height:4px;}

为我工作。


0

我使用了这种方式,并很喜欢它,它在提交之前验证了表单也与safari / google兼容。没有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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.