Detectando alterações de entrada no jQuery?

360

Ao usar jquery .changeem um inputevento, o evento será acionado apenas quando a entrada perder o foco

No meu caso, preciso fazer uma chamada para o serviço (verifique se o valor é válido) assim que o valor de entrada for alterado. Como eu pude fazer isso?

alma penada
fonte
3
que tipo de entrada? caixa de texto? caixa de seleção? rádio? textarea? Vamos ver o que você veio acima com a medida
Patricia
Desculpe, é uma entrada do tipo texto. E como eu disse, tentei mudar, mas isso não dispara da maneira que preciso (para todas as alterações no texto na entrada). Eu também tentei o pressionamento de teclas, mas para fazer isso funcionar, terei de acompanhar se a entrada está "suja" ou não.
Banshee
2
se eles estiverem pressionando uma tecla, isso mudará 99% das vezes, você sempre pode verificar as teclas que não funcionariam no manipulador de eventos.
Patricia

Respostas:

546

ATUALIZADO para esclarecimentos e exemplo

exemplos: http://jsfiddle.net/pxfunc/5kpeJ/

Método 1. inputEvento

Nos navegadores modernos, use o inputevento. Este evento será acionado quando o usuário estiver digitando em um campo de texto, colando, desfazendo, basicamente, sempre que o valor for alterado de um valor para outro.

No jQuery, faça isso assim

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

a partir do jQuery 1.7, substitua bindpor on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Método 2. keyupEvento

Para navegadores mais antigos, use o keyupevento (isso será acionado assim que uma tecla do teclado for liberada), esse evento pode dar um tipo de falso positivo, porque quando "w" é liberado, o valor de entrada é alterado e o keyupevento é acionado, mas também quando o A tecla "shift" é liberada, o keyupevento é disparado, mas nenhuma alteração foi feita na entrada.). Além disso, esse método não é acionado se o usuário clicar e colar com o botão direito do mouse no menu de contexto:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Método 3. Temporizador ( setIntervalou setTimeout)

Para contornar as limitações, keyupvocê pode definir um cronômetro para verificar periodicamente o valor da entrada para determinar uma alteração no valor. Você pode usar setIntervalou setTimeoutfazer essa verificação do timer. Consulte a resposta marcada nesta pergunta do SO: evento de alteração da caixa de texto jQuery ou consulte o violino para obter um exemplo de trabalho usando focuse blurevents para iniciar e parar o cronômetro para um campo de entrada específico

MikeM
fonte
Você poderia explicar mais sobre esta solução? Como obtenho o valor atual? E como faço para que isso seja executado apenas quando são feitas alterações no valor atual?
precisa
evento de entrada? não há evento de entrada no jQuery (ainda) ... stackoverflow.com/q/11189136/104380
vsync
Para o método 2, costumo ligar-me tanto ao keyup quanto à alteração. Dessa forma, em situações em que a entrada ocorre sem pressionar a tecla (como colar), pelo menos, dispara o evento quando a entrada perde o foco.
usar o seguinte comando
11
O @AdiDarachi MutationObserver acompanhará as alterações nos elementos DOM. No entanto, um usuário que altera dados em um campo de entrada não aciona uma alteração MutationObserver ... Eu configuro um caso de teste, apenas uma alteração de código JS no atributo innerTextou value(simulando a entrada do usuário) acionará um evento MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (consulte o console.log para obter o log de eventos do MutationObserver). Você tem um caso de teste diferente para eu olhar?
27516 MikeM
11
isso não funciona quando um script altera o valor
FalcoGer
189

Se você possui HTML5:

  • oninput (é acionado apenas quando uma alteração realmente acontece, mas ocorre imediatamente)

Caso contrário, você precisará verificar todos esses eventos que possam indicar uma alteração no valor do elemento de entrada:

  • onchange
  • onkeyup( não keydown ou keypresscomo o valor da entrada ainda não terá o novo pressionamento de tecla)
  • onpaste (quando suportado)

e talvez:

  • onmouseup (Eu não tenho certeza sobre este)
