谷歌reCaptcha重置不起作用

时间:2015-05-04 20:07:11

标签: javascript ajax reload reset recaptcha

我想通过AJAX提交表单时重置Google reCaptcha小部件,并发送一些输入错误或表单。我在同一页面上使用多个小部件,因此我明确地呈现这些小部件。

我的HTML代码:

<div class="g-recaptcha" id="recaptcha-1"></div>
<div class="g-recaptcha" id="recaptcha-2"></div>
...
<div class="g-recaptcha" id="recaptcha-20"></div>

加载小部件

<script src="https://www.google.com/recaptcha/api.js?onload=reCaptchaCallback&render=explicit&hl=en" async defer></script>
<script>
    var reCaptchaCallback = function() {
        var elements = document.getElementsByClassName('g-recaptcha');
        for (var i = 0; i < elements.length; i++) {
            var id = elements[i].getAttribute('id');
            grecaptcha.render(id, {
                'sitekey' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
            });
        }
    };
</script>

提交表格后:

var id = $('.g-recaptcha', form).attr('id');
grecaptcha.reset(id);

表单是提交表单的实例。

正确填写表单时,一切正常。但reCaptcha不会重置或重新加载。 它会尝试grecaptcha.reset(),但没有结果。

有什么想法吗?

5 个答案:

答案 0 :(得分:39)

grecaptcha.reset()方法接受可选的widget_id参数,默认为未指定时创建的第一个小部件。对于创建的每个窗口小部件,从widget_id方法返回grecaptcha.render()。因此,您需要存储此ID,并使用它来重置该特定小部件:

var widgetId = grecaptcha.render(container);
grecaptcha.reset(widgetId);

See here

答案 1 :(得分:0)

您传递的是错误的ID。

$('.g-recaptcha', form).attr('id');

你的选择器将捕获所有20个reCaptcha小部件,但只返回一个DOM id(第一个reCaptcha)。所以你的代码实际上正在重置第一次重访。

答案 2 :(得分:0)

刚刚编辑了代码以创建动态窗口小部件。

<script>
    var reCaptchaCallback = function() {
        var elements = document.getElementsByClassName('g-recaptcha');
        for (var i = 0; i < elements.length; i++) {                
            widgetId+i = grecaptcha.render('recaptcha-'+i, {
                'sitekey' : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
            });
        }
    };
</script>

成功完成上述任务后,更改AJAX成功:响应

grecaptcha.reset(widgetId+id);

这里的id与下面为Loop生成的id相同。

答案 3 :(得分:0)

我在同一页面中有两个Google验证码,两种格式不同

<form id="form1">    
<input type="text" name="form1-input">
<div class="g-recaptcha" data-sitekey="XXXXXXXXXXXXXXXXX"></div>
</form>

<form id="form2">    
<input type="text" name="form2-input">
<div class="g-recaptcha" data-sitekey="XXXXXXXXXXXXXXXXX"></div>
</form>

您可以通过

重设首个验证码
 grecaptcha.reset(); or grecaptcha.reset(0);

和第二个验证码按索引(1)

grecaptcha.reset(1);

答案 4 :(得分:0)

我遇到了一个问题,页面上有多个 recaptcha,有些被隐藏了。在这种情况下,我不得不遍历所有这些并像这样重置它们:

                var count = 0;
                $(".g-recaptcha").each(function () {
                    grecaptcha.reset(count);
                    count++;
                });