При разработке сайтов, возникает задача, получить значение поля по умолчанию и сравнить его с текущим значением. К примеру, это может потребоваться, тогда, когда мы отправляем изменение формы. Совсем не обязательно отправлять на сервер все данные. Достаточно отправить лишь измененные поля.
Пометить поле, как измененное можно и другими способами. Можно при загрузке страницы запомнить в массив значения всех полей, а при отправке сравнивать с текущими. Этот способ самый надежный, но и при этом самый прожорливый и им редко когда пользуются.
Второй способ, это повесить на поле ввода обработчики событий change, keyup, mouseup, в которых добавлять к полю некий атрибут, который будет говорить о его изменении. В коде это будет выглядеть как-то так
var i, elms = document.getElementsByTagName('input'), timer; function onchange(){ clearTimeout(timer); timer = setTimeout(function(){ this.setAttribute('changed',true); },100); } for(i=0;i<elms.lengthi++){ elms[i].addEventListener('change',onchange); elms[i].addEventListener('keyup',onchange); elms[i].addEventListener('mousedown',onchange); }
или при использовании jQuery
$('input').on('change keyup mouseup',function(){ $(this).attr('changed',true); });
Но в таком случае, поле будет помечено, как измененное при любом действии с ней, даже если вы просто кликните по ней мышкой.
Более верным вариантом в таком случае было бы проверять, равно ли значение элемента, его значению по умолчанию (это значение было в нем при загрузке страницы).
У текстовых элементов input, есть такое поле как defaultValue. Для элементов типа select получить значение по умолчанию, незначительно сложнее. Оформим в виде плагина jQuery
$.fn.defaultValue = function(){ var value; if( this[0].defaultValue ) return this[0].defaultValue; this.find('option').each(function(){ if( this.defaultSelected ) value =this.value; }); return value; }
На нативном JavaScript это будет так
var defaultValue = function( elm ){ var value; if( elm .defaultValue ) return elm .defaultValue; [].map.call(elm .getElementsByTagName('option'),function( obj ){ if( obj.defaultSelected ) value =obj.value; }); return value; }
Теперь есть два сценария при отправке формы. Первый: проверить значения всех полей с дефолтовыми значениями, и отправить на сервер лишь измененные данные. Второй вариант: скомбинировать метку changed с проверкой defaultValue, а при отправке использовать только поля с этой пометкой.
Сайты с такой обработкой данных перед отправкой не тормозят, а значит их проще продвигать. Для раскрутки сайта цена может быть и небольшая, сделать все формы по уму. Но пользователи это отметят. Сейчас поисковики "любят" сайты с грамотным юзабилити.
Желаю удачи.