Javascript(jQuery)回调范围问题

时间:2010-11-09 14:12:37

标签: javascript jquery

以下是我编写的一个小jQuery代码,用于检查数据库中是否存在用户名和电子邮件。如果他们这样做,我返回false以防止提交表格。

我计划的方式是这样的。 在其他东西有效后提交。我使用ajax请求来检查用户名是否存在。如果是,我会以同样的方式检查电子邮件。

这就是问题所在。我无法在ajax回调中设置everythingIsOK。所以,如果一切正常,我都无法回归。

有什么想法吗?

$(loginForm).submit(function(){
    var = everythingIsOK = false;
    if((loginForm).valid()){
        $.get("/ajax/usernameAvailable", {username: $("#username").val()}, function(data){
            if(data.available){
                $.get("/ajax/emailAvailable", {email: $("#email").val()}, function(data){
                    if(data.available){
                        everythingIsOK = true;
                    return true;
                    }else{
                        $("#notAvailable").html("Email already exists.").show().fadeOut(8000);
                        return false;
                    }
                }, "json");
            }else{
                $("#notAvailable").html("This is username already exist.").show().fadeOut(8000);
            }
        }, "json");
    }

    return everythingIsOK;
});

4 个答案:

答案 0 :(得分:3)

如果 ok,你可以调用native form.submit()函数(不再触发这个处理程序),并且总是从jQuery处理程序返回false,就像这样:

loginForm.submit(function(){
  var form = this;
  if(!loginForm.valid()) return false;

  $.get("/ajax/usernameAvailable", {username: $("#username").val()}, function(data){
    if(data.available){
      $.get("/ajax/emailAvailable", {email: $("#email").val()}, function(data){
        if(data.available) {
          form.submit();
        }else{
          $("#notAvailable").html("Email already exists.").show().fadeOut(8000);
        }
      }, "json");
    }else{
      $("#notAvailable").html("This is username already exist.").show().fadeOut(8000);
    }
  }, "json");
  return false;
});

当检查完成(从服务器返回)时,您将收到错误,或者表单将提交并继续。此外,我更改了上面的$(loginForm以便不再被包裹,通过if((loginForm).valid()){判断(如果这不是错误),它已经一个jQuery对象。

答案 1 :(得分:2)

你的第二行有语法错误:

var = everythingIsOK = false;

应该是:

var everythingIsOK = false;

可能是问题吗?

答案 2 :(得分:1)

var = everythingIsOK = false;

应该是

var everythingIsOK = false;

我猜。也许这是第一个问题?

答案 3 :(得分:1)

而不是var = everythingIsOK = false;它应该是var everythingIsOK = false;

范围方面,如果不起作用,您可以将其更改为对象var status = { everythingIsOK: false };的属性并更改该属性的值。

但是,您需要始终从提交处理程序返回false,因为正如Nick指出的那样,您的get调用是异步的 - 所以他们很可能不会及时完成除非您这样做,否则不要提交表单。 (听取他的建议并从内部get函数的回调中手动提交提交。)