laravelアプリケーションでrecaptchaを使用しています。
私はjqueryを使用してフォーム送信でrecaptchaの応答を確認し、プリーツがcaptchaを検証するアラートでユーザーを停止したいだけです。
しかし、キャプチャが入力されていなくても、フォームの送信を停止できませんでした。
これが私のコードです。
$('#payuForm').on('submit', function (e) {
var response = grecaptcha.getResponse();
if(response.length == 0 || response == '' || response ===false ) {
alert('Please validate captcha.');
e.preventDefault();
}
});
<div class="captcha">
{{ View::make('recaptcha::display') }}
</div>
ブラウザコンソールでこのエラーが発生し、フォームが送信されます。
Error: ReCAPTCHA placeholder element must be empty
Google recaptchaライブラリを2回ロードしています。
ライブラリを2回ロードしています
選んだ
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
または
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
私は、Recaptchaとの統合が組み込まれているWordpress用のContactForm7を使用しています。また、同じrecaptchaライブラリを使用するBWP Recaptchaプラグインもあります。アクティベーションキーを誤って両方に追加したため、jsライブラリが2回読み込まれました。 CF7プラグインからキーを削除すると、エラーはなくなりました。
WARNING: Tried to load angular more than once.
AngularJsでは、このエラーによりこのような問題が発生します。jqueryも同様に確認できます。
ダイナミックを含む必要がある場合は、ページの各キャプチャに対してこれをyouseします:
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
async defer>
</script>
<div class="g-recaptcha"></div>
<script>
var onloadCallback = function() {
//remove old
$('.g-recaptcha').html('');
$('.g-recaptcha').each(function (i, captcha) {
grecaptcha.render(captcha, {
'sitekey' : 'your key'
});
});
};
</script>
しかし、遅いです。最初のページですべてのrecaptchaを定義することもできます。 https://developers.google.com/recaptcha/docs/display
空でない要素にreCaptchaをレンダリングしようとしたときにこのエラーが発生しました
<div class="g-recaptcha" data-sitekey="{{ env('GOOGLE_RECAPTCHA_SITE_KEY') }}">
<div class="form-group">some element inside reCaptcha container</div>
</div>
reCaptchaプレースホルダー要素は空でなければなりません
<div class="g-recaptcha" data-sitekey="{{ env('GOOGLE_RECAPTCHA_SITE_KEY') }}"></div>