javascript 仅在React应用程序的特定页面上显示Google Recaptcha V3 floater

r6l8ljro  于 2023-04-04  发布在  Java
关注(0)|答案(4)|浏览(163)

我用多个# routes和GoogleRecaptchaV 3编写了React应用程序,
我想在特定的页面上显示recaptcha浮动(#路由),如登录和表单。
如何实现这一点。
尝试过-

.grecaptcha-badge { 
    visibility: hidden;
}
#root #mainContainer .login:not(.empty) +  div>.grecaptcha-badge { 
    visibility: visible;
}
.grecaptcha-badge { 
    visibility: hidden;
}
#root #mainContainer .login ~ div>.grecaptcha-badge { 
    visibility: visible;
}

在google recaptcha呈现之前,通过javascript〉componentWillMount -〉page的componentWillmount调用显示隐藏,因此它不会获取元素

j5fpnvbx

j5fpnvbx1#

我(和其他许多人一样)也有同样的问题。
在我的例子中,我使用react-route,在那里我可以监听路径的变化。所以我最终删除了脚本和徽章元素的页面上,我不需要它,并添加它(如果必要的话)在某些路径。

const loadRecaptcha = () => {
    const script = document.createElement("script");

    script.src = "https://www.google.com/recaptcha/api.js?render=lalala";
    script.id = 'recaptcha-script';
    script.async = true;

    document.body.append(script);
}

const removeRecaptcha = () => {
    const script = document.getElementById('recaptcha-script');
    if (script) {
        script.remove();
    }

    const recaptchaElems = document.getElementsByClassName('grecaptcha-badge');
    if (recaptchaElems.length) {
        recaptchaElems[0].remove();
    }
}

希望它能在未来帮助某人

cwdobuhd

cwdobuhd2#

在组件外声明以下内容:

const toggleCaptchaBadge = (show: boolean) => {
  const badge = document.getElementsByClassName('grecaptcha-badge')[0];
  if (badge && badge instanceof HTMLElement) {
    badge.style.visibility = show ? 'visible' : 'hidden';
  }
};

内部调用这个useEffect钩子:

useEffect(() => {
    toggleCaptchaBadge(true);
    return () => toggleCaptchaBadge(false);
  }, []);
sd2nnvve

sd2nnvve3#

如果我们希望有条件地删除react应用中的Google reCAPTCHA,我们可以使用CDM()生命周期方法:
1.删除脚本
1.移除reCAPTCHA徽章
我用的是react-google-recaptcha-v3,检查GoogleReCaptchaProvider的类,可以找到scriptId,和上面Ivan Yulin提到的完全一样。

const script = document.querySelector(scriptId);
        if (script) {
            script.remove();
        }
        const recaptchaElems = document.getElementsByClassName('grecaptcha-badge');
        if (recaptchaElems.length) {
            recaptchaElems[0].remove();
        }

但是,即使删除了脚本,我在DOM中看到的脚本

<script id="google-recaptcha-v3" src="https://www.google.com/recaptcha/api.js?render=*********"></script>

我们如何才能把这个也去掉呢?

frebpwbc

frebpwbc4#

我找到了一个不需要使用css样式的解决方案,这样如果不应该使用google验证码,它就不会被渲染。

1.在nextjs app的根文件中声明:

const router = useRouter();
const [
  showRecaptcha,
  setShowRecaptcha,
] = useState(false);

useEffect(() => {
  setShowRecaptcha((router.pathname === '/contact'));
}, [router.pathname]);

1.然后简单地对<Component {...pageProps} />使用条件渲染:

{showRecaptcha ? <GoogleReCaptchaProvider
  reCaptchaKey={process.env.NEXT_PUBLIC_RECAPTCHA_V3_SITE_KEY}
  scriptProps={{
    async: false,
    defer: true,
    appendTo: "body",
    nonce: undefined,
  }}
  container={{
    parameters: {
      theme: "dark",
    }
  }}
>
  <Component {...pageProps} />
</GoogleReCaptchaProvider>
:
  <Component {...pageProps} />
}

这意味着google验证码只会在你浏览到/contact路由时才能显示和工作,你可以在这里输入任何你想要的路由。

相关问题