我的CodeIgniter应用程序遇到了一个奇怪的问题。我使用jQuery .on('submit')事件处理程序来捕获所有表单提交,并遵循以下过程:使用this获取表单对象,存储该对象以备后用,检查用户是否使用AJAX调用登录,如果登录,则获取存储的jQuery表单对象,并使用form.submit()提交表单。
这绝对适用于我的所有表单(表单验证工作正常,正确地返回验证错误),除非我有一个带有checkbox的form。该复选框将被忽略。
我使用required表单验证规则来确保用户在继续之前勾选了复选框,并且当禁用此事件处理程序时,它可以正常工作。然而,只有在向表单添加另一个不是checkbox的input时,验证错误才会出现(奇怪地)!
我想知道是否有人可以理解为什么会发生这个错误背后的理论?我可以发布代码,但我大约90%确定这与JavaScript处理checkbox数据发布的方式有关,我只是不知道。
有什么想法吗?
发布于 2014-03-29 07:42:30
Javascript本身并不实际发布任何表单数据。
在标准的HTML提交中,如果复选框未选中,则不会为该项提交键/值。
我已经学到了许多Javascript表单序列化程序(由Ajax调用使用)都被简单地破坏了,并且没有遵循标准……我花了几天时间编写自己的代码,而且我的Qunit测试几乎比代码本身还要长。
您需要做的是使用调试工具(Firefox或Chrome)并查看网络选项卡--查看提交的确切内容。
发布于 2014-03-30 01:01:50
在Jeremy J Starcher的非常有用的建议下,我解决了这个问题。由于$_POST数组为空,CodeIgniter的表单验证未运行。通常,即使只有一个输入字段(复选框),实际提交按钮的值也是POSTed,因此,即使没有选中复选框并且没有张贴任何值,$_POST数组仍然由提交按钮的值填充。但是,当使用Javascript提交表单时,submit按钮的值被忽略,而不是POSTed (感谢Jeremy提供的重要信息)。
解决方案是添加一个空白的、隐藏的输入字段(其类型始终为POSTed,而不管值是什么)。也许有一种更好的方法来解决这个问题,使用Javascript创建一个空的POST变量或其他东西,我欢迎进一步的回答。
顺便说一句,我很困惑CSRF验证是如何成功的,但$_POST数组是空的--我检查了CodeIgniter的Security Class,基本上它检查了CSRF POST变量,如果一切正常,它就取消设置它,所以当$_POST数组遇到Form validation Class时,它是空的。
https://stackoverflow.com/questions/22725025
复制相似问题