2010-10-12 44 views
0

我有以下函數,我用它來檢查電子郵件地址是否已經註冊。

checkTaken() { 
    var email_var = $('input#email').val(); 

    $.post("../includes/check_email.inc.php",{email:email_var} ,function(data) { 
     var ret = data + ""; 
    if(ret=="true") {//if username not avaiable 
     $('div#emailTaken').show(); 
     $('input#email').addClass('redBack'); 
     return false; 
    } else { 
     $('div#emailTaken').hide(); 
     $('input#email').removeClass('redBack'); 
     return true; 
    } 
    }); 
} 

當我把它使用類似以下正常工作:

email.blur(checkTaken); 

但是,當我這樣做

var test1 = checkTaken(); 

if(chekTaken) { 

一些古怪發生。它進入函數,執行$ .post行,但不會進入例程的其餘部分。爲什麼是這樣?我該如何解決它?

作爲一個說明,當我使用最後兩個示例調用函數時,我確實從服務器獲取信息爲seen through firebug。如果我爲test1添加手錶,它仍然未定義。

回答

0

正在發生,因爲checkTaken()不等待$.post返回前完成,由於事實$.post將火關一個異步請求到服務器。你可以做的是使用$.ajax來代替,並將async選項設置爲false(請注意,它會在等待請求完成時暫時阻止瀏覽器)。

+0

結果$ .ajax調用的參數是什麼?鍵入:「POST」,data:email_var,async:false,url:same?我在數據字段中出現錯誤,因爲它沒有發送值爲email_var的「email」變量。謝謝。 – David 2010-10-12 22:40:19

+0

對於遇到同樣問題的參數是類型:「POST」,data:「email =」+ email_var(我的具體情況)async:false,success:function(returned_data){bla bla} – David 2010-10-13 02:09:24

1

您正在混合使用同步函數調用的異步後回調。從回叫返回不會返回到被叫方。

0

原因是AJAX中的第一個A意味着「異步」。這意味着您的代碼在HTTP請求完成之前繼續執行。當請求完成時,您的處理函數將運行。因此,您必須構建代碼來考慮這一點。這通常意味着將所有依賴於AJAX請求的代碼放在處理函數中,正如您已經在某種程度上已經完成的那樣。

$.post("../includes/check_email.inc.php",{email:email_var} ,function(data) { 
    var ret = data + ""; 
    if(ret=="true") {//if username not avaiable 
     $('div#emailTaken').show(); // this works 
     $('input#email').addClass('redBack'); // this works 

     return false; // this does nothing 
    } else { 
     $('div#emailTaken').hide(); // this works 
     $('input#email').removeClass('redBack'); // this works 

     return true; // this does nothing 
    } 
}); 
0

這是因爲你的return語句在$ .post請求中,而不是在函數中。不一樣的事情。

你的函數沒有返回任何值,這就是爲什麼你不輸入你的其他代碼。

相關問題