新しい非表示のreCAPTCHA(v2)フレームワークを統合しました。デフォルトでは、送信ボタンのclick
イベントでユーザーを検証します。ただし、このイベントは組み込みのHTML5フォーム検証の前にトリガーされます。期待どおりの順序で作成する方法を探しています。最初にフォームの検証を行い、次にreCAPTCHAを行います。
新しいv2 grecaptcha
メソッド:grecaptcha.execute()
のおかげで、プログラムでこれを行う必要があります。そのため、recaptchaは、デフォルトのHTML5フォーム検証を妨げていたボタンのデフォルトクリックイベントを置き換えません。
イベントパスは次のとおりです。
grecaptcha.execute()
を呼び出します$('#form-contact').submit(function (event) {
event.preventDefault();
grecaptcha.reset();
grecaptcha.execute();
});
function formSubmit(response) {
// submit the form which now includes a g-recaptcha-response input
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js"></script>
<form action="?">
<div class="g-recaptcha"
data-sitekey="your-key"
data-size="invisible"
data-callback="formSubmit">
</div>
<button type="submit">Submit</button>
</form>
こんにちは、ここで実用的なソリューションを入手しました。目に見えないRecaptchaでの作業。
jQuery(document).ready(function() {
var commentform = jQuery("#commentform");
commentform.on("click", "#submit-comment", function(e) {
if(commentform[0].checkValidity()) {
e.preventDefault();
grecaptcha.execute();
}
});
});
function submitCommentForm(data) {
document.getElementById("commentform").submit();
}
<form action="blaba.php" method="post" id="commentform" class="comment-form">
<div class="form-submit">
<div data-callback="submitCommentForm" data-sitekey="yourkey" class="g-recaptcha" data-size="invisible">
<button id="submit-comment">Leave a comment</button>
</div>
</form>
HTML5検証+ Invisible recaptchaを取得するための私のソリューションは次のとおりです。
HTML:
<form id="my-form">
<!-- Your form fields ... -->
<div class="g-recaptcha"
data-sitekey="..."
data-callback="submitMyForm"
data-size="invisible">
</div>
<button type="submit">Submit</button>
</form>
JS:
var myForm = $('my-form');
function submitMyForm () {
myForm.trigger('submit', [true]);
}
$(function () {
myForm.on('submit', function (e, skipRecaptcha) {
if(skipRecaptcha) {
return;
}
e.preventDefault();
grecaptcha.execute();
});
})
私は同じ動作を望んでいましたが、新しいrecaptchaを使用しました。いくつかのコードを見て、いくつかのものをテストした後、私はこれに取りかかりました。主な違いは、これはデフォルトのブラウザ検証も使用する:
var contact_form;
$(function() {
contact_form = $('#contact-form');
contact_form.submit(function (event) {
if ( ! contact_form.data('passed')) {
event.preventDefault();
grecaptcha.execute();
}
});
});
function sendContactForm(token) {
contact_form.data('passed', true);
contact_form.submit();
}
基本的に、jqueryフォームオブジェクトをグローバル変数に格納します。コールバックとしてsendContactForm
を使用しますが、recaptchaによって呼び出されると、passed
という名前のデータ変数を設定し、フォームを許可します。妨げられないように。これは、recaptchaが通常行うのとまったく同じ動作ですが、その条件があります。
更新:コードを再度見ると、おそらくgrecaptchaの実行後にfalse
に渡されたデータを復元する方法が必要であることを思い出します。これを実装する場合を考慮してください。
let siteKey = "...";
$("form").submit(function (eventObj) {
var myForm = this;
eventObj.preventDefault();
grecaptcha.execute( siteKey, {
action: "submit"
})
.then(function (token) {
$('<input />').attr('type', 'hidden')
.attr('name', "g_recaptcha_response")
.attr('value', token)
.appendTo(myForm);
myForm.submit();
});
});
これにより、recapchaが実行され、応答を待機し、ブラウザが送信しようとしてから実際に送信するときに、非表示属性g_recaptcha_responseを任意のフォームに追加します。グローバル変数siteKeyが必要です
デフォルトのメソッドがhtml5フォーム検証をオーバーライドするように見えるため、この問題が発生しました。また、関数/要素名をハードコーディングするのではなく、すべてのコードを汎用的にしたかった。最後に、v3 apiを使用して次のコードを思い付きました-
HTML
<form method="post" action="?" class="ui-recaptcha" name="my_form_name">
...
<input type="submit" value="Submit">
</form>
<script src="//www.google.com/recaptcha/api.js?render={key}" async defer></script>
Javascript(jQueryを使用していますが、Vanilla jsに簡単に適応できます)
$('.ui-recaptcha').submit(e => {
var form = e.target;
if( $(form).data('recaptcha-done') )
return;
e.preventDefault();
grecaptcha.execute('{key}', {'action': $(form).attr('name')}).then(token => {
$(form).append($('<input>').attr({'type': 'hidden', 'name': 'g-recaptcha-response', 'value': token}));
$(form).data('recaptcha-done', true);
$(form).submit();
});
});
上記のいくつかの例のようにsubmit
を呼び出すだけでループが発生することがわかりました。これは、submit
イベントでrecaptchaハンドラーが実行されるのを見ると意味があります。
これは、任意のui-recaptcha
フォームに対してrecaptchaを実行し、フォームname
属性をreCaptchaコンソールで表示できるアクションとして渡し、トークンをフォームに挿入します。実行されると、フォームのデータ属性が設定されるため、submitの再帰呼び出しはrecaptchaを再度実行しようとしません。