यहाँ एक सुंदर समाधान है।
प्रपत्र पर प्रत्येक इनपुट तत्व के लिए छिपी हुई संपत्ति है जिसे आप यह निर्धारित करने के लिए उपयोग कर सकते हैं कि मूल्य बदल गया था या नहीं। प्रत्येक प्रकार के इनपुट का अपना संपत्ति नाम होता है। उदाहरण के लिए
- इसके लिए
text/textareaयह डिफ़ॉल्ट है
- इसके लिए
selectयह डिफ़ॉल्ट है
- इसके लिए
checkbox/radioयह डिफ़ॉल्ट रूप से चेक किया गया है
यहाँ उदाहरण है।
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();
});
});
};
अब केवल पृष्ठ पर दिए गए प्रपत्रों को लूप करें और आपको डिफ़ॉल्ट रूप से सबमिट किए गए बटनों को देखना चाहिए और वे केवल तभी सक्रिय होंगे जब आप प्रपत्र पर कुछ इनपुट मान बदल देंगे।
$('form').each(function () {
bindFormChange($(this));
});
एक jQueryप्लगइन के रूप में कार्यान्वयन यहाँ है https://github.com/kulbida/jmodifiable