2011-05-15 96 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