2010-11-09 119 views
0

以下是我寫的一個小小的jQuery代碼,用於檢查數據庫中是否存在用戶名和電子郵件。如果他們這樣做,我會返回false以防止提交表單。Javascript(jQuery)回調範圍問題

我計劃的方式就是這樣。 在其他東西有效後提交。我使用ajax請求來檢查用戶名是否存在。如果是這樣,那麼以同樣的方式檢查電子郵件。

這是問題所在。我不能在ajax回調中設置everythingIsOK。所以,如果一切正常,我不能返回true。

任何想法?

$(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; 
}); 

回答

3

你可以調用native form.submit()功能(不會再次觸發此處理),如果它 ok了,從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對象。

+0

是的......這更有意義。它的工作原理。謝謝! – Sinan 2010-11-09 14:26:25

+0

@Sinan - 歡迎! – 2010-11-09 14:27:22

1
var = everythingIsOK = false; 

應該

var everythingIsOK = false; 

我猜。也許這是第一個問題?

+0

這不是問題,這是事實,這是調用不同步。 – 2010-11-09 14:19:11

2

你有你的第二行語法錯誤:

var = everythingIsOK = false; 

應該是:

var everythingIsOK = false; 

會是問題?

+0

這是一個錯字。但感謝您指出。 – Sinan 2010-11-09 14:27:31

1

相反的var = everythingIsOK = false;應該var everythingIsOK = false;

範圍明智的,如果這是不工作,你可以改變它是一個對象var status = { everythingIsOK: false };的屬性和更改屬性的值。

但是,您需要始終從提交處理程序返回false,因爲正如Nick指出的那樣,您的get調用是異步的 - 所以它們最可能不會及時完成以防止表單從提交,除非你這樣做。 (請他的意見,並呼籲從內部get功能的回調手動提交。)