我正在尝试使用reCAPTCHA和AJAX验证CAPTCHA。
我有一个函数来完成所有操作,但我需要向调用函数返回true或false值,以指定是否提交表单。
正在正确处理我的AJAX调用,但是我设置了标志以显示CAPTCHA无效是未设置的。
我不是那么好解释所以这是代码:
function validateComment(isReply)
{
formValid = true;
if (isReply) { qualifier = "Reply"; } else { qualifier = "New"; }
$("#comment" + qualifier + "Error").hide();
$.post("/scripts/checkcaptcha.php",
{
recaptcha_challenge_field : $('#recaptcha_challenge_field').val(),
recaptcha_response_field : $('#recaptcha_response_field').val()
},
function(data)
{
if (data == "invalid")
{
$("#comment" + qualifier + "Error").html("<p>Incorrect CAPTCHA entered</p>");
$("#comment" + qualifier + "Error").slideDown();
formValid = false;
Recaptcha.reload();
}
}
);
alert(formValid);
return false;
}
我设置的formValid = false
由于某种原因无法正常工作,因此上面的代码formValid
始终为真,这是不正确的。
我猜这与处理事情的方式有关。
关于为什么以及如何解决这个问题的任何想法?
感谢。
答案 0 :(得分:1)
我很确定这是因为validateComment函数首先执行。您的ajax响应处理函数是一个回调函数,因此在加载响应之后才会执行它(validateComment已经执行并且此时返回了一个值)。你如何解决这个问题的方法是设置一个全局布尔变量(例如is_loaded),然后进入循环并保持等待直到is_loaded为真,或者你可以使用setInvterval来检查每100ms或其他东西。
编辑:或者您可以尝试将响应加载到变量中并以这种方式检查错误。
var html = $.ajax({
url: "some.php",
async: false
}).responseText;
答案 1 :(得分:1)
使用:
function validateComment(isReply,callback)
{
var callback=callback||false,formValid = true,qualifier = "New";
if (isReply) qualifier = "Reply";
$("#comment" + qualifier + "Error").hide();
$.post("/scripts/checkcaptcha.php",
{
recaptcha_challenge_field : $('#recaptcha_challenge_field').val(),
recaptcha_response_field : $('#recaptcha_response_field').val()
},
function(data){
if (data == "invalid")
{
$("#comment" + qualifier + "Error").html("<p>Incorrect CAPTCHA entered</p>");
$("#comment" + qualifier + "Error").slideDown();
formValid = false;
Recaptcha.reload();
}
}).complete(function(){
if(typeof callback=='function') callback(formValid);
});
}
validateComment(true,function(formValid){
if(formValid){
//...
}
else{
//...
}
});