" Google ReCAPTCHA(v2) "をform
で「必須」にする方法を知っている人はいますか?
再入力が完了するまでフォームを送信しないことを意味しますか?
私はフォームでParsleyJsを使用していますが、div
sで動作させる方法が見つかりませんでした...
ReCaptcha検証応答コールバックを使用する必要があります。このようなもの: <script src='https://www.google.com/recaptcha/api.js?onload=reCaptchaCallback&render=explicit'></script>
var RC2KEY = 'sitekey',
doSubmit = false;
function reCaptchaVerify(response) {
if (response === document.querySelector('.g-recaptcha-response').value) {
doSubmit = true;
}
}
function reCaptchaExpired () {
/* do something when it expires */
}
function reCaptchaCallback () {
/* this must be in the global scope for google to get access */
grecaptcha.render('id', {
'sitekey': RC2KEY,
'callback': reCaptchaVerify,
'expired-callback': reCaptchaExpired
});
}
document.forms['form-name'].addEventListener('submit',function(e){
if (doSubmit) {
/* submit form or do something else */
}
})
ParsleyJS の場合、少しの回避策を実行します。
1.次のように、data-parsley-required="true"
、value = ""
を使用して非表示の入力フィールドを追加します。
<input id="myField" data-parsley-errors-container="#errorContainer" data-parsley-required="true" value="" type="text" style="display:none;">
2.エラーコンテナを追加します(g-recaptcha
divのすぐ下または下):
<span id='errorContainer'></span>
3. jsコードのどこかにこの単純な関数を追加します。
function recaptchaCallback() {
document.getElementById('myField').value = 'nonEmpty';
}
4.カスタム関数の値を含む属性data-callback
を追加します。
<div class="g-recaptcha" data-sitekey="***" data-callback="recaptchaCallback"></div>
ここで別の実用的な例を見つけることができます: https://codepen.io/reactionmedia/pen/JVdmbB
この例では、フォーム内に2つのHTML要素を作成します。
<div id="botvalidator"></div>
<div id="captchaerrors"></div>
botvalidatorには、「ロボットではない」チェックボックスが内部にあるgoogle recaptcha iframeが含まれます。 captchaerrorsは、ユーザーが「私はロボットではない」チェックボックスをクリックしていないことを確認した後にエラーを含みます。
重要:以前のDOM新しいノードの挿入の検証が有効ではなくなったため、google recaptchaがDOMに新しいg-recaptcha-response textarea要素を追加するタイミングを知るために、arrival.jsライブラリを使用しています。このイベントは、recaptchaがページに数分間読み込まれた後に発生します。
次の場所からreceive.jsライブラリをダウンロードできます https://github.com/uzairfarooq/arrive/
または、CDNプロバイダーから直接挿入します。例: https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js
エラーを回避するために、JQUERYライブラリをロードした後は、必ずすべてのライブラリを挿入してください。私はJquery 2.2.4バージョンを使用しています
<script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
もう1つの重要なことは、recaptchaライブラリをこの方法でロードすることを覚えておいてください。これは、recaptchaのロード後にonloadCallback関数を実行し、recaptchaを「手動で」レンダリングするためです。
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"></script>
コードスニペットは次のとおりです。
var onloadCallback = function() {
/**
* If we try to load page to show the congrats message we don't need to load recaptcha.
*/
if($("#botvalidator").length > 0) {
grecaptcha.render('botvalidator', {
'sitekey' : '6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI',
'callback': cleanErrors
});
addCaptchaValidation();
/**
* We are going to use arrive library in order to check new google recaptcha
* element added after the current one is expired and then we will create new attributes for that element.
* Expires-callback google recaptcha is not working, probably it is executed before element creation.
* https://github.com/uzairfarooq/arrive/
*/
$(document).arrive("#g-recaptcha-response", function() {
// 'this' refers to the newly created element
addCaptchaValidation();
});
}
};
/** We are going to remove all errors from the container. */
var cleanErrors = function() {
$("#captchaerrors").empty();
};
var addCaptchaValidation = function() {
console.log("Adding captcha validation");
cleanErrors();
$('#myform').parsley().destroy();
$('#g-recaptcha-response').attr('required', true);
// We are going to create a new validator on Parsley
$('#g-recaptcha-response').attr('data-parsley-captcha-validation', true);
$('#g-recaptcha-response').attr('data-parsley-error-message', "We know it, but we need you to confirm you are not a robot. Thanks.");
$('#g-recaptcha-response').attr('data-parsley-errors-container', "#captchaerrors");
$('#myform').parsley();
};
/** We are going to add a new Parsley validator, this validation is called from
#g-recaptcha-response after clicking the submit button*/
window.Parsley.addValidator('captchaValidation', {
validateString: function(value) {
if(debug) console.log("Validating captcha", value);
if(value.length > 0) {
return true;
} else {
return false;
}
},
messages: {en: 'We know it, but we need you to confirm you are not a robot. Thanks.'}
});
<html>
<head>
</head>
<body>
<h1>Parsley and Google Recaptcha Example</h1>
<form id="myform">
Full name
<input type="text" name="name" id="name" data-parsley-required="true">
<br/>
<div id="botvalidator"></div>
<div id="captchaerrors"></div><br/>
<input type="submit" value="Submit Form">
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/parsley.js/2.8.2/parsley.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/arrive/2.4.1/arrive.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"></script>
</body>
</html>
それはすべての人々です。
ルールを作成 https://laravel.com/docs/5.7/validation#custom-validation-rules
それをコントローラーで使用します
// validation
$this->validate( $request, array(
'g_recaptcha_response' => ['required', 'string', new Captcha()]
));