【问题标题】:Recapcha V3 doesnt work on page with multiple formsRecaptcha V3 不适用于具有多个表单的页面
【发布时间】:2023-03-09 19:56:02
【问题描述】:

我对 Google Recaptcha V3 有疑问。 Id 确实适用于单个表单,但如果页面中的表单超过 1 个,则仅适用于第一个表单。 如何使其适用于所有形式? 我知道问题出在id="recaptchaResponse",但我不知道如何解决这个问题!那里有一些类似的问题,但找不到解决方案。

Javascript:

<script src="https://www.google.com/recaptcha/api.js?render=key1"></script>
<script>
    grecaptcha.ready(function () {
        grecaptcha.execute('key2', { action: 'contact' }).then(function (token) {
            var recaptchaResponse = document.getElementById('recaptchaResponse');
            recaptchaResponse.value = token;
        });
    });
</script>

表格:

<form class="user" action="" method="post" name="form1" id="form1">
    <input type="hidden" name="source" value="form1">

    <button type="submit" class="btn btn-success">Submit 1</button>

    <input type="hidden" name="recaptcha_response" id="recaptchaResponse">
</form>

<form class="user" action="" method="post" name="form2" id="form2">
    <input type="hidden" name="source" value="form2">

    <button type="submit" class="btn btn-success">Submit 2</button>

    <input type="hidden" name="recaptcha_response" id="recaptchaResponse">
</form>

请帮忙!提前致谢!

【问题讨论】:

    标签: javascript recaptcha-v3


    【解决方案1】:

    问题似乎是因为getElementById 调用只解析了第一种形式的recaptcha_response 输入元素,而不是第二种形式。

    一个简单的解决方法是将每个表单中的recaptcha_response 元素的ID 更改为不同的ID,例如recaptchaResponse1 和recaptchaResponse2。那么设置令牌的 Javascript 代码可以是:

    grecaptcha.ready(function () {
      grecaptcha.execute('key2', { action: 'contact' }).then(function (token) {
        document.getElementById('recaptchaResponse1').value = token;
        document.getElementById('recaptchaResponse2').value = token;
      });
    });
    

    一种更易于维护且适用于任何数量的表单的更好方法是为recaptcha_reponse 输入指定一个类名,并使用querySelectorAll 函数获取具有给定类名的所有输入并更新他们。

    <form class="user" action="" method="post" name="form1" id="form1">
        <input type="hidden" name="source" value="form1">
        <button type="submit" class="btn btn-success">Submit 1</button>
    
        <input type="hidden" name="recaptcha_response" class="recaptchaResponse">
    </form>
    
    <form class="user" action="" method="post" name="form2" id="form2">
        <input type="hidden" name="source" value="form2">
        <button type="submit" class="btn btn-success">Submit 2</button>
    
        <input type="hidden" name="recaptcha_response" class="recaptchaResponse">
    </form>
    
    grecaptcha
      .execute("key", {
        action: "contact"
      })
      .then(function(token) {
        document
          .querySelectorAll(".recaptchaResponse")
          .forEach(elem => (elem.value = token))
        ;
      });
    

    希望有帮助:)

    【讨论】:

      【解决方案2】:

      去掉id标签,只使用name标签。

      grecaptcha.ready(function () {
          grecaptcha.execute({publicKey}, {action: 'forms'}).then(function (token) {
              var recaptchaElements = document.getElementsByName('recaptcha');
              for (var i = 0; i < recaptchaElements.length; i++) {
                  recaptchaElements[i].value = token;
              }
          });
      });

      【讨论】:

      • 感谢您的回答!将测试它!
      猜你喜欢
      • 2019-08-16
      • 2012-03-14
      • 2021-12-07
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      相关资源
      最近更新 更多