Отключить кнопку отправки, если только исходные данные формы не были изменены
Вот код, который я использую:
$('form').bind('keyup change', function(){
По умолчанию кнопка отправки установлена в значение ОТКЛЮЧЕНО, если что-то меняется внутри текстового поля ввода или состояния проверки переключателя или выпадающего списка, тогда кнопка должна быть установлена ENABLED, удалив отключенный атрибут.
Моя конечная цель:
![enter image description here]()
EDIT: если что-то изменится на значение по умолчанию, кнопка отправки должна быть отключена с помощью prop ('disabled', true); - нужен какой-то способ отслеживать каждое изменение.
=============================================== =====
Пример: Перейдите в Twitter и войдите в раскрывающееся меню выберите "Настройки". На странице учетной записи измените свое имя пользователя (просто добавьте дополнительный char), затем прокрутите вниз, установите флажок для проверки и измените выбор страны.
Кнопка будет включена внизу, верните и снимите флажок, который вы предварительно отметили, кнопка внизу останется включенной,
прокрутите вверх, чтобы изменить свое имя пользователя на то, что было, прокрутите вниз по кнопке, чтобы сохранить изменения, по-прежнему будут включены, перейдите в список стран и измените их на то, что у вас было ранее, теперь, наконец, прокрутите вниз: сохранить кнопка изменения будет отключена.
=============================================== =====
EDIT: это кажется очень похожим, Каков наилучший способ отслеживания изменений в форме через javascript?
Цитата: "Вы можете отключить его по умолчанию и обработчики JavaScript будут наблюдать за входами для событий изменений, чтобы включить его. Возможно, вы можете отобразить некоторые скрытые поля или непосредственно визуализировать значения JavaScript для хранения" оригиналов "и, в случае этих изменений, проверьте текущие значения на оригиналы, чтобы определить, должна ли кнопка быть включена или отключена. - David Jan 18 at 15:14" (Включить кнопку 'submit', только если значение в форме был изменен).
Ответы
Ответ 1
Вам просто нужно сохранить значения orignal, а затем проверить их после каждого изменения.
Пример: 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
Я знаю, что это поздний ответ, но этот метод использует гораздо меньше кода, чем принятый ответ, не требуя идентификаторов в полях и не сохраняя глобальный массив.
Просто используйте .serialize()
, чтобы сохранить данные и проверить, совпадает ли это при каждом изменении.
http://jsfiddle.net/Pug3H/2/
$('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)
;
Ответ 3
Сохраните значения по умолчанию для каждого поля в ассоциативном массиве с именем ввода /textarea/select/radio в качестве ключа.
Например:
var defaults = {
firstname: 'carl',
lastname: 'johnson'
};
Или вы можете автоматически загрузить значения по умолчанию при загрузке документа:
$(document).load(function(){
var defaults = {};
// Iterate through all fields in the form and save their values to the default object
$('input, select').each(function(){
defaults[$(this).attr('name')] = $(this).val();
});
});
Затем привяжите события keyup
, blur
и change
к функции, которая проверяет, было ли какое-либо поле изменено с их значения по умолчанию.
$('input, select').bind('keyup blur change', function(event)
{
var defaults = defaults;
var changed = false;
// Iterate through all the fields
$('input, select').each(function()
{
var fieldValue = $(this).val();
var fieldName = $(this).attr('name');
var fieldDefaultValue = defaults[fieldName];
// Check if current field value is different than default
if(fieldValue != fieldDefaultValue)
changed = true;
});
// Disable or enable button based on changed state of form
button.prop('disabled', !changed);
});
EDIT:
Я просто посмотрел на ваш jsfiddle. Здесь пересмотренный код:
var button = $('#submit-data');
$('input, select').each(function () {
$(this).data('val', $(this).val());
});
$('input, select').bind('keyup change blur', function(){
var changed = false;
$('input, select').each(function () {
if($(this).val() != $(this).data('val')){
changed = true;
}
});
button.prop('disabled', !changed);
});
Ответ 4
Вы можете добавить атрибут данных для хранения значений по умолчанию - для отмеченных типов вы можете использовать 0
для unchecked и 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);
});
FIDDLE