【发布时间】:2017-08-02 01:50:42
【问题描述】:
我已经在几个站点上成功地实现了新的Google's INVISIBLE reCaptcha,但是它与 jQuery validate() 冲突,因此 js 验证不再在按钮/表单提交时执行,并且 reCaptcha 立即启动。如果用户忘记填写所需的表单字段,则必须等待服务器响应,然后再返回。
jQuery .validate() 支持回调,但由于它是在 CMS 的内部类中硬编码的,有没有办法可以在外部以某种方式修改它(例如,从前端主题,在文档中加载,当验证码已经渲染时)?
或者,另一个想法是以某种方式推迟验证码的回调,以便验证步骤有机会运行。
谢谢!
jQuery 验证表单:(硬编码在核心中,无法修改,除非我编辑核心文件或扩展类/克隆功能 - 不是最佳的)
<script type="text/javascript">
$(document).ready(function(){
$("form[name=comment_form]").validate({
rules: {
body: {
required: true,
minlength: 1
},
authorEmail: {
required: true,
email: true
}
},
wrapper: "li",
errorLabelContainer: "#comment_error_list",
invalidHandler: function(form, validator) {
$('html,body').animate({ scrollTop: $('#comment_error_list').offset().top }, { duration: 250, easing: 'swing'});
},
submitHandler: function(form){
$('button[type=submit], input[type=submit]').attr('disabled', 'disabled');
form.submit();
}
});
});
</script>
reCaptcha 显式渲染:
<script type='text/javascript'>
var renderInvisibleReCaptcha = function() {
for (var i = 0; i < document.forms.length; ++i) {
var form = document.forms[i];
var holder = form.querySelector('.invisible-recaptcha');
if (null === holder) continue;
(function(frm){
var holderId = grecaptcha.render(holder, {
'sitekey': 'my-key-here',
'badge': 'inline',
'size': 'invisible',
'callback': function (recaptchaToken) {HTMLFormElement.prototype.submit.call(frm);},
'expired-callback': function(){grecaptcha.reset(holderId);}
});
frm.onsubmit = function (evt){evt.preventDefault();grecaptcha.execute(holderId);};
})(form);
}
};
</script>
【问题讨论】:
-
您可能想先尝试验证表单——当它被验证为有效时(没有验证码部分),您以编程方式调用 reCAPTCHA:developers.google.com/recaptcha/docs/…
-
嗨,特里,谢谢,但如果我知道,我就不会问这个问题了 :) 看起来很简单,当然,但不确定如何绑定表单验证的结果并调用验证码。跨度>
-
看起来
validate()所做的只是添加了几个事件处理程序。尝试使用$('.form').off('submit')或$('.submit-button').off('click');清除它们。我会发布一个明确的答案,但目前无法设置小提琴来检查...... -
不确定是什么想法,但快速测试 - 似乎没有任何区别。
-
@dev101 你找到这个问题的解决方案了吗?
标签: jquery validation recaptcha invisible