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。

请帮我弄清楚我哪里出错了..

提前致谢。

AJAX中的“A”代表“异步”。

validateEmailelse分支中,您将启动对emailcheck.php的异步请求。 validateEmail您的PHP文件响应之前返回; 然后你的emailcheck.php脚本会响应,jQuery会调用你的success回调,但没有人会注意它返回的内容。 就表单validation而言,结果是你的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; } } 

您可以尝试$.ajaxasync:false选项,或者重新编写所有逻辑,以便能够等待异步请求返回。

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

 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; } 

我相信问题是你从validateEmail()的调用中得到了未定义的返回值。 这是因为您的ajax请求是异步完成的,并且validateEmail()函数在获得结果之前退出。 一个解决方案(我认为不好)是在ajax请求中将选项async设置为false。

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

否则我会推荐这个。 无论触发提交调用,您都可以触发validateEmail(),然后从那里调用submit。

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

可能你有其他validationfunction,但我认为你也可以管理它。