成功进行jQuery验证后启用禁用按钮

时间:2014-02-22 11:32:36

标签: jquery jquery-validate twitter-bootstrap-3

我有以下代码,其中我有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 &raquo; </button>

验证成功后,我希望启用该按钮,但似乎无法弄清楚如何执行此操作。

 $('#ccSelectForm').validate({
    rules: {
      inputEmail: {
        required: true,
        email: true
      },
      inputEmailConfirm: {
        required: true,
        email: true,
        equalTo: '#inputEmail'
      },
    }
  });

理想情况下,作为奖励,我想设置表单控件以利用Bootstrap3中的验证状态,详细信息请参阅此处 - http://getbootstrap.com/css/#forms-control-validation

小提琴在这里http://jsfiddle.net/4wU5m/

2 个答案:

答案 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} );