谷歌reCaptcha重置不起作用

qua*_*rky 26 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>
Run Code Online (Sandbox Code Playgroud)

加载小部件

<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>
Run Code Online (Sandbox Code Playgroud)

提交表格后:

var id = $('.g-recaptcha', form).attr('id');
grecaptcha.reset(id);
Run Code Online (Sandbox Code Playgroud)

表单是提交表单的实例.

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

任何的想法?

lev*_*evi 41

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

var widgetId = grecaptcha.render(container);
grecaptcha.reset(widgetId);
Run Code Online (Sandbox Code Playgroud)

看到这里.

  • 为了防止任何人要检查ID,它是一个从零开始的索引.因此,如果小部件存在,``(!widgetId)``可能为false. (4认同)
  • 要回答Oleg,它是一个从零开始的索引,因此第一个recaptcha小部件将始终返回0作为ID.它运作正常. (2认同)