这个问题已经 2 年了,但它仍然是一个好问题,它是第一个谷歌结果......但所有现有答案都建议设置和删除HTML属性(removeAttr("disabled")) "disabled",这不是正确的方法。关于属性与属性有很多混淆。
HTML
W3C<input type="button" disabled>
将标记中的“禁用”称为布尔属性。
HTML 与 DOM
引用:
属性在 DOM 中;属性位于解析为 DOM 的 HTML 中。
https://stackoverflow.com/a/7572855/664132
查询
有关的:
然而,关于checked 属性要记住的最重要的概念是它不对应于checked 属性。该属性实际上对应于 defaultChecked 属性,应该仅用于设置复选框的初始值。选中的属性值不会随着复选框的状态而改变,而选中的属性会。因此,确定复选框是否被选中的跨浏览器兼容的方法是使用属性...
相关的:
属性通常会影响 DOM 元素的动态状态,而不会更改序列化的 HTML 属性。示例包括输入元素的 value 属性、输入和按钮的禁用属性或复选框的选中属性。.prop() 方法应该用于设置禁用和检查,而不是 .attr() 方法。
$( "input" ).prop( "disabled", false );
概括
要 [...] 更改 DOM 属性,例如表单元素的 [...] 禁用状态,请使用.prop()方法。
( http://api.jquery.com/attr/ )
至于问题的更改部分禁用:有一个名为“输入”的事件,但浏览器支持是有限的,它不是一个 jQuery 事件,所以 jQuery 不会让它工作。change 事件可靠地工作,但在元素失去焦点时被触发。所以可以将两者结合起来(有些人也听键盘和粘贴)。
这是一段未经测试的代码来说明我的意思:
$(document).ready(function() {
var $submit = $('input[type="submit"]');
$submit.prop('disabled', true);
$('input[type="text"]').on('input change', function() { //'input change keyup paste'
$submit.prop('disabled', !$(this).val().length);
});
});