使用JQuery调用AJAX而不是设置变量

时间:2011-07-31 14:20:30

标签: javascript jquery ajax recaptcha

我正在尝试使用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始终为真,这是不正确的。

我猜这与处理事情的方式有关。

关于为什么以及如何解决这个问题的任何想法?

感谢。

2 个答案:

答案 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{
    //...
    }
});