Javascript 在grecaptcha.execute()完成执行(由事件触发)后,如何调用函数?

Javascript 在grecaptcha.execute()完成执行(由事件触发)后,如何调用函数?,javascript,ajax,promise,axios,grecaptcha,Javascript,Ajax,Promise,Axios,Grecaptcha,当前,grecaptcha.execute正在页面加载上执行,如下面的第一个JS示例所示。如果触发了reCAPTCHA质询,则在加载页面时会发生这种情况。理想情况下,单击表单提交按钮时会发生这种情况。 因此,我尝试将其移动到submit事件(第二个JS示例)中,并将axios函数放入承诺中。它在grecaptcha.execute完成执行之前提交 我在这里不明白的是什么? 我对承诺的第一次体验我不明白承诺是如何运作的吗?这不是解决这个问题的最好办法吗?完全是另外一回事吗 HTML JS 我解决这

当前,
grecaptcha.execute
正在页面加载上执行,如下面的第一个JS示例所示。如果触发了reCAPTCHA质询,则在加载页面时会发生这种情况。理想情况下,单击表单提交按钮时会发生这种情况。 因此,我尝试将其移动到submit事件(第二个JS示例)中,并将axios函数放入承诺中。它在grecaptcha.execute完成执行之前提交

我在这里不明白的是什么? 我对承诺的第一次体验我不明白承诺是如何运作的吗?这不是解决这个问题的最好办法吗?完全是另外一回事吗

HTML

JS


我解决这个问题的方法是将submit按钮更改为dumb按钮,并用js方法处理所有内容:

@Html.HiddenFor(model => model.ReCaptchaToken);

<input type="button"
        value="Submit"
        onclick="onSubmit()"
/>
@Html.HiddenFor(model=>model.ReCaptchaToken);
方法等待令牌,将其放入隐藏字段,然后手动提交表单:

<script>
    if (typeof grecaptcha == 'object') { //undefined behind the great firewall
        grecaptcha.execute('@Config.ReCaptchaSiteKey', { action: 'register' }).then(function (token) {
            window.document.getElementById('ReCaptchaToken').value = token;
            $('form').submit();
        });
    } else {
        window.document.getElementById('ReCaptchaToken').value = -1;
        $('form').submit();
    }
</script>

如果(typeof grecaptcha=='object'){//great firewall后面未定义
执行('@Config.ReCaptchaSiteKey',{action:'register'})。然后(函数(令牌){
window.document.getElementById('ReCaptchaToken')。value=token;
$('form').submit();
});
}否则{
window.document.getElementById('ReCaptchaToken')。值=-1;
$('form').submit();
}
注意:@Html.HiddenFor是MVC-您可能不会使用它。
$('form')是JQuery—您不一定需要它—也可以使用getElementById。

我正在使用一个web服务,因为我想要一个可以在所有页面中使用的方法。 特别注意你需要返回的事实为假;当ajax请求返回时,返回您的帖子

<script type="text/javascript">

   function CheckCaptcha()
    {
        grecaptcha.ready(function () {
            grecaptcha.execute('<%#RecaptchaSiteKey%>', { action: 'homepage' }).then(function (token) {
            $.ajax({
                type: "POST",
                url: "../WebServices/Captcha.asmx/CaptchaVerify", 
                data: JSON.stringify({ 'captchaToken' : token }),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    __doPostBack('<%= RegisterButton.UniqueID%>', '');
                    //console.log('Passed the token successfully');
                },
                failure: function (response) {                     
                    //alert(response.d);
                }
                });
            });
       });

       return false;
    }
    </script>

函数CheckCaptcha()
{
grecaptcha.ready(函数(){
执行(“”,{action:'homepage'})。然后(函数(令牌){
$.ajax({
类型:“POST”,
url:“../WebServices/Captcha.asmx/captchavirify”,
数据:JSON.stringify({'captchaToken':token}),
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
成功:功能(响应){
__doPostBack('','');
//log('成功传递令牌');
},
失败:函数(响应){
//警报(response.d);
}
});
});
});
返回false;
}

我没有使用你做的任何花哨的东西,但我的情况和你一样。表单本身需要一次onclick来执行验证码并在onclick时返回false。然后在reCaptcha Execute回调中,您需要使用Javascript提交表单。
@Html.HiddenFor(model => model.ReCaptchaToken);

<input type="button"
        value="Submit"
        onclick="onSubmit()"
/>
<script>
    if (typeof grecaptcha == 'object') { //undefined behind the great firewall
        grecaptcha.execute('@Config.ReCaptchaSiteKey', { action: 'register' }).then(function (token) {
            window.document.getElementById('ReCaptchaToken').value = token;
            $('form').submit();
        });
    } else {
        window.document.getElementById('ReCaptchaToken').value = -1;
        $('form').submit();
    }
</script>
<script type="text/javascript">

   function CheckCaptcha()
    {
        grecaptcha.ready(function () {
            grecaptcha.execute('<%#RecaptchaSiteKey%>', { action: 'homepage' }).then(function (token) {
            $.ajax({
                type: "POST",
                url: "../WebServices/Captcha.asmx/CaptchaVerify", 
                data: JSON.stringify({ 'captchaToken' : token }),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    __doPostBack('<%= RegisterButton.UniqueID%>', '');
                    //console.log('Passed the token successfully');
                },
                failure: function (response) {                     
                    //alert(response.d);
                }
                });
            });
       });

       return false;
    }
    </script>