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>