css 如何动态更改Google reCAPTCHA(v2)主题?

2w3rbyxf  于 4个月前  发布在  Go
关注(0)|答案(1)|浏览(88)

我正在开发一个Bootstrap网站,它有亮暗模式,通过JavaScript运行。我已经成功地将Google reCAPTCHA(v2)(我不是机器人)集成到我的项目中。
但我希望能够通过主题切换开关动态更改reCAPTCHA主题。由于文档中有一个属性data-theme,我们可以将值设置为darklight
reCAPTCHA容器的主div位于iframe中,通过它可以通过更改类(rc-anchor-light / rc-anchor-dark)来切换主题。
我尝试从主题切换JavaScript函数中添加和删除类(rc-anchor-light / rc-anchor-dark)来动态更改reCAPTCHA主题,但它不起作用,我无法找出原因。

ufj5ltwl

ufj5ltwl1#

虽然reCAPTCHA v2本身不支持动态主题切换,但这里有一个使用多个reCAPTCHA容器和JavaScript的解决方案:

两个不同主题的reCAPTCHA容器的HTML结构

<div class="rg-recaptcha border rounded hide" id="grecaptchaLight" data-callback="recaptchaVe" data-expired-callback="recaptchaEx" data-theme="light"></div>
<div class="rg-recaptcha border rounded hide" id="grecaptchaDark"  data-callback="recaptchaVe" data-expired-callback="recaptchaEx" data-theme="dark"></div>

字符串

JavaScript:

// Function to determine the preferred theme (light or dark)

function getPreferredThemeFunction() {
    // Implement your logic to determine the preferred theme here
    // This function should return 'light' or 'dark'
}

// Variable to store the preferred theme
var preferredTheme = getPreferredThemeFunction();

// Variables to store the reCAPTCHA widget IDs
var grecaptchaDarkWD, grecaptchaLightWD;

// Variable to track whether reCAPTCHA has been rendered
var gCapthaRendered = false;

// Callback function triggered when reCAPTCHA is loaded
var onloadCallback = function () {
    // Render reCAPTCHA widgets with dark and light themes
    grecaptchaDarkWD = grecaptcha.render('grecaptchaDark', {
        'sitekey': '1234567890',
        'theme': 'dark'
    });

    grecaptchaLightWD = grecaptcha.render('grecaptchaLight', {
        'sitekey': '1234567890',
        'theme': 'light'
    });

    // Mark reCAPTCHA as rendered
    gCapthaRendered = true;

    // If a preferred theme is set, switch to it
    if (preferredTheme) {
        changeReCaptcha(preferredTheme);
    }
};

// Function to dynamically change the reCAPTCHA theme
function changeReCaptcha(theme = 'light') {
    if (gCapthaRendered) {
        // Reset and hide the inactive reCAPTCHA container
        if (theme == 'dark') {
            document.getElementById('grecaptchaLight').innerHTML = "";
            grecaptcha.reset(grecaptchaDarkWD);
            document.getElementById('grecaptchaLight').classList.add("hide");
            document.getElementById('grecaptchaDark').classList.remove("hide");
        } else if (theme == 'light') {
            document.getElementById('grecaptchaDark').innerHTML = "";
            grecaptcha.reset(grecaptchaLightWD);
            document.getElementById('grecaptchaDark').classList.add("hide");
            document.getElementById('grecaptchaLight').classList.remove("hide");
        }
    }
}

相关问题