0

我正在使用 jQuery validate 和我的网站的注册表单,底部有一个 reCaptcha。这是检查表单错误的脚本(仅编辑到相关部分):

$(document).ready(function() { 
  jQuery.validator.addMethod("checkCaptcha", function() {
    var phpquery = $.ajax({url:"verify.php",
      type: "POST",
      async: false,
      data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()},
      success:function(resp) {
        if (resp == 'false') {
          console.dir(resp);
          return false;
        } else {
          console.dir(resp);
          return true;
        }
      }
    });
  },"");

  $('#regForm').validate({
    rules:{
      recaptcha_response_field:{required:true,checkCaptcha:true}
    },
    messages:{
      recaptcha_response_field:{checkCaptcha:"Your Captcha response was incorrect. Please try again."}
    }
  });
});

发生的情况是,当我输入正确的 reCaptcha 响应并单击响应文本字段中的提交或选项卡时,它最初会true在控制台中显示,然后立即抛出false并阻止我提交表单。

还会发生的情况是,当输入了不正确的 reCaptcha 响应时,它会false像预期的那样抛出,但是对于我输入的每个字母,它都会将其提交到verify.php并返回false。当我最终完成输入正确的 reCaptcha 时,它无法识别它并且仍然返回false

false即使输入了正确的响应,重新加载 reCaptcha 也会引发。

我知道verify.php工作正常,因为什么时候一切<form>都会action="verify.php,"完美运行(即,告诉您是否输入了正确的 reCaptcha,无论您尝试了多少次)。

我错过了什么吗?有没有更简单、更可靠的方法来做到这一点?

4

4 回答 4

4

使用onkeyup: false里面的选项.validate()

否则,每次您键入一个字母时,它都会运行您的checkCaptcha方法并向服务器发送不完整的验证码。我相信一旦发送了不正确的验证码,它现在已经过期,你不能再次发送相同的代码。

无论哪种方式,我认为最好在字段完成之前不要向服务器发送代码。

$('#regForm').validate({
    onkeyup: false,
    rules:{
        recaptcha_response_field: {
            required: true,
            checkCaptcha: true
        }
    },
    messages:{
        recaptcha_response_field: {
            checkCaptcha: "Your Captcha response was incorrect. Please try again."
        }
    }
});

此外,如果验证码失败,您需要触发刷新以获取新代码。

Recaptcha.reload();

在你的success回调中,也许......

success:function(resp) {
    if (resp == 'false') {
        console.dir(resp);
        Recaptcha.reload();  // get a new captcha code on failure
        return false;
    } else {
        console.dir(resp);
        return true;
    }
}
于 2013-08-10T14:10:40.260 回答
1

您的第一个 addMethod 验证器的问题在于您如何返回真或假,而第二个比它应该的更复杂。我不知道你如何从服务器端处理这个东西,但也许这段代码是你需要的:

http://blog.netgloo.com/2014/06/03/adding-recaptcha-validator-to-jquery-validate/

这对我很有用!

于 2014-06-03T20:51:25.163 回答
0

好吧,终于明白了(尽管它可能是一种解决方法)。这是新的addMethod

jQuery.validator.addMethod("checkCaptcha", function() {
 var bfr = false;
 var phpquery = $.ajax({url:"verify.php",
  type: "POST",
  async: false,
  data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()},
  complete:function(resp) {
    if(resp.responseText.indexOf("false")>=0){
     Recaptcha.reload();
    }else{
     bfr = true;
    }
  }
 });
if(bfr){
   return true;
 }
},"");

我还添加了onkeyup:false,onclick:falseonfocusout:falseto validate()。这似乎完成了工作。

于 2013-08-11T02:16:45.117 回答
-1

这是我特别关于“使用 AJAX 请求验证验证码”的想法。

在表单中添加验证码的主要原因是为了验证提交表单的是机器人还是人类。所以即使其他字段有错误,在成功提交验证码后,我们显然知道这是人为的。因此,在第一次成功后删除验证码字段是完全可以的(请刷新验证码直到成功)。然后可以照常处理其他字段。

有异议吗?

于 2014-01-11T10:30:02.723 回答