我发现你的解决方案很有趣(@FabioG)。
但是,我对它进行了一些修改以便自己使用,我愿意分享代码让其他人使用。
我正在开发一个交互式表单,可以在完成步骤时进行验证。
它被用于订购食物。因此,该表单需要验证和激活注册按钮,并且使用了最新的reCaptcha(2016年5月12日)。
此外,这个代码处理了过期的reCaptcha,通过ajax进行服务器端验证(虽然没有包含 - 如果有人需要,请在我的答案下评论,我会相应地编辑它)。
让我们开始吧。
HTML代码:
<form id="registerForm" method="get" action="">
<fieldset class="step-1">
<h4>Step One:</h4>
<span class="clock">Register under one minute!</span>
<label for="email-register" class="label">E-mail*</label>
<input id="email-register" name="email-register" type="email" value="" autocomplete="off"/>
<label for="password-register" class="label">Password*</label>
<input id="password-register" name="password-register" type="password" value="" autocomplete="off"/>
<div class="g-recaptcha" data-sitekey="6LeS4O8SAAAAALWqAVWnlcB6TDeIjDDAqoWuoyo9" data-callback="recaptchaCallback" data-expired-callback="recaptchaExpired" style="margin-top: 3rem;"></div>
<input id="hidden-grecaptcha" name="hidden-grecaptcha" type="text" style="opacity: 0; position: absolute; top: 0; left: 0; height: 1px; width: 1px;"/>
</div>
</fieldset>
<fieldset class="step-2">
<h4>Step two:</h4>
<span class="notice">All fields with a sign are required!*</span>
<label for="first-name" class="label">First Name*</label>
<input name="first-name" id="first-name" type="text" value="" />
<label for="last-name" class="label">Last Name*</label>
<input name="last-name" id="last-name" type="text" value="" />
<label for="address" class="label">Address*</label>
<input name="address" id="address" type="text" value=""/>
<label for="entrance" class="label">Entrance</label>
<input name="entrance" id="entrance" type="text" value=""/>
<label for="apartment-number" class="label">Apartment #</label>
<input name="apartment-number" id="apartment-number" type="text" value="" />
<label for="inter-phone" class="label">Interphone</label>
<input name="inter-phone" id="inter-phone" type="text" value=""/>
<label for="telephone" class="label">Mobile Number*</label>
<input name="telephone" id="telephone" type="text" value="" />
<label for="special-instructions" class="label">Special Instructions</label>
<textarea name="special-instructions" id="special-instructions"></textarea>
<div>
</fieldset>
<button class="button-register" disabled>Register</button>
</form>
所以,正如您所看到的,提交按钮(“ .button-register”)最初是< strong>禁用的。
只有填写< strong>强制性 (*)字段才能启用它。
请记住,我没有包含任何CSS。表格最少,仅供教育目的。
与@FabioG不同的几件事情是:
没有必要隐藏元素或使用“.ignore”。我用内联CSS隐藏了它。
成功reCaptcha和过期reCaptcha都有< strong>响应回调。
因此,如果您的reCaptcha在填写表单时过期,它将使其< strong>无效,并且按钮将再次< strong>禁用。
此外,该表单使用输入字段(隐藏输入字段)将信息传递给AJAX(稍后为PHP)并在服务器端进行验证< em>(这是潜在的安全风险,我在文本末尾更详细地介绍了它)。
让我们继续JavaScript / jQuery。
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
function recaptchaCallback() {
var response = grecaptcha.getResponse(),
$button = jQuery(".button-register");
jQuery("#hidden-grecaptcha").val(response);
console.log(jQuery("#registerForm").valid());
if (jQuery("#registerForm").valid()) {
$button.attr("disabled", false);
}
else {
$button.attr("disabled", "disabled");
}
}
function recaptchaExpired() {
var $button = jQuery(".button-register");
jQuery("#hidden-grecaptcha").val("");
var $button = jQuery(".button-register");
if (jQuery("#registerForm").valid()) {
$button.attr("disabled", false);
}
else {
$button.attr("disabled", "disabled");
}
}
function submitRegister() {
}
(function ($, root, undefined) {
$(function () {
'use strict';
jQuery("#registerForm").find("input").on("keyup", debounce(function() {
var $button = jQuery(".button-register");
if (jQuery("#registerForm").valid()) {
$button.attr("disabled", false);
}
else {
$button.attr("disabled", "disabled");
}
}, 1000));
jQuery("#registerForm").validate({
rules: {
"email-register": {
required: true,
email: true
},
"password-register": {
required: true,
minlength: "6"
},
"first-name": "required",
"last-name": "required",
address: "required",
telephone: "required",
"hidden-grecaptcha": {
required: true,
minlength: "255"
}
},
messages: {
"email-register": "Enter valid e-mail address",
"password-register": {
required: "Enter valid password",
minlength: "Password must be bigger then 6 chars!"
},
"first-name": "Required!",
"last-name": "Required!",
address: "Required!",
telephone: "Required!"
},
submitHandler: submitRegister
});
});
})(jQuery, this);
如您所见,这里有几个函数:
recaptchaCallback() 和
recaptchaExpired()。
通过数据属性
data-callback嵌入的
recaptchaCallback() 函数,使用
grecaptcha.getResponse() 来查看reCaptcha是否已验证,如果是,则将令牌输入隐藏的输入字段,并通过
jQuery("#registerForm).validate(); 请求重新验证。
然而,如果reCaptcha在此期间过期,它将使用“data-expired-callback”中分配的函数,从输入字段中删除令牌并再次请求重新验证,但因为该字段为空,验证将失败。这是通过
recaptchaExpired()函数实现的。
在代码的后面,可以看到我们添加了一个jQuery
keyup函数,以检查重新验证,并查看用户是否已将所需信息传递给输入字段。如果信息和字段成功验证,则
keyup函数将启用
注册按钮。
此外,我使用了一个去抖脚本(感谢David Walsh)在
keyup上。这样就不会导致浏览器卡顿。因为需要输入很多内容。
但是,请记住,如果用户决定规避reCaptcha,他总是可以将“255”个字符长的字符串输入到输入字段中。但是,我更进一步,做了一个AJAX验证服务器端来确认reCaptcha。虽然,我没有包含它在答案中。
我认为这段代码对之前的答案有一点改进。如果您有任何问题或需要AJAX / PHP代码,请随时评论。我会尽快提供。
这里也有Codepen:
reCaptcha with jQuery.validation
您可以在此处找到有关reCatpcha数据属性和函数的所有信息:
reCaptcha API
希望对某人有所帮助!
问候,