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

dar*_*ryl 270 html

说我有:

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

<input type="submit" />
Run Code Online (Sandbox Code Playgroud)

如何使用表单外的提交按钮提交该表单,我认为在HTML5中有一个提交的操作属性,但我不确定那些是否完全跨浏览器,如果不是,那么无论如何做这个?

Lie*_*yan 559

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

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

<input type="submit" form="myform" />
Run Code Online (Sandbox Code Playgroud)

  • 对于计划使用它的任何人来说,这不适用于IE.我使用它但后来决定添加提交事件函数回调以在IE浏览器上手动提交表单. (31认同)
  • 我这样做是一个优雅的后备:``<button type ="submit"form ="frmFoo"onclick ="!this.form && $('#'+ $(this).attr('form')).submit( )">```实验显示,this.form是附加形式的DomElement,否则为null.//编辑:jQuery,但也可能与vanilla,也是可能的 (8认同)
  • @AdrianFöder 后备的 vanilla-JS 版本将是:`&lt;button type="submit" form="frmFoo" onclick="!this.form &amp;&amp; document.getElementById('myform').submit()"&gt;` (7认同)
  • 如果您想在MS Edge中查看表单属性,请在此处投票:https://wpdev.uservoice.com/forums/257854-microsoft-edge-developer/suggestions/7327649-add-support-for-the-form-attribute (2认同)
  • @Sz:我不同意提议的编辑。void 元素不得有结束标记(例如 `&lt;input&gt;&lt;/input&gt;`),并且在 HTML5 中,非 void 元素不允许在开始标记中包含斜线,但开始标记末尾的斜线是对于 void 元素不是无效的,它只是被忽略。我的答案中的语法对于 HTML5 和 XHTML5 都有效。 (2认同)
  • @Sz:参考[8.1.2.1。开始标签](https://www.w3.org/TR/html5/syntax.html#start-tags)“如果元素是void元素之一,或者元素是外来元素,那么可能会有单个 U+002F SOLIDUS 字符 (/)。该字符对 void 元素没有影响,但在外部元素上,它将开始标记标记为自闭合。” (2认同)

Off*_*ins 300

对我来说很有用的解决方案仍然缺少.它需要一个视觉上隐藏的<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>
Run Code Online (Sandbox Code Playgroud)

现在,通过此链接,您可以<submit>通过单击<label>元素来"单击"表单元素.

  • 也适用于IE 11.我知道,你不经常在同一句话中看到"作品"和"IE". (47认同)
  • 要通过制表符按钮聚焦`label`,你可以使用`tabindex` HTML属性:`<label for ="submit-form"tabindex ="0">提交</ label>`按照[这个问题](http: //stackoverflow.com/questions/13637223/how-do-you-make-a-div-tabbable) (10认同)
  • 非常好的解决方案,但可能有一个异议使用此方法."标签"不是可聚焦元素(AFAIK),因此对于仅使用键盘导航到"按钮"然后按空格来激活该按钮的用户来说,这并不直观.(我意识到你可以按"<enter>"代替,但这不是人们习惯用键盘导航表格的唯一方式) (7认同)
  • 更好的解决方案imho不需要js和重大变化:) (4认同)
  • 更好的解决方案,没有任何不兼容性.如果使用Twitter Bootstrap,您只需使用"btn btn-primary"作为标签css类,它就可以完美运行. (2认同)
  • 我用过这个解决方案.唯一的问题是提交按钮不能被选中 (2认同)
  • @MarthyM,您对"tabindex"的建议非常有帮助,特别是对于那些只看最高投票答案的读者,谢谢.但请注意,@ Jonathan的答案已包含此功能. (2认同)
  • 添加 `tabindex="0"` 后,选项卡可以聚焦它,但是当我按 Enter 或 Space 时,它​​不会提交表单。但是,在这种情况下,Lie Ryan 的方法有效。 (2认同)

Jas*_*aro 76

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


据我所知,没有javascript就无法做到这一点.

这是规范所说的

用于创建控件的元素通常出现在FORM元素中,但在用于构建用户界面时,也可能出现在FORM元素声明之外.这将在内部事件一节中讨论.请注意,表单外部的控件无法成功控制.

那是我的大胆

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

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

从评论

我有一个多选项卡设置区域,其中有一个按钮可以全部更新,由于其设计,按钮将位于表单之外.

为什么不放置input在窗体内部,但使用CSS将其放置在页面的其他位置?

  • 仅供参考,HTML5支持,还不完美,但它已经实现了:http://www.impressivewebs.com/html5-form-attribute/ (17认同)
  • 我在这里有点晚了,但你怎么能把输入放在表格中,但把它放在别的地方? (6认同)
  • 答案不再有效,因为松鼠乔的答案有效 - 截至 2016 年。 (2认同)

dav*_*dav 46

如果你可以使用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>
Run Code Online (Sandbox Code Playgroud)

因此,最重要的是创建一个像Submit这样的按钮,并将真实的提交按钮放在表单中(当然要隐藏它),然后通过单击"假提交"按钮通过jquery提交表单.希望能帮助到你.


Joe*_*rel 29

<form method="get" id="form1" action="something.php">

</form>

<!-- External button-->
<button type="submit" form="form1">Click me!</button>
Run Code Online (Sandbox Code Playgroud)

这对我有用,可以为表单提供一个远程提交按钮.

  • IE浏览器不支持此功能.http://caniuse.com/#feat=form-attribute (6认同)

Mrc*_*ief 16

试试这个:

<input type="submit" onclick="document.forms[0].submit();" />
Run Code Online (Sandbox Code Playgroud)

虽然我建议id在表单中添加一个并通过它来访问而不是document.forms[index].

  • 不要将我的问题编辑为javascript lol (9认同)

小智 15

与此处的其他解决方案类似,只需稍加修改:

<form method="METHOD" id="FORMID">
   <!-- ...your inputs -->
</form>
<button type="submit" form="FORMID" value="Submit">Submit</button>
Run Code Online (Sandbox Code Playgroud)

https://www.w3schools.com/tags/att_form.asp


Geo*_*n0w 15

您可以<form>通过form="yourFormId"在组件的定义中添加来告诉表单标签外部的外部组件属于它。

在这种情况下,

<form id="login-form">
... blah...
</form>

<button type="submit" form="login-form" name="login_user" class="login-form-btn">
        <B>Log In</B>
</button>
Run Code Online (Sandbox Code Playgroud)

...仍然会很高兴地提交表单,因为您为它分配了表单名称。表单认为按钮是它的一部分,即使按钮在标签之外,这不需要 javascript 来提交表单(这可能有问题,即表单可以提交但引导错误/验证我无法显示,我测试过) .

  • 目前,这应该是有效的答案 (2认同)

Ara*_*esh 11

你总是可以使用jQuery:

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

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


Jon*_*han 8

这是一个非常可靠的解决方案,其中包含了迄今为止最好的想法,以及我对使用Offerein's突出显示的问题的解决方案.没有使用javascript.

如果您关心与IE(甚至Edge 13)的向后兼容性,则无法使用该form="your-form" 属性.

使用带有display none的标准提交输入,并在表单外添加标签:

<form id="your-form">
  <input type="submit" id="your-form-submit" style="display: none;">
</form>
Run Code Online (Sandbox Code Playgroud)

注意使用display: none;.这是故意的.使用引导程序的.hidden使用jQuery的阶级矛盾.show().hide(),并从此在引导4被弃用.

现在只需为您的提交添加一个标签(为bootstrap设计):

<label for="your-form-submit" role="button" class="btn btn-primary" tabindex="0">
  Submit
</label>
Run Code Online (Sandbox Code Playgroud)

与其他解决方案不同,我也使用tabindex - 设置为0 - 这意味着我们现在兼容键盘标签.添加role="button"属性会为其提供CSS样式cursor: pointer.瞧瞧.(见这个小提琴).


mae*_*lga 6

您的<button>遗嘱需要具有以下两个属性:type="submit"以及form="form_id"是否在表单之外。例子:

<form id="my-form">
   ...
</form>

<button type="submit" form="my-form">
   Submit
</button>
Run Code Online (Sandbox Code Playgroud)

此外,<button>元素还可以具有formmethodformaction属性,分别覆盖表单的methodaction。例子:

<button type="submit" form="my-form" formmethod="post" formaction="/something.php">
   Submit
</button>
Run Code Online (Sandbox Code Playgroud)

以下是对该元素的所有可用属性的引用<button>https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button