Alnitak
fonte
@naomik do meu teste funciona para entradas da caixa de seleção; exceto IE / Edge. Algumas outras exceções podem aparecer, mas é mais inteligente usar o onchange para esses tipos de entrada (IMHO).
HellBaby
82

Com HTML5 e sem usar o jQuery, você pode usar o inputevento :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Isso será acionado toda vez que o texto da entrada for alterado.

Suportado no IE9 + e em outros navegadores.

Experimente ao vivo em um jsFiddle aqui .

Drew Noakes
fonte
11
'alterar' é acionado apenas no desfoque, não quando o texto muda. Use o evento 'input' para detectar alterações de texto.
Dermot Doherty
14

Como outros já sugeriram, a solução no seu caso é cheirar vários eventos .
Os plug-ins que executam esse trabalho geralmente ouvem os seguintes eventos:

$ input.on ('change keydown keypress keyup mousedown click mouseup', manipulador);. on ( 'alterar keydown keypress keyup mousedown clique mouseup' , manipulador );

Se você acha que podem se encaixar, você pode adicionar focus, blure outros eventos também.
Sugiro não exceder nos eventos para escutar, pois ele carrega na memória do navegador procedimentos adicionais a serem executados de acordo com o comportamento do usuário.

Atenção: observe que alterar o valor de um elemento de entrada com JavaScript (por exemplo, através do .val()método jQuery ) não acionará nenhum dos eventos acima.
(Referência: https://api.jquery.com/change/ ).

Emanuele Del Grande
fonte
Recomendo também para adicionar focusOut a problemas evitar com autocomplete
binar
Eu vejo. Eu pesquisei e o focusout parece ser suportado apenas pelo IE e parcialmente pelo Chrome, estou certo?
Emanuele Del Grande
5
Assim como uma adição leve, para acionar o evento de jQuery você pode chamar a ação correspondente depois .val()por exemplo, para um evento de alteração em um campo de entrada, você faria algo assim ... $('#element').val(whatever).change()
techknowcrat
2

Se você deseja que o evento seja acionado sempre que algo for alterado dentro do elemento, você poderá usar o evento keyup .

Jivings
fonte
Ok, mas isso não é mais ou menos o mesmo que o keydown? Vou ter que verificar se a entrada está "suja" eu mesma?
Banshee
@SnowJim Se você só quer fazer coisas quando a entrada realmente muda, você precisa usar onchangeou acompanhar o estado por conta própria. keydownnão funciona porque é acionado antes que o estado da entrada seja alterado.
Alnitak
@ Alnitak exatamente e é por isso que estou fazendo a pergunta aqui. O onchange não está funcionando, é somente lançado ao sair da entrada.
Banshee
O elefante na sala, é claro, é móvel. Certamente, nenhum evento de teclado ou mouse será muito útil lá. : p
Askdesigners
@Askdesigners Os eventos de digitação / desativação ainda devem funcionar da mesma maneira no celular.
Jivings
2

// .blur é acionado quando o elemento perde o foco

$('#target').blur(function() {
  alert($(this).val());
});

// Para acionar manualmente, use:

$('#target').blur();
Kszili
fonte
11
.change é como eu disse, lançado somente quando a entrada perde o foco e o valor é alterado. Preciso obter um mesmo assim que a entrada (texto) for alterada (assim que o texto na entrada for alterado). O desfoque será acionado apenas quando a entrada perder o foco.
precisa
1

Existem eventos jQuery, como keyup e keypress, que você pode usar com a entrada de elementos HTML. Você também pode usar o evento blur () .

desenvolvedor de software
fonte
11
.change é como eu disse, lançado somente quando a entrada perde o foco e o valor é alterado. Preciso obter um mesmo assim que a entrada (texto) for alterada (assim que o texto na entrada for alterado). O desfoque será acionado apenas quando a entrada perder o foco.
precisa
11
você não pode verificar com segurança o valor de uma entrada durante um keypressevento porque a tecla pressionada ainda não alterou esse valor.
Alnitak
0

Isso abrange todas as alterações em uma entrada usando o jQuery 1.7 e superior:

$(".inputElement").on("input", null, null, callbackFunction);
rybo111
fonte