为什么“返回假”;或“event.preDefualt();”在$ .post()之后不起作用;
首先,我简单地写了一个返回false
$(#id).submit(function(e){ return false;}// it works properly
,但
当我通过$.post('check-email.php',{parameter},function{data})
调用某些内容并尝试在$ .post调用之后写入return false。它不起作用并直接转到下一页。
这是我的代码: -
$(document).ready(function () { //newly added
$('#mysignupform').submit(function (event) {
return false;
or event.preDfault(); // only work here
var emailVal = $('#inputEmail').val(); // assuming this is a input text field
//alert(emailVal);
$.post('check-email.php', {
'email': emailVal
}, function (data) {
alert(data);
if (data == 'false') {
$("#mysignupform").submit(function (event) {
return false;
or event.preventDefault(); //both doesnt work here..why??
;
});
} else {
$("#mysingupform").submit(function () {
return false;
}); //retrun false doesnt work here..why??
}
});
});
});
我不想让他们提交,但仍然会发生。请帮我..! 提前谢谢..
答案 0 :(得分:1)
因为$.post
是异步。在立即调用$.post
之后的声明中继续执行。由于后面没有语句,submit
事件处理函数将只返回undefined
,浏览器将很乐意继续提交,就好像什么也没发生一样。
异步方法的回调只会在一段时间后执行。在您的情况下,这将是服务器返回响应的时间。由于外部函数已经返回,因此无法使用该回调函数将返回到。
您需要始终阻止表单提交按钮上的click
事件处理程序中的默认操作,然后在$.post
回调成功后以编程方式重新提交表单:
$('#mysignupform :submit').click(function (event) {
var form = this.closest("form"); // Get a reference to the containing form
event.preventDefault(); // Prevent the default action (form submission)
$.post('check-email.php', { /* data */ }, function (data) {
// If the data is good...
form.submit(); // Submit the containing form
});
});
显然,如果你绑定到submit
形式的事件,你就无法真正做到这一点,因为重新提交表单会再次触发事件处理程序,你将陷入无限循环
答案 1 :(得分:1)
这应该有效:
$(document).ready(function () { //newly added
$('#mysignupform').submit(function (event) {
// your $.post call
$.post('check-email.php', {email: emailVal}, function (data) {
// ...
// having a return false means returning false to the success callback
// of your .post call. it is not the same as returning false to the
// submit() callback
});
// return false to submit()
return false;
});
});
答案 2 :(得分:1)
Ajax异步工作。简单的解决方案是在提交按钮上绑定click事件处理程序。
$('#your_submit_button').click(function (event) {
event.preventDefault();
var emailVal = $('#inputEmail').val(); // assuming this is a input text field
$.post('check-email.php', {
'email': emailVal
}, function (data) {
if (data !== 'false') {
// submit the form here
$("#mysingupform").submit();
}
});
});
答案 3 :(得分:0)
$.post(...)
是异步的。请改为$.ajax(async: false, ...)
。
答案 4 :(得分:0)
这是因为在post完成之后执行的函数是异步执行的,即你不再在事件处理程序中。
This answer有一种技巧可以使用 - 在设置布尔标志后,基本上再次点击提交按钮,以防止你的帖子逻辑被执行两次。