reCAPTCHA has already been rendered in this element

I have a simple contact form built with ASP .Net using the updatepanel. Everything works as expected but i see the error

recaptcha__en.js: Uncaught Error: reCAPTCHA has already been rendered in this element

in the console window

<asp:ScriptManager runat="server"> </asp:ScriptManager> <script src="" async defer></script> <asp:UpdatePanel runat="server"> <ContentTemplate> <div></div> </ContentTemplate> </asp:UpdatePanel> <script language="javascript" type="text/javascript"> function pageLoad() { $('.g-recaptcha').each(function (index, obj) { grecaptcha.render(obj, { 'sitekey': 'XXXX' }); }); } </script> 

I initially added onload=pageLoad&render=explicit as if the captcha was not checked and you clicked the button to send, the captcha disappeared. Adding onload=pageLoad&render=explicit to the script line resolved this but now i get the above error.

If i try and remove some elements then something else breaks i.e. captcha doesnt display or is not displayed on postback?

4

5 Answers

I had the same problem a couple days ago with a dynamic login and creation form. The reason was that I was rendering twice at the same element.

The Google ReCaptcha Throws an exception notifying said problem.

My solution was use try{...}catch(event){...} as wrapper for grecaptcha.render()

try{ grecaptcha.render('elementID', { 'sitekey' : 'key', 'badge' : 'att', 'size' : 'att', 'tabindex' : 0, 'callback' : function(token) { //.. }, 'expired-callback' : function() { //... }, 'error-callback' : function() { //... }, 'isolated' : false }); }catch(error){/*possible duplicated instances*/}` 
1

For those who are using React with Firebase and in case this error occurs, you just have to destroy the instance of Recaptcha on unmount of your component.

useEffect(() => { const verifier = new firebase.auth.RecaptchaVerifier(element.current, { size: "invisible", }); if (!recaptcha) { verifier.verify().then(() => setRecaptcha(verifier)); } return () => { verifier.clear() } }); 
2

If you use Angular with firebase, you must destroy the RecaptchaVerifier after use

//if for example you have declared it as such: recaptchaVerifier: firebase.default.auth.RecaptchaVerifier; //you can destroy it as such: this.recaptchaVerifier.clear() //you must do for example the destruction when you navigate to a new component 
if (!window.recaptchaVerifier) { window.recaptchaVerifier = new RecaptchaVerifier('sign-in-button', { 'size': 'invisible', 'callback': (response) => { console.log(response) }, 'expired-callback': () => { } }, auth); } 

fix it by adding if()

For angular users, try the google recaptcha v2 using the site key in a try and catch block.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like