Существует один и только один надежный способ сделать это , это путем извлечения значения в интервале и сравнения его с кэшированным значением.
Причина, по которой это единственный способ, заключается в том, что существует несколько способов изменить поле ввода с помощью различных входов (клавиатура, мышь, вставка, история браузера, голосовой ввод и т. Д.), И вы никогда не сможете обнаружить их все с помощью стандартных событий. в кросс-браузерной среде.
К счастью, благодаря инфраструктуре событий в jQuery, довольно легко добавить собственное событие inputchange. Я так и сделал здесь:
$.event.special.inputchange = {
setup: function() {
var self = this, val;
$.data(this, 'timer', window.setInterval(function() {
val = self.value;
if ( $.data( self, 'cache') != val ) {
$.data( self, 'cache', val );
$( self ).trigger( 'inputchange' );
}
}, 20));
},
teardown: function() {
window.clearInterval( $.data(this, 'timer') );
},
add: function() {
$.data(this, 'cache', this.value);
}
};
Используйте это как: $('input').on('inputchange', function() { console.log(this.value) });
Здесь есть демоверсия: http://jsfiddle.net/LGAWY/
Если вы боитесь нескольких интервалов, вы можете связать / отменить привязку этого события на focus
/ blur
.