简易表单:
<form action="${pageContext.request.contextPath }/user_regist" onsubmit="return checkForm()" method=post>
登录名:<input type="text" name="user_code" onblur="checkCode()"><span id="codeSpan" ></span><br>
<input type="submit" value="submit"><br>
</form>
// 判断登录名是否为空,或者是否已经存在
function checkCode(){
//注册文本框的值
var code = $("#user_code").val();
if(code.trim() == ""){
// 给span标签动态添加class的类
$("#codeSpan").addClass("error").html("登录名不能为空");
}else{
// 登录名不为空,发生ajax的请求
var url = "${pageContext.request.contextPath}/user_findByCode";
var param = {"user_code":code};
$.post(url,param,function(data){
if(data && data == "no"){
// 说明,登录名已经存在了,给出提示
$("#codeSpan").addClass("error").html("登录名已经存在");
}else{
// 登录名可以注册
$("#codeSpan").removeClass("error").html("可以注册");
}
});
}
}
// 如果该方法返回false,表单不提交
function checkForm(){
checkCode();
// 有标签属性为 class="error",则阻止表单提交
if($(".error").size() == 0){
return true;
}else{
return false;
}
}
问题描述:
项目首次启动时,在注册页面输入已存在用户名,直接点击提交按钮,此时异步校验用户名是否存在,操作span标签class属性;但是ajax回调函数未完成之前,表单信息已经提交,数据库存入重复用户。
虽然异步请求造成的bug已经通过同步锁解决了,但是我还有一个困惑!
困惑:
为什么上述bug只有项目启动后的首次访问会出现,之后再注册就可以正常的完成校验?