我有以下代码,其中我有2个电子邮件输入字段,我需要验证它们是否相同,使用jQuery验证equalTo成功。
<div class="control-group">
<label class="control-label" for="inputEmail"><strong>Email Address</strong></label>
<div class="controls">
<input type="email" name="inputEmail" placeholder="jane.smith@email.com" id="inputEmail" required>
</div>
<label class="control-label" for="inputEmailConfirm"><strong>Confirm Email Address</strong></label>
<div class="controls">
<input type="email" name="inputEmailConfirm" placeholder="jane.smith@email.com" id="inputEmailConfirm" required>
</div>
</div>
<button type="submit" id="emailSubmit" disabled="disabled" class="btn btn-danger" data-toggle="tooltip" data-placement="bottom" title="Click me to buy">Credit Card Checkout » </button>
验证成功后,我希望启用该按钮,但似乎无法弄清楚如何执行此操作。
$('#ccSelectForm').validate({
rules: {
inputEmail: {
required: true,
email: true
},
inputEmailConfirm: {
required: true,
email: true,
equalTo: '#inputEmail'
},
}
});
理想情况下,作为奖励,我想设置表单控件以利用Bootstrap3中的验证状态,详细信息请参阅此处 - http://getbootstrap.com/css/#forms-control-validation
答案 0 :(得分:28)
没有jQuery Validate插件回调选项/函数,当所有字段都有效而没有先单击提交按钮时会触发。
您需要创建一个外部keyup blur
事件处理程序,检查表单的有效性并相应地启用/禁用该按钮;每次按下一个键或你离开一个领域。
DEMO:http://jsfiddle.net/p628Y/1/
$(document).ready(function () {
$('#ccSelectForm').validate({
rules: {
inputEmail: {
required: true,
email: true
},
inputEmailConfirm: {
// required: true, // <-- redundant
// email: true, // <-- redundant
equalTo: '#inputEmail'
} // <-- removed trailing comma
}
});
$('#ccSelectForm input').on('keyup blur', function () { // fires on every keyup & blur
if ($('#ccSelectForm').valid()) { // checks form for validity
$('button.btn').prop('disabled', false); // enables button
} else {
$('button.btn').prop('disabled', 'disabled'); // disables button
}
});
});
由于jQuery Validate插件动态地禁用了浏览器的HTML5验证,因此我从标记中删除了required
属性,并将type="email"
更改为type="text"
。 (您已经在插件中指定了这些验证规则。)
<input type="text" name="inputEmail" placeholder="jane.smith@email.com" id="inputEmail" />
<input type="text" name="inputEmailConfirm" placeholder="jane.smith@email.com" id="inputEmailConfirm" />
使用equalTo
规则时,您也不需要指定所有规则两次,因为第二个字段必须始终与第一个字段匹配。
修改强>
在上面的场景中,您的页面完全依赖于JavaScript。换句话说,如果没有JavaScript,则始终禁用该按钮。
如果你有服务器端验证并希望你的页面独立于JavaScript,你需要从按钮标记中删除disabled="disabled"
并将其添加到DOM ready事件内的JavaScript中处理程序。
$('button.btn').prop('disabled', 'disabled');
在这种情况下,如果没有JavaScript,您仍然会有一个工作按钮,并且使用JavaScript,在页面加载时以编程方式禁用该按钮。
答案 1 :(得分:1)
更优雅和快速的解决方案是简单地覆盖默认的on-click和on-keyup事件,添加您需要的代码,而不是添加另一个listen事件
$("#form").validate({
submitHandler: function(form) {
form.submit();
},
onkeyup: function( element, event ) {
if ( event.which === 9 && this.elementValue(element) === "" ) {
return;
} else if ( element.name in this.submitted || element === this.lastElement ) {
this.element(element);
}
this.checkForm();
if (this.valid()) { // checks form for validity
$('a.submit').attr('class', 'submit btn btn-success'); // enables button
} else {
$('a.submit').attr('class', 'submit btn btn-danger disabled'); // disables button
}
},
onclick: function( element ) {
// click on selects, radiobuttons and checkboxes
if ( element.name in this.submitted ) {
this.element(element);
// or option elements, check parent select in that case
} else if ( element.parentNode.name in this.submitted ) {
this.element(element.parentNode);
}
this.checkForm();
if (this.valid()) { // checks form for validity
$('a.submit').attr('class', 'submit btn btn-success'); // enables button
} else {
$('a.submit').attr('class', 'submit btn btn-danger disabled'); // disables button
}
}
})
使用以下提交触发器的css代码 - 最初禁用(bootstrap 3类):
<a onclick="if(!$(this).hasClass('disabled')) { $('#form').submit(); }" class="submit btn btn-danger disabled">button_save</a>
这可以很容易地与jquery插件areYouSure一起使用,仅在实际更改时启用提交:
if (this.valid() && $('#form').hasClass('dirty')) { // checks form for validity
使用silent:
初始化插件$('#form').areYouSure( {'silent':true} );