I am using Google ReCaptcha v2 which I am integrating it for the registration process. So, when the user goes /register, it loads the RegisterComponent.
However, the reCaptcha won't load when say I'm in Homepage and navigate to the /register via a button. Why is it happening?
I am loading the script in layouts.master.php:
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
And loading the reCaptcha in Register Component like so:
<div class="field">
<div class="control" id="recaptcha-reg">
<div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
<span v-if="regErrors.captcha" v-for="error in errors">{{ error }}</span>
</div>
</div>
This reCaptcha is then validated using PHP. So, there's no JS Logic! Please help!
If anyone is having the same problem, here's how to solve it:
setTimeout to render the widget.Example:
<div id="recaptcha-main" class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
And then in your component where you want to load the captcha:
created() {
setTimeout(() => {
grecaptcha.render('recaptcha-main'); // 'recaptcha-main' is the id that was assigned to the widget
}, 2000);
}
That's it!
UPDATED - THE BEST APPROACH
Instead of using setTimeout, use nextTick() instead which basically runs only after the view incl. the children are finished loading.
You assign the id and then run this inside of your created hook:
this.$nextTick(function () {
grecaptcha.render('recaptcha-main');
})
The drawback of setTimeout is it runs only after the specified time. Say 1 second for example. So, if your component takes >1 second to load fully, then the setTimeout may not work here as it will be executed immediately after 1 second.
I hope this works for you :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With