为了账号安全,请及时绑定邮箱和手机立即绑定

Recapcha V3 不适用于具有多种表单的页面

Recapcha V3 不适用于具有多种表单的页面

森林海 2021-06-17 18:48:13
我对 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>请帮忙!提前致谢!
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

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


一个简单的解决方法是将recaptcha_response每种形式中元素的 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))

    ;

  });

希望有帮助:)


查看完整回答
反对 回复 2021-06-24
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

删除 id 标签并仅使用名称标签。


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;

        }

    });

});


查看完整回答
反对 回复 2021-06-24
  • 2 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信