微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google Recaptcha & Gatsby 错误:reCAPTCHA 占位符元素必须是元素或 ID

如何解决Google Recaptcha & Gatsby 错误:reCAPTCHA 占位符元素必须是元素或 ID

我正在尝试将 recaptcha v2 添加到我的 Gatsby/Netlify 站点表单中,但我错过了实际显示小部件的最后一部分。它只是没有显示它的放置位置。

到目前为止我的代码是这样的

gatsby-ssr.js 文件

import React from "react"

export const onRenderBody = ({ setHeadComponents,setPostBodyComponents }) => {
  setHeadComponents([
    <script
      dangerouslySetInnerHTML={{
        __html: `
        function onloadCallback() {
          grecaptcha.render(document.getElementById('g-recaptcha'),{
          "sitekey": '6LfMWLkaAAAAAFYM11ctU1Dxfz_v3SVrAKLOR3rM',})
      }
     `,}}
    />,])

  setPostBodyComponents([
    <script
      key="abc"
      type="text/javascript"
      src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
      async
      defer1
    />,])
}

以及联系表格:

<Form className="contact-form" method="post" data-netlify-recaptcha="true" data-netlify="true" netlify-honeypot="bot-field">
  ...
  <p className="hidden">
    <label>Don’t fill this out if you’re human: <input name="bot-field" /></label>
  </p>
  ...
  <Form.Group id="recaptcha-container">
    <div id="g-recaptcha" className="g-recaptcha" data-netlify-recaptcha="true" render="explicit"></div>
  </Form.Group>
  ...
</Form>

在我向表单添加任何 Netlify 属性之前出现错误“Uncaught (in promise) Error: reCAPTCHA placeholder element must be an element or id”,所以我很确定这与它无关。

>

有什么想法吗?谢谢。

解决方法

我认为您的问题是您将脚本直接嵌入到 React 的范围之外,因此它在加载时永远不会再水化。最简单的方法是添加 react-google-recaptcha 组件:

<Form className="contact-form" method="post" data-netlify-recaptcha="true" action="/" data-netlify="true" netlify-honeypot="bot-field">
  ...
  <p className="hidden">
    <label>Don’t fill this out if you’re human: <input name="bot-field" /></label>
  </p>
  ...
  <Form.Group id="recaptcha-container">
  <ReCAPTCHA
    sitekey="Your client site key"
    onChange={onChange}
  />,</Form.Group>
  ...
</Form>

正如我所说,我认为您不需要 gatsby-ssr.js 实现,您可以通过添加 React 组件来实现更原生的实现,如上面的代码片段所示。您需要获取该值并将其发送到 Netlify 请求。我建议您也在表单组件中设置一个 action

您还缺少表单的一个关键属性:name。否则,Netlify 将永远不会知道您的表单是如何命名的,也不会在仪表板中显示它(您也需要发送它)。

请记住,除非您将后台配置为接受本地请求 (127.0.0.1),否则永远不会在本地加载 reCAPTCHA。

有用的资源:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?