这是我正在使用的代码:
$('form').bind('keyup change', function(){
默认情况下,提交按钮设置为DISABLED,如果输入文本字段内的内容发生变化,或单选按钮检查状态或下拉选择值,则必须通过删除已禁用的属性来设置按钮启用。
我的目标:
编辑:如果有任何内容变回其默认值,则提交按钮应设置为由prop禁用('disabled',true); - 需要一些方法来跟踪每一个变化。
=============================================== =====
示例: 转到Twitter,然后从下拉菜单中选择“设置”。在帐户页面中,更改您的用户名(只需添加额外的字符),然后向下滚动,设置复选框以选中,并更改您的国家/地区选择。
该按钮将在底部启用,返回并取消选中您之前选中的复选框,底部的按钮将保持启用状态,
滚动到顶部将UserName更改回原来的状态,向下滚动按钮以保存更改仍将启用,转到国家/地区列表并将其更改回您之前的状态,现在最后向下滚动:保存更改按钮将被禁用。
=============================================== =====
编辑:这看起来非常相似,What is the best way to track changes in a form via javascript?
引用:“您可以默认情况下将其禁用,并让JavaScript处理程序查看更改事件的输入以启用它。可能会渲染一些隐藏字段或直接呈现JavaScript值来存储”原件“,并且在这些更改事件上,检查原件的当前值,以确定是否应该启用或禁用该按钮。 - David Jan 18 at 15:14“(Enable 'submit' button only if a value in the form has been changed)。
答案 0 :(得分:45)
我知道这是一个迟到的答案,但这种方法使用的代码远少于接受的答案,而不需要字段上的ID而不存储全局数组。
只需使用.serialize()
存储数据,并检查每次更改是否匹配。
$('form')
.each(function(){
$(this).data('serialized', $(this).serialize())
})
.on('change input', function(){
$(this)
.find('input:submit, button:submit')
.prop('disabled', $(this).serialize() == $(this).data('serialized'))
;
})
.find('input:submit, button:submit')
.prop('disabled', true)
;
答案 1 :(得分:11)
您只需要保存原始值,然后在每次更改后检查它们。
示例:http://jsfiddle.net/justincook/42EYq/15/
JavaScript:
// Store original values
var orig = [];
$("form :input").each(function () {
var type = $(this).getType();
var tmp = {'type': type, 'value': $(this).val()};
if (type == 'radio') { tmp.checked = $(this).is(':checked'); }
orig[$(this).attr('id')] = tmp;
});
// Check values on change
$('form').bind('change keyup', function () {
var disable = true;
$("form :input").each(function () {
var type = $(this).getType();
var id = $(this).attr('id');
if (type == 'text' || type == 'select') {
disable = (orig[id].value == $(this).val());
} else if (type == 'radio') {
disable = (orig[id].checked == $(this).is(':checked'));
}
if (!disable) { return false; } // break out of loop
});
$('#submit-data').prop('disabled', disable); // update button
});
// Get form element type
$.fn.getType = function () {
if(this[0].tagName == "INPUT")
return $(this[0]).attr("type").toLowerCase()
else
return this[0].tagName.toLowerCase();
}
HTML:
<form id="" action="" method="post">
<input type="text" value="Carl" name="firstname" id="firstname" />
<input type="text" value="Johnson" name="lastname" id="lasttname" />
<input id="radio_1" type="radio" value="female" name="sex" />Female
<input id="radio_2" type="radio" value="male" name="sex" />Male
<select id="country-list" name="countries">
<option value="xx" selected="">Worldwide</option>
<option value="in">India</option>
<option value="us">United States</option>
</select>
<button id="submit-data" disabled="" type="submit">Save changes</button>
</form>
答案 2 :(得分:4)
@Nigel Angel答案的改进版本:
/* Disable the forms submissions until they have changed */
$(window).on('load', function (e) {
$('form').each(function(){
$(this).data('serialized', $(this).serialize())
})
.on('change input', function(){
$(this).find(':submit, input[type="image"]')
.prop('disabled', $(this).serialize() == $(this).data('serialized'));
/* Check if input with type files has changed */
var changedFiles = $( ":file" ).filter(function( index ) {
return this.value != this.defaultValue;
}).length;
if ( changedFiles > 0) {
$(this).find(':submit, input[type="image"]')
.prop('disabled', false);
}
})
.find(':submit, input[type="image"]').prop('disabled', true);
});
答案 3 :(得分:0)
您可以添加数据属性以保留默认值 - 对于已选中的类型,您可以使用0
进行未选中,1
进行检查
<form id="" action="" method="post">
<input type="text" data-default="Carl" value="Carl" name="firstname" id="firstname" />
<input type="text" data-default="Johnson" value="Johnson" name="lastname" id="lasttname" />
<br />
<br />
<input id="female" type="radio" value="female" name="sex" data-default="0" />Female
<br />
<input id="male" type="radio" value="male" name="sex" data-default="0" />Male
<br />
<br />
<select id="country-list" name="countries" data-default="xx">
<option value="xx" selected="">Worldwide</option>
<option value="in">India</option>
<option value="il">Israel</option>
<option value="ru">Russia</option>
<option value="us">United States</option>
</select>
<br />
<br />
<button id="submit-data" disabled="" type="submit">Save changes</button>
</form>
然后在你的jquery中使用过滤器来获取那些已经改变的
var button = $('#submit-data');
$('form :input').not(button).bind('keyup change', function () {
// get all that inputs that has changed
var changed = $('form :input').not(button).filter(function () {
if (this.type == 'radio' || this.type == 'checkbox') {
return this.checked != $(this).data('default');
} else {
return this.value != $(this).data('default');
}
});
// disable if none have changed - else enable if at least one has changed
$('#submit-data').prop('disabled', !changed.length);
});