Detectar caixa de texto de entrada alterada

289

Examinei várias outras perguntas e encontrei respostas muito simples, incluindo o código abaixo. Eu simplesmente quero detectar quando alguém altera o conteúdo de uma caixa de texto, mas por algum motivo não está funcionando ... Não recebo erros no console. Quando defino um ponto de interrupção no navegador na change()função, ele nunca o atinge.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">
Advogado do diabo
fonte
1
apenas algumas coisas para tentar: dê à entrada um type = "text" e torne-o um elemento único. <input id = "inputDatabaseName" type = "text" />
szeliga
Limpou algum código desnecessário, apenas 7 anos tarde demais.
Advogado do

Respostas:

523

Você pode usar o inputevento Javascript no jQuery assim:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

Em JavaScript puro:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

Ou assim:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>
Ouadie
fonte
1
Não consigo encontrar a documentação para este evento, mas funciona exatamente da maneira que eu esperava. Alguma idéia de onde posso encontrar a página do documento?
Jorge Pedret
3
Você pode encontrá-lo na lista de eventos HTML5: w3schools.com/tags/ref_eventattributes.asp ou aqui help.dottoro.com/ljhxklln.php
Ouadie
7
Esta solução é realmente muito melhor do que usar keyup. Por exemplo, o IE permite que o usuário limpe o campo de entrada clicando em um X que não aciona a digitação.
Georg
7
A solução mais próxima até agora, mas ainda não funciona quando o navegador executa o preenchimento automático nas caixas de texto.
Saumil 02/02
3
Isso é muito melhor que a primeira resposta. Todas as teclas Ctrl e Shift contam como keyup. E a pior parte é que, se você digitar rápido, várias entradas serão registradas como apenas um evento de keyup.
Octref
173

tente digitar em vez de alterar.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Aqui está a documentação oficial do jQuery para .keyup () .

Scott Harwell
fonte
1
suspiro Eu juro que tentei isso (depois de olhar para esta pergunta: stackoverflow.com/questions/1443292/… ) ... mas aparentemente não porque funciona agora!
Advogado do diabo
27
a alteração é acionada apenas quando o elemento perde o foco e o keyup é acionado quando uma tecla do teclado é liberada.
Declan Cook
9
e se o usuário colar código usando ctrl + v ou arrastando um texto selecionado com o mouse para o #inputDatabaseName? Como você detecta isso?
Radu Simionescu
5
O principal problema com isso é que ainda não leva em consideração se o conteúdo realmente muda. Só que um botão foi pressionado
Metropolis
@ Metropolis, você viu minha resposta ?? stackoverflow.com/a/23266812/3160597
azerafati
103

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 Eventdisparos 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 actionexecute 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 foobare não seis pesquisas para fe depois foe depois fooe foobe assim por diante.

azerafati
fonte
1
Este foi o primeiro a trabalhar a partir de 6 eu tentei. Impressionante. Obrigado.
Enkode
Quase funciona no IE9: se você excluir um personagem, ele não dispara o evento. Solução alternativa muito boa
Soma #
@Soma, como outros dizer "quebrar IE não é uma falha é uma característica";), embora o IE não é continuado mais, mas se você tem uma correção para que deixe-nos saber
azerafati
Eu sei, mas eu tinha que fazer isso por trabalho :( Na verdade, eu faço: use $("#input").focusout(function () {}). Quando você clica fora da sua entrada, o evento é acionado. Funciona na versão atual do Chrome e Firefox e IE9
Soma
2
@Soma, se essa é a única maneira para o IE para trabalhar você poderia usar o meu caminho com apenas mudando esta linha$("#input").on("input focusout",function(e){
azerafati
18

As entradas de texto não disparam o changeevento até que elas percam o foco. Clique fora da entrada e o alerta será exibido.

Se o retorno de chamada for acionado antes que a entrada de texto perca o foco, use o .keyup()evento

Matt Ball
fonte
changeestá trabalhando aqui: jsfiddle.net/g6pcp ; keyupalerta após cada tecla que não é uma boa maneira
diEcho
1
@diEcho Acho que o alerta é apenas um exemplo para que seu código funcione ... não o que ele pretende fazer no final.
Scott Harwell 27/05
@diEcho O que Scott disse, era apenas para fins de teste. É assim que eu depuro: D
Advogado do Diabo
@ Scott, por favor, use um depurador adequado em vez de alert(). Isso tornará a depuração muito mais fácil.
Matt Ball
13

onkeyup, onpaste, onchange, oninputparece estar falhando quando o navegador executa o preenchimento automático nas caixas de texto. Para lidar com esse caso, inclua " autocomplete='off'" em seu campo de texto para impedir que o navegador preencha automaticamente a caixa de texto,

Por exemplo,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>
Saumil
fonte
3

No meu caso, eu tinha uma caixa de texto anexada a um datepicker. A única solução que funcionou para mim foi lidar com isso dentro do evento onSelect do datepicker.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});
kmxr
fonte
0

Eu acho que você pode usar keydowntambém:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});
Yoosaf Abdulla
fonte
-5

TRABALHANDO:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});
guaroa mendez
fonte
Parece código para uma pergunta diferente ... sobre o que é esse valor em maiúsculas e exibição / ocultação de conteúdo?
Nico Haase