form.submit()发布复选框数据与标准提交按钮不同


Does form.submit() post checkbox data differently from standard submit button?

我的CodeIgniter应用程序刚刚遇到一个奇怪的问题。我使用jQuery .on('submit')事件处理程序来捕获所有表单提交,并遵循以下过程:使用this获取表单对象,存储该对象以备将来使用,检查用户是否使用AJAX调用登录,如果登录,则获取存储的jQuery表单对象并使用form.submit()提交表单。

这对我的所有表单都非常有效(表单验证工作正常,正确返回验证错误(,除非我有formcheckbox。复选框将被忽略。

我使用required表单验证规则来确保用户在继续之前勾选复选框,并且当禁用此事件处理程序时,它绝对正常工作。但是,只有当我向不是checkbox的表单添加另一个input时,验证错误才会出现(奇怪的(!

我想知道是否有人能理解为什么会发生这种错误背后的理论?我可以发布代码,但我有90%的把握这与JavaScript处理复选框数据发布的方式有关,我只是不知道。

有什么想法吗?

Javascript本身实际上并没有发布任何表单数据。

在标准HTML提交中,如果复选框是而不是,则该项目没有提交键/值。

我很难了解到,许多Javascript表单序列化程序(Ajax调用使用(都被破坏了,不符合标准。。。我花了几天时间编写自己的测试,我的Qunit测试几乎比代码本身还要长。

你需要做的是使用你的调试工具(Firefox或Chrome(并查看网络选项卡——看看到底提交了什么。

在Jeremy J Starcher非常有用的建议下,我解决了这个问题。由于$_POST数组为空,CodeIgniter的表单验证未运行。通常,即使只有一个输入字段(复选框(,实际提交按钮的值也会被POST,因此,即使复选框没有被选中并且没有发布任何值,$_POST数组仍然由提交按钮的数值填充。然而,当使用Javascript提交表单时,提交按钮的值会被忽略,而不会被POST(感谢Jeremy提供的重要信息(。

解决方案是添加一个空白的、隐藏的输入字段(无论值如何,其类型都是POSTed(。也许有一种更好的方法可以解决这个问题,使用Javascript创建一个空白POST变量或其他什么,我欢迎与此相关的进一步回答。

顺便说一句,我对CSRF验证是如何成功的感到困惑,但$_POST数组是空的——我检查了CodeIgniter的Security Class,基本上它检查了CSRF POST变量,如果一切正常,它就会取消设置,所以当$_POST阵列达到Form validation Class时,它是空的。