Ответ 1
Самый простой способ - сохранить исходное значение с помощью data()
, когда элемент получает фокус. Вот пример:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/e4ovx435/
$('input').on('focusin', function(){
console.log("Saving value " + $(this).val());
$(this).data('val', $(this).val());
});
$('input').on('change', function(){
var prev = $(this).data('val');
var current = $(this).val();
console.log("Prev value " + prev);
console.log("New value " + current);
});
Лучше использовать делегированные обработчики событий
Примечание. Как правило, более эффективно использовать делегированный обработчик событий, когда может быть несколько совпадающих элементов. Таким образом добавляется только один обработчик (меньшие накладные расходы и более быстрая инициализация), и любая разность скоростей во время события пренебрежимо мала.
Вот пример с делегированными событиями, связанными с document
:
$(document).on('focusin', 'input', function(){
console.log("Saving value " + $(this).val());
$(this).data('val', $(this).val());
}).on('change','input', function(){
var prev = $(this).data('val');
var current = $(this).val();
console.log("Prev value " + prev);
console.log("New value " + current);
});
JsFiddle: http://jsfiddle.net/TrueBlueAussie/e4ovx435/65/
Делегированные события работают, слушая событие (focusin
, change
и т.д.) в элементе-предке (document
* в этом случае), затем применяя фильтр jQuery (input
) только к элементам в цепочка пузырьков, затем применяя функцию только к тем элементам, которые вызвали событие.
* Примечание. Общее правило использует document
как значение по умолчанию для делегированных событий, а не body
. body
имеет ошибку, связанную с стилем, что может привести к тому, что он не получит пузырьковые события мыши. Также document
всегда существует, поэтому вы можете подключаться к нему вне готового обработчика DOM:)