这可能不是您通常的“如何捕获表单提交事件?” 问题。
我试图准确理解jQuery、vanilla Javascript 和浏览器(IE/FF/Chrome/Safari/Opera)如何处理表单提交事件——以及它们之间的关系。(请参阅我的另一个问题。)经过数小时的谷歌搜索和实验,我仍然无法得出结论,无论是因为不和谐还是含糊不清。
我正在完成一个与网站表单集成的脚本,以便在 AJAX 请求返回之前无法提交表单。
理想情况下:
- 用户填写表格
- 表单已提交——但没有调用以前绑定的事件处理程序,除了我的
- 我的处理程序发出 API 请求(当然是异步的)
- 用户确认 API 响应的验证结果
- 表单提交正常自动继续,调用之前被抑制的其他处理程序
我目前的理解是:(这些可能是错误的,如果是,请纠正我)
- jQuery 将表单提交事件处理程序绑定到提交按钮
click
事件 - 直接在提交元素
click
事件上的事件处理程序(无论是在标记中onclick=""
还是使用 jQuery 绑定)首先执行 - 接下来执行表单
submit
事件上的事件处理程序(无论是在标记中onsubmit=""
还是使用 jQuery 绑定) - 调用
$('[type=submit]').click()
不会调用表单的submit
事件,因此不会调用其处理程序 - 调用
$('form').submit()
不会调用提交按钮的click
事件,因此不会调用其处理程序 - 然而不知何故,单击提交按钮的用户最终会调用绑定到表单
submit
事件的处理程序......(但如上所述,调用提交按钮上的单击不会做同样的事情) - 事实上,用户提交表单的任何方式(通过提交按钮或按 Enter),使用 jQuery 绑定到表单
submit
事件的处理程序都会被调用......
现在,我是:
- 将使用 jQuery 绑定的处理程序解除绑定到提交按钮的
click
事件,同时保留对它们的引用 - 将我自己的处理程序绑定到提交按钮的
click
事件,因此它首先执行 onclick=""
使用和(在它们各自的元素上)获取标记中绑定的任何处理程序onsubmit=""
并使用 jQuery 重新绑定它们(因此它们在我的之后执行),然后将属性设置为null
- 重新绑定它们的处理程序(从步骤 1 开始),以便它们最后执行
实际上,这在我自己的测试中非常有效,因此我的事件处理程序首先触发(必不可少)。
问题和我的问题:
正如预期的那样(到目前为止),我的处理程序首先触发。问题是我的处理程序是异步的,所以我必须抑制(preventDefault/stopPropagation/etc)表单submit
或提交click
调用它的按钮事件......直到 API 请求完成。然后,当 API 请求返回时,一切正常,我需要自动重新调用表单提交。但是由于我上面的观察,我如何确保所有的事件处理程序都被触发,就好像它是一个自然的表单提交一样?
获取所有事件处理程序的最干净的方法是什么,把我的放在第一位,然后重新调用表单提交,以便以正确的顺序调用所有内容?
$('form').submit()
和之间有什么区别(如果有的话)$('form')[0].submit()
?(对于$('[type=submit]').click()
and也是一样的$('[type=submit]')[0].click()
)
tl;博士,关于 Javascript/jQuery/浏览器表单提交事件处理的规范、清晰、一刀切的文档是什么?(我不是在寻找书籍推荐。)
一些解释:我正在尝试补偿购物车结帐页面中的大量 Javascript,有时表单仅在用户单击页面底部的按钮(不是提交按钮)时提交,或者有其他棘手的场景。到目前为止,它相当成功,只是重新调用提交才是真正的问题。