JavaScript检查表单,而不是等待AJAX​​响应

Y.G*_*G.J 3 javascript ajax jquery

这是我表格中支票的一部分

function check(theform) {
var re = /^\w[0-9A-Za-z]{5,19}$/;
if (!re.test(theform.username.value)) { 
    alert("not valid username");
    theform.username.focus();
    return false;
}

$.ajax({
    type: "POST",
    url: "username.asp",
    data: "username="+theform.username.value,
    success: function(msg){
        username = msg;
        if (!username) {
            alert("username already in use");
            return false;
        }
    }
});

var re = /^\w[0-9A-Za-z]{5,19}$/;
if (!re.test(theform.password.value)) { 
    alert("not valid password");
    theform.password.focus();
    return false;
}
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因进行同步...它检查用户名,然后用ajax复制用户名,而不是等待响应并跳转到密码检查.

我不想插入代码的其余部分isreadystate(或者是什么都),因为我可能会移动的用户名重复检查结束......然后该函数将前阿贾克斯结束反正

我该怎么办?

Pek*_*ica 6

AJAX中的第一个A代表"Asynchonous".进行呼叫,并且继续执行该功能而不等待呼叫返回.

您可以async在通话中设置选项false,使您的通话同步.但是,您必须更改函数以return false使其完成check函数,并且jQuery手册不建议:

Ajax中的第一个字母代表"异步",意味着操作并行发生,并且无法保证完成的顺序.$ .ajax()的async选项默认为true,表示在发出请求后代码执行可以继续.将此选项设置为false(从而使调用不再异步)是强烈建议不要的,因为它可能导致浏览器无响应.

更好的方法是在函数内"实时"进行检查,然后启动Ajax请求,并在该请求的成功回调中提交表单.


第二次尝试同步通话.这似乎确实有效 - 在FF 3.6中测试过.

var name_success = true;

$.ajax({
    type: "POST",
    async: false,
    url: "username.asp",  // Needs to return "EXISTS" in this example 
    data: "username="+theform.username.value,
    success: function(msg){
        username = msg;
        if (username == "EXISTS") {  // Changed callback return value - 
                                     // safer this way
            alert("username already in use");
            name_success = false;   // should work because
                                    // we're in check()'s scope
            return false;
        }
    }
});

alert (name_success);
Run Code Online (Sandbox Code Playgroud)