返回false不停止表单提交

我很确定这应该不会那么难。 我有一个表单在onsubmit上运行以下函数:

function FORMVALIDATE_add_rota_entry() { var rota_date = $("#rota_date").val(); var rota_id = $("#rota_id").val(); var am_pm = $("#am_pm").val(); if(rota_date == "") { alert("Please enter a date."); return false; } if(rota_id == "error") { alert("Please select a rota from the list."); return false; } // check if that rota has already been entered for that date and am/pm $.ajax({ async:false, type:"POST", url:"/modules/rotas/check_rota_entry_existence", data:{rota_date:rota_date, rota_id:rota_id, am_pm:am_pm}, success: function(result) { if(result != "0") { alert("This rota has already been added to this date, "+am_pm+"."); return false; } } }); } 

它在表单标记中通过以下方式调用:

 onsubmit="return FORMVALIDATE_add_rota_entry();" 

并且它在前两个工作正常工作,rota_date和rota_id,它们应该提醒警报,它会停止提交表单但是当它进入ajax调用时,它会很好,返回正确的结果,当它发出警报时应该,但返回错误似乎并没有阻止提交表单。 有没有人有任何想法,因为我很难过!

谢谢!

你做错了。 你这样做的方式,你应该让函数总是返回false:

 function FORMVALIDATE_add_rota_entry() { var rota_date = $("#rota_date").val(); var rota_id = $("#rota_id").val(); var am_pm = $("#am_pm").val(); if(rota_date == "") { alert("Please enter a date."); return false; } if(rota_id == "error") { alert("Please select a rota from the list."); return false; } // check if that rota has already been entered for that date and am/pm $.ajax({ async:false, type:"POST", url:"/modules/rotas/check_rota_entry_existence", data:{rota_date:rota_date, rota_id:rota_id, am_pm:am_pm}, success: function(result) { if(result != "0") { alert("This rota has already been added to this date, "+am_pm+"."); return false;//this is called when the server responds....which in your case isnt happening in the first place } } }); return false;//this should be at the end so 'false' is always returned to 'onsubmit' } 

return false;的唯一目的return false; 在if语句中用它来阻止ajax代码运行。 但是在function的最后也应该有一个。 这应该是一个更容易解决的问题:

onsubmit="FORMVALIDATE_add_rota_entry();return false;"

去掉:

 onsubmit="return FORMVALIDATE_add_rota_entry();" 

在你的函数下面添加(其中my-formmy-form的id):

 $('#my-form').submit(FORMVALIDATE_add_rota_entry); 

更改:

 function FORMVALIDATE_add_rota_entry() { 

至:

 function FORMVALIDATE_add_rota_entry(event) { 

并在你的function改变:

 return false; 

 event.preventDefault(); 

这并不总是暂停表单提交,因为ajax请求是异步的,并且内部代码不会及时运行以停止表单进程。

好的,所以在尝试了上述解决方案并没有取得绝对的成功后,我自己来了。 我完全抛弃了表单元素并发送了三个值onclick如下:

  onclick="FORMVALIDATE_add_rota_entry($('#rota_date').val(), $('#rota_id').val(), $('#am_pm').val());" 

然后,function变为如下:

 function FORMVALIDATE_add_rota_entry(rota_date, rota_id, am_pm) { // check if that rota has already been entered for that date and am/pm $.ajax({ type:"POST", url:"/modules/rotas/check_rota_entry_existence", data:{rota_date:rota_date, rota_id:rota_id, am_pm:am_pm}, success: function(result) { if(result != "0") { alert("This rota has already been added to this date, "+am_pm+"."); } else if(rota_date == "") { alert("Please enter a date."); } else if(rota_id == "error") { alert("Please select a rota from the list."); } else { $.post('/modules/rotas/add_rota_entry2', {rota_date:rota_date, rota_id:rota_id, am_pm:am_pm}); parent.$.fn.colorbox.close(); } } }); } 

一切都是有效的!

谢谢大家输入:)}

尝试在return语句之前使用event.preventDefault()

而不是使用

 onsubmit="return FORMVALIDATE_add_rota_entry();" 

尝试使用

 onclick="return FORMVALIDATE_add_rota_entry();" 

您可能需要添加return true; 在你的function结束时。