Проверка формы HTML5 перед reCAPTCHA
я интегрировал новую скрытую структуру reCAPTCHA (v2), которая по умолчанию проверяет пользователя с помощью click
событие кнопки отправки. Но это событие запускается перед встроенной проверкой формы HTML5. Я ищу способ сделать это в ожидаемом порядке: сначала проверка формы, затем рекапча.
5 ответов
вы должны сделать это программно благодаря новому v2 grecaptcha
способ: grecaptcha.execute()
Так что recaptcha не заменяет событие click кнопки по умолчанию, которое препятствовало проверке формы HTML5 по умолчанию.
путь события:
- отправить нажмите кнопку событие: браузер встроенная проверка формы
- форма отправить событие: вызов
grecaptcha.execute()
- обратный вызов reCAPTCHA: отправьте форма
$('#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 + невидимый 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();
});
})
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
Я хотел того же поведения, но используя новый 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 в глобальном var, в том числе, он использует sendContactForm
в качестве обратного вызова, но при вызове recaptcha он устанавливает var данных с именем passed
, который позволяет форме не быть предотвращенным. Это точно такое же поведение, как обычно recaptcha, но с этим состояние.
Пожалуйста, подумайте об изменении принятого ответа, который ИМХО, это не очень хорошо. Конечно, ничего личного, просто споры. С уважением.