只需触发实际的表单提交 - http://jsfiddle.net/tj_vantoll/ZN29S/。
实际的表单提交将运行checkValidity
,显示气泡错误,invalid
必要时调用事件处理程序等。
要确保表单实际上不会提交,您只需将submit
事件处理程序附加到<form>
阻止默认操作的事件处理程序,然后执行 AJAX 调用。
这是有效的,因为submit
除非表单满足其所有约束(即具有有效数据),否则不会触发事件。checkValidity
因此,不需要显式调用。
编辑 (11/7/12) 以解决评论。
在这种情况下,通过实际的表单提交,我只是指使用提交按钮完成的非 AJAX 提交。要显示本机气泡并将焦点更改为适当的表单元素,这是实现此目的的唯一方法。如果没有提交按钮,您可以隐藏一个并使用它来触发提交;它仍然可以工作。
我同意这种方法不太理想,但它确实适用于所有支持的浏览器。使用此 hack 而不是调用的唯一原因form.submit()
是因为form.submit()
不会触发本机验证。对我来说,这里的问题不是没有 API 来触发验证,而是调用form.submit()
没有。规范说,只要“用户代理需要静态验证表单元素表单的约束”,就应该运行约束验证。我不知道为什么调用不适用。form.submit()
应该注意的是,checkValidity
DOES 通过与本机表单提交相同的算法运行。因此,您可以自由关闭默认气泡并实现自己的。例如像这样的东西。