如何在用户提交无效输入后重新加载google recaptcha小部件

Mat*_*man 31 javascript ruby-on-rails recaptcha

我有一个注册表单,上面有新的google recaptcha小部件.当用户提交信息时,我们使用javascript检查验证并将问题返回到页面(例如:"请使用有效的电话号码").但是,由于页面没有重新加载,当用户输入正确的信息并再次提交时(无需再次进行重新记录)... recaptcha不再有效,他们无法在不重新加载页面的情况下提交.

有一个很好的解决方案吗?我可以以某种方式重新加载小部件吗?我试过grecaptcha.render,但它并没有真正做任何事情.

编辑:

当我尝试再次渲染窗口小部件时,它说"占位符元素必须为空"

我试着清空似乎有用的元素($('.g-recaptcha').empty();)然后渲染但它仍然抛出相同的错误.

小智 38

你正在寻找的方法是 grecaptcha.reset()

但是,为了使此功能起作用,您必须显式地呈现reCaptacha,如下所示: <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>

  • 我有这个方法的错误无效的ReCAPTCHA客户端ID:未定义 (4认同)
  • 如果这些信息出现在谷歌官方文档中,那么这些信息将会有所帮助......但是没有选项可以向Google提供有关其文档的反馈....很遗憾. (4认同)
  • 作为一个补充说明 - 如果你想重置一个特定的recaptcha(如果你在一个页面上有多个recaptcah,你可以通过应用每个验证码的变量名称来实现这一点,如同`grecaptcha.reset(captcha1)` (2认同)

Waq*_*leh 8

我只能通过使用:

grecaptcha.reset();
Run Code Online (Sandbox Code Playgroud)


Déj*_*dić 7

如果您正在使用带有jQuery的grecaptcha.render,请确保您实际设置DOM元素,而不是jQuery元素:

有效:

grecaptcha.render( $('.g-recaptcha')[0], { sitekey : 'your_key_here' });
Run Code Online (Sandbox Code Playgroud)

但这不会:

grecaptcha.render( $('.g-recaptcha'), { sitekey : 'your_key_here' });
Run Code Online (Sandbox Code Playgroud)


Yac*_*ine 7

Personnaly我重置了我的元素html内容

$('#captcha').html('');
Run Code Online (Sandbox Code Playgroud)

之后我重新加载recaptcha

$.getScript("https://www.google.com/recaptcha/api.js");
Run Code Online (Sandbox Code Playgroud)

加载重新收回你的内容

<div id="captcha" class="g-recaptcha" data-sitekey="yourSitePublicKey"></div>
Run Code Online (Sandbox Code Playgroud)


Mik*_*ear 6

这是@ tzafar回答的一些代码:

var myCaptcha = null;
function prepCaptcha() {
    if (myCaptcha === null)
        myCaptcha = grecaptcha.render(document.getElementById('my-captcha'), {
            'sitekey': myCaptchaKey,
            'theme': 'light'
        });
    else
        grecaptcha.reset(myCaptcha);
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,my-captchadiv一个Bootstrap模态内部的id .我prepCaptcha()在模态shown.bs.modal事件的事件处理程序中运行.第一次,它初始化验证码.在随后的模态显示中,它会重置它.

另请注意,您可以通过打印已完成的验证码的值来快速验证您是否获得了新的验证码:

console.log(grecaptcha.getResponse(myCaptcha));
Run Code Online (Sandbox Code Playgroud)

您不应该两次看到相同的值.