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()
を試しますが、結果はありません。
何か案が?
grecaptcha.reset()
メソッドは、オプションの_widget_id
_パラメーターを受け入れ、指定されていない場合はデフォルトで作成された最初のウィジェットになります。 _widget_id
_は、作成された各ウィジェットのgrecaptcha.render()
メソッドから返されます。したがって、このIDを保存し、それを使用して特定のウィジェットをリセットする必要があります。
_var widgetId = grecaptcha.render(container);
grecaptcha.reset(widgetId);
_
こちらを参照 。
間違ったIDを渡しています。
$('.g-recaptcha', form).attr('id');
セレクタは20個のreCaptchaウィジェットすべてをキャプチャしますが、単一のDOM ID(最初のreCaptcha)のみを返します。したがって、コードは実際に最初のレカプチャをリセットしています。
コードを編集して、動的なウィジェットを作成するだけです。
<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 success:response
grecaptcha.reset(widgetId+id);
ここで、idは、以下のforループから生成されるものと同じです。