2011-05-15 100 views
0

我想從表單提交函數返回值從ajax請求。問題與ajax函數返回值

的代碼如下:

function validateEmail(){ 
     if(email.val() == "") 
     { 
      $("#emailerror").html("Enter Email..."); 
      return false; 
     } 
     else { 
     $.ajax({ 
      type: "POST", 
      data: "email="+email.val(), 
      url:'emailcheck.php', 
      beforeSend: function(){ 
       $("#emailerror").html("Checking Email..."); 
      }, 
      success: function(data){ 
       if(data == "invalid") 
       { 
        $("#emailerror").html("Invalid Email"); 
        return false; 
       } 
       else if(data != "0") 
       { 
        $("#emailerror").html("Email Already Exist"); 
        return false; 
       } 
       else 
       { 
        $("#emailerror").html("OK"); 
        return true; 
       } 
      } 
     }); 
     } 
    } 

在表單提交,我打電話的功能,並檢查從Ajax響應返回值:

$('#myForm').submit(function(){ 
     if(validateEmail()) 
     { 
      alert('returning true'); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
}); 

但是,不執行代碼時返回值爲'true'。函數validateEmail()返回false。

請幫我弄清楚我錯了什麼地方..

在此先感謝。

回答

0

的 「A」,在AJAX的全稱是 「異步」。

validateEmailelse分支中,您將啓動對emailcheck.php的異步請求。 validateEmail將在之前返回您的PHP文件響應;那麼你的emailcheck.php腳本確實會迴應,jQuery會調用你的success回調函數,但是沒有人會注意它返回的結果。結果就形式驗證而言,那是你validateEmail看起來是這樣的:

function validateEmail() { 
    if(email.val() == "") { 
     $("#emailerror").html("Enter Email..."); 
     return false; 
    } 
    else { 
     // Your $.ajax() might as well not even be here as 
     // validateEmail will return before $.ajax() gets a 
     // response from emailcheck.php 
     return; 
    } 
} 

你可以嘗試async:false選項$.ajax或返工所有的邏輯能夠等待異步請求返回。

此外,validateEmail的第二個分支不返回false,它根本不返回任何內容,但仍不是真正的值。

0
if(data == "invalid") 
      { // id data = invalid it good 
       $("#emailerror").html("Invalid Email"); 
       return false; 
      } 
      else if(data != "0") //if data == good it work :) it is error 
      { 
       $("#emailerror").html("Email Already Exist"); 
       return false; 
      } 
      else 
      { 
       $("#emailerror").html("OK"); 
       return true; 
      } 

也許是這樣的:

if(data == "invalid") 
      { // id data = invalid it good 
       $("#emailerror").html("Invalid Email"); 
       return false; 
      } 
      else if(data == "good") //if data == good it work :) it is error 
      { 
       $("#emailerror").html("OK"); 
       return true; 
      } 
      else 
      { 
       $("#emailerror").html("Email Already Exist"); 
       return false; 
      } 
0

我認爲問題在於,您將調用validateEmail()時的返回值設爲undefined。 這是因爲你的ajax請求是異步完成的,並且validateEmail()函數在獲得結果之前退出。一種解決方案(在我看來不好)將在ajax請求中將選項async設置爲false。

$.ajax({ 
     type: "POST", 
     data: "email="+email.val(), 
     url:'emailcheck.php', 
     async: false, 
     beforeSend: function(){ 
      $("#emailerror").html("Checking Email..."); 
     } 

否則我會推薦這個。無論觸發您的提交電話,您都可以觸發validateEmail(),然後從那裏調用提交。

validateEmail(); //Instead of trigger submit you call this function.  

function validateEmail(){ 
    if(email.val() == "") 
    { 
     $("#emailerror").html("Enter Email..."); 
     return false; 
    } 
    else { 
    $.ajax({ 
     type: "POST", 
     data: "email="+email.val(), 
     url:'emailcheck.php', 
     beforeSend: function(){ 
      $("#emailerror").html("Checking Email..."); 
     }, 
     success: function(data){ 
      if(data == "invalid") 
      { 
       $("#emailerror").html("Invalid Email"); 
       return false; 
      } 
      else if(data != "0") 
      { 
       $("#emailerror").html("Email Already Exist"); 
       return false; 
      } 
      else 
      { 
       $("#emailerror").html("OK"); 
       $('#myForm').submit(); //Here you trigger submit. 
       return true; 
      } 
     } 
    }); 
    } 
} 

也許你有其他驗證功能,但我認爲你也可以管理它。

+0

謝謝約翰..你救了我的一天:) – prajan 2011-05-15 13:13:08

+1

那麼你應該接受他的回答,而不是你所做的回答? – psynnott 2011-12-12 14:00:07