使用jQuery禁用提交按钮,如果输入为空

5
我试图禁用提交按钮,直到用户填写了表单中的输入字段。
我在这里找到了一个非常好的答案(链接)。但是当字段被填充时,我遇到了重新启用提交按钮的小问题。
请有人检查一下这个函数,并帮助我找出我缺少什么? 非常感谢任何帮助:D 谢谢。
这里还有一个Fiddle
$(document).ready(function() {
var $submit = $("input[type=submit]");

if ( $("input:empty").length > 0 ) {
$submit.attr("disabled","disabled");
} else {
$submit.removeAttr("disabled");
}
});


<form method="POST" action="<%=request.ServerVariables("SCRIPT_NAME")%>">
User Name: <input name="Username" type="text" size="14" maxlength="14" /><br />
Password: <input name="last_name" type="password" size="14" maxlength="14"><br />
<input type="submit" value="Login" name="Submit" id="loggy">
</form>
4个回答

13
$(document).ready(function() {
    var $submit = $("input[type=submit]"),
        $inputs = $('input[type=text], input[type=password]');

    function checkEmpty() {

        // filter over the empty inputs

        return $inputs.filter(function() {
            return !$.trim(this.value);
        }).length === 0;
    }

    $inputs.on('blur', function() {
        $submit.prop("disabled", !checkEmpty());
    }).blur(); // trigger an initial blur
});

这里有一个可运行的示例

你也可以使用keyup代替blur,例如:

    $inputs.on('keyup', function() {
        $submit.prop("disabled", !checkEmpty());
    }).keyup();  // trigger an initial keyup

同时,您可以组合多个事件:

    $inputs.on('keyup blur', function() {
        $submit.prop("disabled", !checkEmpty());
    }).keyup();  // trigger any one

非常感谢!它运行得非常好 :D 是否可以更改失焦事件?这样用户就不必点击输入框以解除禁用状态了吗? - xxstevenxo
没关系,我把“模糊”改成了“按键事件”,得到了我希望的完美结果。再次非常感谢您的帮助和演示! :D - xxstevenxo

1
在你的问题中,我没有看到你不断检查输入状态的代码,我认为问题就出在这里。
你可以使用实时事件来解决这个问题。 以你的代码为例:
$(document).ready(function() {
      var $submit = $("input[type=submit]");

      function checkSubmitState()
      {
          if ( $("input:empty").length > 0 ) {
             $submit.attr("disabled","disabled");
          } else {
             $submit.removeAttr("disabled");
          }
      }

      // check the submit state on every change or blur event.
      $("input").live("change blur", checkSubmitState);
});

1
使用keyup事件在运行条件之前检查值:
$(document).ready(function() {
    $('input:text, input:password').keyup(function() {
        if ($(this).val() !== "") {
            $('input:submit').removeAttr('disabled');
        } else {
            $('input:submit').attr('disabled', 'true');
        }
    });
});

http://jsfiddle.net/tovic/He4Kv/23/


0
一些这里的回答已经有点过时了,因为我在寻找一个jQuery片段。我测试了它们,由于我认为已经被弃用,它们似乎不能正常工作。
所以我自己写了一个新的,并且这里是一个新的可行方法(jQuery >=3.0),例如监听输入事件。

let inp = $('[type=text]'),
    btn = $('[type=button]')
btn.prop('disabled', true)

inp.on('input', () => {
  let empty = []
  inp.map(v => empty.push(inp.eq(v).val()))
  btn.prop('disabled', empty.includes(''))
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<form>
 <input type=text><br>
 <input type=text><br>
 <input type=text><br>
 <input type=button value=Send>
</form>

一个纯JavaScript示例在此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接