jquery中为什么$.get和$.post里加return false;都阻止不了提交表单?

时间:2022-02-25 09:35:23

// 验证各项
$('#resetSubmit').bind('click', function() {
var tel      = $('#tel').val();
var vcode      = $('#vcode').val();
var password   = $('#newpassword').val();
var repassword = $('#renewpassword').val();

if (tel == '') {
alert('请输入手机号');
return false;
} else if (tel.match(/[^0-9]/g)) {
alert('手机号必须是数字');
return false;
} else if (tel.length != 11) {
alert('手机号必须是11位');
return false;
}

if (vcode == '') {
alert('请输入验证码');
return false;
} else {
$.post('user.php?act=check_vcode', { vcode: vcode, tel: tel }, function(data) {
alert(typeof data);return false;
if (data == '-1') {
alert("不存在该验证码,请重新获取");
return false;
} else if (data == '-2') {
alert("该验证码已被使用,请重新获取");
return false;
} else if (data == '0') {
alert("该验证码已过期,请重新获取");
return false;
}
});
}

if (password == '') {
alert('请输入密码');
return false;
} else if (password.length < 6) {
alert('密码长度不能小于6个字符');
return false;
} else if (password != repassword) {
alert('两次密码不一致');
return false;
}

$(this).parent().parent().submit();
});

中的这行:

$.post('user.php?act=check_vcode', { vcode: vcode, tel: tel }, function(data) {
if (data == '-1') {
alert("不存在该验证码,请重新获取");
return false;
} else if (data == '-2') {
alert("该验证码已被使用,请重新获取");
return false;
} else if (data == '0') {
alert("该验证码已过期,请重新获取");
return false;
}
});


user.php?act=check_vcode:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])  &&  ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) {
extract($_POST);
if (!empty($vcode)  &&  !empty($tel)) {
$sql = 'SELECT `vcode`, `used` FROM '.$ecs->table('vcode_tmp').' WHERE `tel` = "'.$tel.'" ORDER BY `id` DESC';
$rs = $db->getRow($sql, true);
if (!$rs  ||  empty($rs['vcode'])) {
echo -1; // 没有该验证码
} else if ($rs['vcode'] != $vcode) {
echo 0; // 不存在该验证码
} else if ($rs['used'] == 1) {
echo -2; // 相同的但已经使用
} else {
$sql = 'UPDATE '.$ecs->table('vcode_tmp').' SET `used` = 1 WHERE `vcode` = "'.$vcode.'"';
$db->query($sql);
echo 1; // ok
}
}
exit;
}


我故意输入一个已过期的验证码也没有提示,直接就提交了,而且

$sql = 'UPDATE '.$ecs->table('vcode_tmp').' SET `used` = 1 WHERE `vcode` = "'.$vcode.'"';
$db->query($sql);

这句都没有执行

11 个解决方案

#1


如果逻辑正确 return false 是不可能不能阻止提交的.
跟一下自己在什么地方给绕过去了

#2


你不知道ajax默认是异步的么?

#3


$(this).parent().parent().submit();
这句没有任何限制,只要点击就触发,所以你上面判断的为空条件无效,请把这句放在else里。

#4


在第一段代码的35和36行之间加入 return false;

#5


因为楼主不明白什么是异步,甚至连javascript的语法都没理解。

#6


因為是異步請求,你那個是阻止主線程。。

#7


手机号那个验证有问题哈 /^1\d{10}$/

#8


楼上已经说了,ajax默认是异步的,因此当你触发ajax动作之后,主线程是不会理会ajax回调中的内容直接执行接下去的语句的,你在回调中判断返回值合法与否是无法阻断主线程中的表单提交动作的。
要想实现回调中也可以阻断,可以使用.ajax方法,并且将async参数设置成false,这样ajax请求将变为同步,在ajax执行完成之前将锁定浏览器直至请求执行完成

#9


引用 2 楼 ohmygirl 的回复:
你不知道ajax默认是异步的么?

正解

#10


要停止执行,在ajax请求后面加上return false

#11


引用 6 楼 fdipzone 的回复:
因為是異步請求,你那個是阻止主線程。。


正解

#1


如果逻辑正确 return false 是不可能不能阻止提交的.
跟一下自己在什么地方给绕过去了

#2


你不知道ajax默认是异步的么?

#3


$(this).parent().parent().submit();
这句没有任何限制,只要点击就触发,所以你上面判断的为空条件无效,请把这句放在else里。

#4


在第一段代码的35和36行之间加入 return false;

#5


因为楼主不明白什么是异步,甚至连javascript的语法都没理解。

#6


因為是異步請求,你那個是阻止主線程。。

#7


手机号那个验证有问题哈 /^1\d{10}$/

#8


楼上已经说了,ajax默认是异步的,因此当你触发ajax动作之后,主线程是不会理会ajax回调中的内容直接执行接下去的语句的,你在回调中判断返回值合法与否是无法阻断主线程中的表单提交动作的。
要想实现回调中也可以阻断,可以使用.ajax方法,并且将async参数设置成false,这样ajax请求将变为同步,在ajax执行完成之前将锁定浏览器直至请求执行完成

#9


引用 2 楼 ohmygirl 的回复:
你不知道ajax默认是异步的么?

正解

#10


要停止执行,在ajax请求后面加上return false

#11


引用 6 楼 fdipzone 的回复:
因為是異步請求,你那個是阻止主線程。。


正解