使用ReCaptcha和jQuery Validate,给出正确的响应,但会出错

我正在使用jQueryvalidation和我的网站的注册表单,底部有一个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

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

我知道verify.php工作正常,因为当

action="verify.php,"一切都会完美运行(即告诉你是否输入了正确的reCaptcha,无论你尝试了多少次)。

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

.validate()使用onkeyup: false选项。

否则,每次键入一个字母时,它都会运行checkCaptcha方法并将不完整的Captcha代码发送到服务器。 我相信一旦发送了错误的validation码,它现在已过期,您无法再次发送相同的代码。

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

 $('#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." } } }); 

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

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

第一个addMethodvalidation器的问题是关于如何返回true或false,第二个比它应该更复杂。 我不知道你是如何从服务器端处理这个东西但是这个代码可能是你需要的:

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

这对我很有用!

好吧,终于明白了(虽然它可能只是一个解决方法)。 这是新的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:falseonclick:false ,以及onfocusout:falsevalidate() 。 这似乎完成了工作。

以下是关于“ 使用AJAX请求validationvalidation码 ”的想法。

在表单中添加validation码的主要原因是validation是否是提交表单的机器人或人员。 所以,即使其他领域有错误,在成功提供validation码后,我们知道它是人类。 因此,在第一次成功后删除validation码字段是完全没问题的(请刷新validation码直到成功)。 通常可以处理其他字段。

有异议吗?