以下是我想要发生的事情:
1. User answers the form, clicks submit
2. The data will be evaluated by the CodeIgniter `validate_new_account()`
a. If there are errors, prevent submission so that the dynamically added fields will not disappear
b. If successful / no error validation, proceed to the **else** part of `validate_new_account()` to `$this->view_preview_form( $this->get_post_data() );`
我有一个表单,然后将其提交给我的控制器的validate_new_account()
函数:
function validate_new_account()
{
// validations here
if ( $this->form_validation->run() == FALSE ) {
// JSON-encoded validations
$errors = json_encode( $this->form_validation->error_array() );
echo $errors;
} else {
// next step
$this->view_preview_form( $this->get_post_data() );
}
}
我使用jQuery Form Plugin与控制器进行交互。
var options = {
url: "<?php echo site_url('new_account/validate_new_account'); ?>",
type: 'POST',
dataType: 'json',
success: function(data) {
if (data.length === 0) {
alert('Form successfully submitted!');
} else {
// echo validation errors from CodeIgniter
alert("Some fields weren't answered successfully. Please answer them.");
$.each(data, function(key, value){
var container = '<div class="error">'+value+'</div>';
$('.form-element input[name="'+key+'"]').after(container);
});
}
}
};
$('#main-submit').click(function(e) {
$('#main-form').valid();
$('#main-form').ajaxSubmit(options);
e.preventDefault();
});
没有我的ajax函数,上面的代码工作得很好,但是我动态添加了需要ajax来处理所有验证的元素,否则这些元素就会消失(不良用户体验)。
因此,如果我启用并使用我的ajax函数,CodeIgniter的验证错误将打印出我想要的方式(通过ajax的成功部分)但如果所有验证现在都正确,则表单不会$this->view_preview_form( $this->get_post_data() );
即可。
为什么会这样?我一直在寻找类似的问题,但遗憾的是没有一个与我的情况类似。
如果表单发送成功,我如何通过e.preventDefault()
?
对于所有帮助我解决这个问题的人,可能是评论或回答,非常感谢。我一直在寻找这个解决方案(CodeIgniter验证+ jQuery验证+ AJAX提交+无缝文件上传)两个月,现在我终于可以呼吸了。我永远不会忘记你的所有帮助。你永远不会知道这对我意味着多少。
答案 0 :(得分:1)
Simples:
<script>
$('form').on('submit', function(e) {
// do your AJAX validation here
var url = $(this).attr('action');
var params = $(this).serialize();
$.post(url, params, function(response) {
if (response.errors.length > 0) {
e.preventDefault();
}
});
});
</script>
如果返回多个错误,这将停止提交表单。否则,事件将继续正常并传播。
答案 1 :(得分:0)
我认为在验证之后你想阻止表单提交,以防止重新加载页面。如果这就是你想要的,那么试试这个
将处理程序绑定到表单的submit
事件而不是按钮的click
事件并返回false
,这将阻止form
提交
$('#main-form').on('submit', function () {
$(this).valid(); // do your validation here
$(this).ajaxSubmit(options); // then call the ajax function
return false;
});