How can I make reCAPTCHA a required field?

前端 未结 7 1213
闹比i
闹比i 2020-12-01 05:34

I\'m using Google reCAPTCHA and have been able to add the CAPTCHA component to my page inside a form. But when I submit the form there\'s no validation taking place to check

相关标签:
7条回答
  • if you want to use the native html5 popups, than here is the solution

    JavaScript:

    window.onload = function() {
        var $recaptcha = document.querySelector('#g-recaptcha-response');
    
        if($recaptcha) {
            $recaptcha.setAttribute("required", "required");
        }
    };
    

    CSS:

    #g-recaptcha-response {
        display: block !important;
        position: absolute;
        margin: -78px 0 0 0 !important;
        width: 302px !important;
        height: 76px !important;
        z-index: -999999;
        opacity: 0;
    }
    
    0 讨论(0)
  • 2020-12-01 05:52

    Not sure if you already solved this, but you could use an addon to validate the Google recaptcha: http://formvalidation.io/addons/recaptcha2/

    0 讨论(0)
  • 2020-12-01 05:53

    I had the same problem as yours and solved it this way:

    First declare a variable that stores 1 or 0 depending or whether the user filled the capcha correctly.

    var allowSubmit = false;
    

    Then you need a function which gets executed when the user fills the reCapcha correctly:

    function capcha_filled () {
        allowSubmit = true;
    }
    

    ... and a function that gets executed when the reCapcha session expires:

    function capcha_expired () {
        allowSubmit = false;
    }
    

    To tell reCapcha about your functions (callbacks), set those data-attributes in your html:

    <div class="g-recaptcha"
       data-callback="capcha_filled"
       data-expired-callback="capcha_expired"
       data-sitekey="your site key"></div>
    

    Or if you use explicit load:

      var onloadCallback = function() {
        grecaptcha.render('your_div_id', {
          'sitekey' : 'your_site_key',
          'callback': capcha_filled,
          'expired-callback': capcha_expired,
        });
      };
    

    You need also a callback for the form submission:

    function check_if_capcha_is_filled (e) {
        if(allowSubmit) return true;
        e.preventDefault();
        alert('Fill in the capcha!');
    }
    

    Finally add in the form the onsubmit attribute:

    <form action="..." onsubmit="check_if_capcha_is_filled">
    

    Note: as mentioned in the comments, a server validation is still needed. The code prevents accidentally submitting the form unless the capcha is filled and is only for user's convenience.

    0 讨论(0)
  • 2020-12-01 05:59

    I checked for existance of #g-recaptcha-response:

    function checkRecaptcha() {
        res = $('#g-recaptcha-response').val();
    
        if (res == "" || res == undefined || res.length == 0)
            return false;
        else
            return true;
    }
    
    //...
    
    $('#frm-signup').submit(function(e) {
    
        if(!checkRecaptcha()) {
            $( "#frm-result" ).text("Please validate your reCAPTCHA.");
            return false;
        }
        //...
    });
    

    This really should be part of the docs...

    0 讨论(0)
  • 2020-12-01 05:59

    If you want a more friendly and descriptive message, you can add a required checkbox. This will ensure the html5 popup shows something like: "Please check this box if you want to proceed"

    <div class="captcha">
       <div class="g-recaptcha" data-sitekey="Your Site Key" data-callback="removeFakeCaptcha"></div>
       <input type="checkbox" class="captcha-fake-field" tabindex="-1" required>
    </div>
    

    Add the code to remove the fake captcha once completed

    window.removeFakeCaptcha = function() {
       document.querySelector('.captcha-fake-field').remove();
    }
    

    Then on the css you hide the checkbox and position it to the captcha box:

    .captcha {
      position: relative;
    }
    .captcha-fake-field {
      background: transparent;
      bottom: 0;
      border: none;
      display: block;
      height: 1px;
      left: 12px;
      width: 1px;
      position: absolute;
      z-index: -1;
    }
    
    0 讨论(0)
  • 2020-12-01 06:01

    I find this very helpful:

    <div class="g-recaptcha myPopover" data-sitekey="Your Key" 
            data-callback="recaptchaCallback">
    

    You add a function to data-callback="recaptchaCallback" with this code:

    var recaptchachecked=false; 
    function recaptchaCallback() {
        recaptchachecked = true;
    }
    

    and a function were you return the value to use it in a other html-tag like this:

    <form method="post" onsubmit="return isreCaptchaChecked()">
    function isreCaptchaChecked()
    {
        return recaptchachecked;
    }
    

    I hope this helps you.

    0 讨论(0)
提交回复
热议问题