Firebase reCAPTCHA 已在此元素中呈现

Firebase reCAPTCHA has already been rendered in this element

使用 Phone 数字 (JS) 进行 Firebase 身份验证需要强制性 reCAPTCHA verifier,它需要容器的 ID。对于容器的 ID,我生成一个随机的 -

firebase_recaptcha_container: "recaptcha-container",

firebase_recaptcha_reset: function() {
            

            if (typeof appVerifier != "undefined") {
                appVerifier.reset()
                appVerifier.clear()        
            } 
            
            let id = loadJS.firebase_recaptcha_container

            let newID = loadJS.randomString(10)
            $("#"+id).contents().remove()
            $("#"+id).prop("id", newID)
            loadJS.firebase_recaptcha_container = newID
            return newID

        }
        
    

然后请求 RecaptchaVerifier,收到后我将其设置为全局变量 window.appVerifier。

firebase_recaptcha: function(name_r="default") {
            let promiseD = new firebase.auth.RecaptchaVerifier(name_r, {
                'size': 'invisible',
                'callback': function(response) {
                    resolve(response)
                },
                'expired-callback': function(r) {
                    console.log("expired", r)
                },
                'isolated' : false
              });
              
            return promiseD
        },
         
    
_____________________
        
let container_recaptcha = $utils.firebase_recaptcha_reset()

window.appVerifier = await $utils.firebase_recaptcha(container_recaptcha)

这是第一次完全正常。但用户没有使用正确的 phone 号码是一个诚实的错误。所以下一次,我再次做同样的事情并在生成 RecaptchaVerifier 时出错 -

reCAPTCHA has already been rendered in this element

遗憾的是,这没有意义,因为新元素完全不同而且很清楚,在文档之后调用了重置方法。我没有在该页面上使用任何其他 reCaptcha。刷新页面可能是一个可能的解决方案,但我真的很讨厌。任何见解都会有所帮助。

谢谢!

终于找到解决办法了,看来是个愚蠢的错误!

每次调用 firebase.auth.RecaptchaVerifier 都会添加新的 recaptcha 脚本!因此,所有需要做的就是调用它一次,剩下的它自己做。