我尝试在我的一个表单中实现reCAPTCHA,但是我使用ajax作为提交。 (更具体地说是原型ajax.updater)
一旦我提交并错误检查我的表单,我尝试加载reCAPCHTA小部件(在我更新的div元素中),它基本上只调用一个javascript文件:
<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=6Le6SwUAAAAAAIWm8wCRFd8SrI-H0R1Yx4Tkw2Ks"></script>
然而JS文件没有被读取?...我已经尝试了evalScripts的所有组合:true和evalJS:'force'等在ajax.updater .....但是我不认为我非常了解为什么js文件没有处理:(
如果有人能对这个问题有所了解,我将非常感激。
谢谢,安德鲁
答案 0 :(得分:17)
这并不能解决您的确切问题,但“Dark Side of the Carton”有一些优秀的代码可以通过jQuery AJAX验证reCAPTCHA,这可能有所帮助。
总结:
添加以下Javascript:
$(function() {
function validateCaptcha() {
var challengeField = $('input#recaptcha_challenge_field').val(),
responseField = $('input#recaptcha_response_field').val();
// alert(challengeField);
// alert(responseField);
// return false;
var html = $.ajax({
type: 'POST',
url: 'ajax.recaptcha.php',
data: "recaptcha_challenge_field=" + challengeField + "&recaptcha_response_field=" + responseField,
async: false
}).responseText;
if (html.replace(/^\s+|\s+$/, '') == "success") {
$('#captchaStatus').html(' ');
// Uncomment the following line in your application
return true;
} else {
$('#captchaStatus').html(
'Your captcha is incorrect. Please try again'
);
Recaptcha.reload();
return false;
}
}
// Modified as per comments in site to handle event unobtrusively
$('#signup').submit(function() {
return validateCaptcha();
});
});
然后添加ajax.recaptcha.php文件,其中:“如果验证码匹配则只输出单词”success“,如果失败则输出来自reCaptchta的响应。这很重要因为我们正在寻找成功这个词我们的validateCaptcha()函数。“
require_once('/inc/recaptchalib.php');
$publickey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // you got this from the signup page
$privatekey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$resp = recaptcha_check_answer(
$privatekey,
$_SERVER['REMOTE_ADDR'],
$_POST['recaptcha_challenge_field'],
$_POST['recaptcha_response_field']
);
if ($resp->is_valid) {
?>success< ?
} else {
die(
"The reCAPTCHA wasn't entered correctly. Go back and try it again." .
"(reCAPTCHA said: " . $resp->error . ")"
);
}
示例是在PHP中,但我很容易使用它来使用Zope / Python
答案 1 :(得分:4)
小心使用任何类型的客户端脚本(例如JavaScript)进行验证。您无法控制最终用户的浏览器。 CAPTCHA的目的是防止自动提交表单。任何足以完成设置的人都不会有覆盖JavaScript验证和CAPTCHA检查的问题。例如,他们可以将validateCaptcha()设置为始终返回true,绕过仔细检查 - 或者只是禁用JavaScript。
话虽如此,使用ajax执行整个表单提交并使用CAPTCHA检查的结果确定表单是否得到处理没有任何问题。
重要的一点是,是否处理表单的决定必须在服务器端而不是客户端进行。
答案 2 :(得分:1)
回答我自己的问题......
有一个reCAPTCHA AJAX api ....这是解决这个问题的简单方法:
另外,.. http://www.prototypejs.org/api/ajax/updater网站上的文档.....谈论evalscript选项以及如何通过本机eval()函数放置任何javascript ....哪种螺丝我试图用WMD实现错误检查......但这是另一个故事。
安德鲁
答案 3 :(得分:0)
如果这是您正在使用的文字代码段,则表示您尚未关闭代码...因此无法对其进行评估。
答案 4 :(得分:0)
致电Recaptcha.reload();在Ajax代码中的回调事件中,每次Ajax提交时都会重新加载新的Recapcha
答案 5 :(得分:0)
嗨朋友我找到了答案
https://developers.google.com/recaptcha/docs/display?hl=es#AJAX
在此如何验证
http://blog.reaccionestudio.com/comprobar-recaptcha-con-ajax-usando-jquery/
成功
答案 6 :(得分:-1)
在使用jQuery的reCaptcha
方法加载到页面中时,我遇到了类似的问题。.load()
可以很好地播放。这是一个有新颖解决方案的页面:http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/
基本上,reCaptcha API使用document.write方法显示reCaptcha。当你得到jQuery invloved时,这将无法正常工作。使用此PHP代码代替加载recaptcha.js
<?php
$api = file_get_contents('http://www.google.com/recaptcha/api/js/recaptcha_ajax.js');
$api = str_replace('document.write','$("body").append',$api);
echo $api;
?>
它只是查找document.write并将其替换为$(selector).append
。
让我的实施工作。