Cada resposta está faltando alguns pontos, então aqui está a minha solução:
$("#input").on("input", function(e) {
var input = $(this);
var val = input.val();
if (input.data("lastval") != val) {
input.data("lastval", val);
//your change action goes here
console.log(val);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>
Os Input Event
disparos na entrada do teclado , arrastar o mouse , preencher automaticamente e copiar e colar foram testados no Chrome e Firefox. A verificação do valor anterior faz com que ele detecte alterações reais, o que significa não disparar ao colar a mesma coisa ou digitar o mesmo caractere ou etc.
Exemplo de trabalho: http://jsfiddle.net/g6pcp/473/
atualizar:
E se você deseja executar o seu change function
somente quando o usuário terminar de digitar e impedir o acionamento da ação de alteração várias vezes, tente o seguinte:
var timerid;
$("#input").on("input", function(e) {
var value = $(this).val();
if ($(this).data("lastval") != value) {
$(this).data("lastval", value);
clearTimeout(timerid);
timerid = setTimeout(function() {
//your change action goes here
console.log(value);
}, 500);
};
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
Se o usuário começa a digitar (por exemplo, "foobar"), esse código impede que você change action
execute todas as letras que o usuário digita e só é executado quando o usuário para de digitar. Isso é bom especialmente para quando você envia a entrada para o servidor (por exemplo, entradas de pesquisa), que servidor de maneira faz apenas uma busca para foobar
e não seis pesquisas para f
e depois fo
e depois foo
e foob
e assim por diante.