【发布时间】:2014-04-10 01:56:23
【问题描述】:
我需要编写 总是 提交表单的 Javascript 代码。我必须提交的第一个表单如下所示:
<form action="http://www.example.com/test">
<input type="text" name="name">
<input type="submit" value="Send data" name="submit">
</form>
(假设formNode 是document.getElementsByTagName('form')[0])
所以,formNode.submit() 不起作用,因为“提交”基本上是由“发送数据”按钮 (!) 完成的。
然后我认为我应该使用表单的操作(有人也可以使用action 作为名称!)。
然后我考虑专注于我能找到的第一个输入字段,并模拟 ENTER 按键。但是,我最初的测试没有奏效,并决定在做我通常做的事情之前在这里问一下(把头撞在墙上几个小时)。
那么:什么是提交任何表单无论是如何制作的,不管字段名称是什么脑残名称等,有什么好的、可靠的方法?
或者,也许:我如何可靠地获取表单的 submit() 函数,而不考虑给定相同名称的字段,以便我可以提交东西?
【问题讨论】:
-
我无法控制字段的名称。
-
它可以检查 form.submit 属性以及它是否是一个元素(比如有一个 tagName 属性和一个 submit 的 name 属性) ,创建表单的浅表克隆并复制所有控件并将 submit 控件重命名为其他名称,然后再将其附加到新表单。还将所有控制值设置为其原始值的当前值,然后提交该表单。这可能不是一个通用的解决方案,但在某些情况下可能有效。
-
@RobG 哎哟,这很痛!我刚刚找到了一个可能的方式:
form.__proto__.submit.call( form );。是的,它只适用于带有 proto 的浏览器,但它看起来可靠吗? -
嗯,这可能是“可靠的”,除了
__proto__属性不是标准的,不是所有正在使用的浏览器都支持,也不是所有浏览器都使用原型继承模型,所以没有Form.prototype来参考。此外,宿主对象可能不一定支持这样的内置方法。我已经发布了一个可能有更好解决方案的答案。 -
— 似乎通过原型调用 submit 不会发送提交事件,至少在 IE 9 中,因此不会调用任何提交侦听器(例如表单验证)。
标签: javascript html forms submit