Google ReCAPTCHA, как это сделать?

Кто-нибудь знает, как сделать "Google ReCAPTCHA (v2)" обязательным" в form?

Я имею в виду отсутствие представления формы до тех пор, пока recaptcha не будет заполнен?

Я использую ParsleyJs в своей форме, но не нашел способ заставить его работать с div s...

Ответ 1

Вы должны использовать ответ проверки ответа 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 */
    }
})

Ответ 2

Для 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>

Ответ 3

Вы можете найти другой рабочий пример здесь: https://codepen.io/reactionmedia/pen/JVdmbB

Для этого примера я собираюсь создать два элемента HTML внутри формы:

<div id="botvalidator"></div>
<div id="captchaerrors"></div>

Botvalidator будет содержать встроенную рамку Google Reaptcha с флажком "Я не робот". captchaerrors будет содержать ошибки после проверки того, что пользователь не установил флажок "Я не робот".

ВАЖНО: мы используем библиотеку Arrive.js, чтобы узнать, когда gap recaptcha добавляет новый элемент textarea g-recaptcha-response в DOM, потому что предыдущие проверки вставки нового узла DOM больше не действительны. Это событие произойдет после того, как recaptcha будет загружен на страницу в течение нескольких минут.

Вы можете скачать библиотеку Arri.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>

Другая важная вещь - помнить загрузку библиотеки recaptcha таким образом, чтобы выполнить функцию onloadCallback после загрузки recaptcha и отобразить 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>