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”代表“异步”。
在validateEmail
的else
分支中,您将启动对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; } }
您可以尝试$.ajax
的async: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,但我认为你也可以管理它。