Hier ist eine elegante Lösung.
Für jedes Eingabeelement im Formular gibt es eine versteckte Eigenschaft, mit der Sie bestimmen können, ob der Wert geändert wurde oder nicht. Jeder Eingabetyp hat einen eigenen Eigenschaftsnamen. Beispielsweise
- für
text/textareaes ist defaultValue
- für
selectes ist defaultSelect
- denn
checkbox/radioes ist defaultChecked
Hier ist das Beispiel.
function bindFormChange($form) {
function touchButtons() {
var
changed_objects = [],
$observable_buttons = $form.find('input[type="submit"], button[type="submit"], button[data-object="reset-form"]');
changed_objects = $('input:text, input:checkbox, input:radio, textarea, select', $form).map(function () {
var
$input = $(this),
changed = false;
if ($input.is('input:text') || $input.is('textarea') ) {
changed = (($input).prop('defaultValue') != $input.val());
}
if (!changed && $input.is('select') ) {
changed = !$('option:selected', $input).prop('defaultSelected');
}
if (!changed && $input.is('input:checkbox') || $input.is('input:radio') ) {
changed = (($input).prop('defaultChecked') != $input.is(':checked'));
}
if (changed) {
return $input.attr('id');
}
}).toArray();
if (changed_objects.length) {
$observable_buttons.removeAttr('disabled')
} else {
$observable_buttons.attr('disabled', 'disabled');
}
};
touchButtons();
$('input, textarea, select', $form).each(function () {
var $input = $(this);
$input.on('keyup change', function () {
touchButtons();
});
});
};
Durchlaufen Sie jetzt einfach die Formulare auf der Seite und Sie sollten sehen, dass die Senden-Schaltflächen standardmäßig deaktiviert sind. Sie werden NUR aktiviert, wenn Sie tatsächlich einen Eingabewert im Formular ändern.
$('form').each(function () {
bindFormChange($(this));
});
Die Implementierung als jQueryPlugin finden Sie hier https://github.com/kulbida/jmodifying