Подтвердить что ты не робот

Отключить кнопку отправки, если только исходные данные формы не были изменены

Вот код, который я использую:

$('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', только если значение в форме был изменен).

4b9b3361

Ответ 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