javascript - 不可见的 recaptcha 以编程方式调用挑战 grecaptcha.getResponse() 在页面刷新时始终为空白

标签 javascript jquery html recaptcha invisible-recaptcha

我在我的 jsp 页面中呈现 google recaptcha 小部件,并在我提交表单时以编程方式在我的 java 脚本中调用挑战。

<script type="text/javascript" id="recaptcha-response">    
     var siteKey = $('#recaptchasitekey').first().text();     
         var onloadCallback = function() {          
            grecaptcha.render('recaptcha_element', {
              'sitekey' : siteKey,
              'callback' : correctCaptcha,
              'data-bind' : "qoActionTemplate"
            },true);            
          };
         var correctCaptcha = function(response) {           
            return response;
         };

    </script>   
      <div class="g-recaptcha" id="recaptcha_element" data-size="invisible" ></div>     
       <script src="http://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>       
   <script type="text/template" id="recaptchaUrl">

这是调用挑战的 java 脚本代码。

    executeRecaptcha : function() {
            grecaptcha.execute();
            captcha.token = grecaptcha.getResponse();
            if (captcha.token == null || captcha.token == '') {
                grecaptcha.reset();
                grecaptcha.execute();
            }
            return captcha.token;
        },

    validateRecaptcha : function(response,checkToken) {
            captcha.executeRecaptcha();
            if (captcha.token) {
                var captchaUrl = $('#recaptchaUrl').first().text();
                captcha.userSIDVerify = $('#captcha_token').val();
                $.ajax({
                    type : 'POST',          
                    url : captchaUrl,
                    data : {
                        response : captcha.token
                    },
                    success : captcha.checkToken,
                    error : function() {
                        alert("failed")
                        return;
                    }
                });
            }
        }

我的 grecaptcha.getResponse() 在我第一次提交表单时总是空的,然后第二次提交时我得到了回复。

最佳答案

我不是 100% 确定,但我认为这是因为您在 grecaptcha.execute() 之后以同步方式直接调用 grecaptcha.getResponse()这不是使用不可见的 reCaptcha 的预期方式。 grecaptcha.execute() 需要时间来工作(我假设)并且被设计为异步返回到 data-callback 方法。一旦完成,您就可以随时使用grecaptcha.getResponse()(在调用grecaptcha.reset()之前)获取响应 token .我认为这就是 grecaptcha.getResponse() 背后的想法。我假设它第二次工作,因为它有时间处理不可见的 reCaptcha。我认为 grecaptcha.getResponse() 也更适用于常规的 reCaptcha 而不是隐形的。因为常规的 reCaptcha 由用户“完成”,而不可见的 reCaptcha 在表单提交时“完成”,因此需要回调让我们知道它已经完成。

关于javascript - 不可见的 recaptcha 以编程方式调用挑战 grecaptcha.getResponse() 在页面刷新时始终为空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43726235/

相关文章:

javascript - 使用 Ajax 从 C# 检索二进制数据

javascript - 验证最后一个字符

javascript - 通过 Javascript WeakMaps 收集垃圾的缓存

javascript - 如何使用Javascript使 float 的精度相同

javascript - 仅当来自 ajax 调用的数据已更改时才更新内容

jquery - 排序或分页时显示 Ajax 加载指示器 ASP.net MVC Webgrid

ios - 从适用于 iOS 的 HTML5 应用程序调用号码的超链接

javascript - 有没有办法制作包含其他标签的自定义 HTML 标签?

javascript - 将悬停叠加应用于 Woocommerce 存档列表

javascript - 如何从数组中删除所有项目并显示它?