我有一个表单,带有文本输入和提交按钮。
在提交时,我想首先点击服务器以查看输入是否有效,然后根据响应显示错误消息或是否有效,继续提交表单。
这就是我所拥有的:
$('#new_user').submit(function(e) {
$.ajax({
type: "POST",
dataType: 'json',
url: "/users/stuff",
data: $('#new_user').serialize(),
success: function(data){
if (data.valid) {
return true
} else {
// Show error message
return false;
e.preventDefault();
}
}
});
});
问题是表单总是提交,给定用例,什么是正确的实现方式?感谢
答案 0 :(得分:4)
试试这样:
$('#new_user').submit(function(e) {
var $form = $(this);
// we send an AJAX request to verify something
$.ajax({
type: "POST",
dataType: 'json',
url: "/users/stuff",
data: $form.serialize(),
success: function(data){
if (data.valid) {
// if the server said OK we trigger the form submission
// note that this will no longer call the .submit handler
// and cause infinite recursion
$form[0].submit();
} else {
// Show error message
alert('oops an error');
}
}
});
// we always cancel the submission of the form
return false;
});
答案 1 :(得分:1)
由于您已经通过AJAX提交,为什么不提交数据然后是否有效而不是两次传输数据?
也就是说,进行Ajax调用的函数需要是返回false的函数。然后,successvfunction应以:
结束$('#new_user').submit()
AJAX是异步的这一事实让你失望。
请原谅任何错别字,我在手机上这样做。
答案 2 :(得分:0)
将相同的帖子提交给服务器两次似乎是不必要的。如果表单没有(或不能)成功提交,我猜你只想留在同一页面上。如果我理解你的意图正确,只需从成功处理程序中重定向:
$('#new_user').submit(function(e) {
$.ajax({
type: "POST",
dataType: 'json',
url: "/users/stuff",
data: $('#new_user').serialize(),
success: function(data){
location.href = "success.htm";
},
// if not valid, return an error status code from the server
error: function () {
// display error/validation messaging
}
});
return false;
});
答案 3 :(得分:0)
另一种方法
编辑:两次提交相同的数据似乎是多余的,不确定这是否是预期的。如果服务器在第一次尝试时获得有效数据,则重新发送
var isValid=false;
$('#new_user').submit(function(e) {
var $form = $(this);
/* only do ajax when isValid is false*/
if ( !isValid){
$.ajax({
type: "POST",
dataType: 'json',
url: "/users/stuff",
data: $form.serialize(),
success: function(data){
if (data.valid) {
isValid=true;
/* submit again, will bypass ajax since flag is true*/
$form.submit();
} else {
// Show error message
alert('oops an error');
}
}
});
}
/* will return false until ajax changes this flag*/
return isValid;
});