Evento 'input' do jQuery


207

Eu nunca ouvi falar de um evento no jQuery chamado inputaté ver esse jsfiddle .

Você sabe por que está funcionando? É um apelido para keyupou algo assim?

$(document).on('input', 'input:text', function() {});


12
Exceto changeapenas os disparos quando o campo perde o foco. inputdispara imediatamente.
jcsanyi

3
Você já tentou pesquisar?
undefined

2
@undefined Sim, eu tenho, caso contrário eu não teria criado uma pergunta para ele. A única coisa que aparece no Google são artigos sobre o input elemento e como anexar eventos a ele.
silkfire

3
Esta pergunta responde lindamente a todos os conceitos - stackoverflow.com/questions/15727324/…
GemK

Respostas:


197

Ocorre quando o conteúdo do texto de um elemento é alterado através da interface do usuário.

Não é um alias para, keyupporque keyupserá acionado mesmo que a tecla não faça nada (por exemplo: pressionar e soltar a tecla Control acionará um keyupevento).

Uma boa maneira de pensar sobre isso é assim: é um evento que dispara sempre que a entrada é alterada. Isso inclui - mas não se limita a - pressionar as teclas que modificam a entrada (por exemplo, Ctrlpor si só, não acionará o evento, mas Ctrl-Vcolar algum texto), selecionando uma opção de preenchimento automático, no meio do estilo Linux -clique em colar, arraste e solte e muitas outras coisas.

Consulte esta página e os comentários sobre esta resposta para obter mais detalhes.


11
Você sabe se o jQuery compõe o suporte ao navegador ausente? (Inconsistências IE8, IE9, etc)
jcsanyi

4
Acabei de pesquisar no 'js input event'. Existe um talento especial para saber quais termos usar para encontrar o que você deseja no google; isso vem com experiência. E então, é claro, o Google registra tudo e o usa para aprender o que você realmente deseja. A maioria das minhas pesquisas são sobre documentos de API e perguntas de programação; portanto, ao longo do tempo, aprendi que, quando eu procuro por coisas, ele provavelmente deve me mostrar documentos de API e respostas de programação.
J David Smith

3
Bem, eu estava procurando por "evento de entrada jQuery", não fazia ideia de que era um evento JS original. Mesmo aqui, os primeiros resultados são geralmente do SO, que considero principalmente como respostas de fato / fontes oficiais de informação.
silkfire

18
inputna verdade, é mais do que apenas um filtro keyup, por exemplo, será acionado também quando o valor foi selecionado na lista de valores usados ​​anteriormente ... Era algo que seria muito difícil de manipular se não houvesse inputevento.
Szeryf # 9/13

2
oninputtambém é acionado quando o texto é alterado pelo mouse (por meio de arrastar e soltar, ou pelo menu do botão direito ou clique com o botão do meio para colar).
Denilson Sá Maia

157

oninput O evento é muito útil para rastrear alterações nos campos de entrada.

No entanto, ele não é suportado na versão IE <9. Mas versões mais antigas do IE têm seu próprio evento proprietário onpropertychangeque faz o mesmo que oninput.

Então você pode usá-lo desta maneira:

$(':input').on('input propertychange');

Para ter um suporte completo ao navegador.

Como a alteração da propriedade pode ser acionada para QUALQUER alteração de propriedade, por exemplo, a propriedade desativada é alterada, você deve incluir o seguinte:

$(':input').on('propertychange input', function (e) {
    var valueChanged = false;

    if (e.type=='propertychange') {
        valueChanged = e.originalEvent.propertyName=='value';
    } else {
        valueChanged = true;
    }
    if (valueChanged) {
        /* Code goes here */
    }
});

10
Exatamente o que eu precisava. Obrigado. (Eu odeio ter que suporte <IE9.)
DaleyKD

Mais informações: "O Opera não dispara um evento de entrada após soltar o texto em um campo de entrada. O IE 9 não dispara um evento de entrada quando o usuário remove caracteres da entrada preenchida pelas operações de teclado, corte ou arraste". developer.mozilla.org/pt-BR/docs/Web/Events/…
tkane2000

Há um problema com este código. Se maxlength é definida no elemento de entrada, o evento 'input' é acionado mesmo quando o comprimento máximo é alcançado eo valor não é alterado
nivcaner

Mas por que não apenas duas funções separadas? Dessa forma, não há necessidade de verificar o tipo de evento ou o nome da propriedade. O código pode estar em uma terceira função compartilhada.
ADTC

17

Usando jQuery, os seguintes são idênticos em efeito:

$('a').click(function(){ doSomething(); });
$('a').on('click', function(){ doSomething(); });

Com o inputevento, no entanto, apenas o segundo padrão parece funcionar nos navegadores que testei.

Assim, você esperaria que isso funcionasse, mas NÃO (pelo menos atualmente):

$(':text').input(function(){ doSomething(); });

Novamente, se você quiser aproveitar a delegação de eventos (por exemplo, para configurar o evento #containerantes de sua input.textinclusão no DOM), isso deve ser lembrado:

$('#container').on('input', ':text', function(){ doSomething(); });

Infelizmente, novamente, NÃO funciona atualmente!

Somente esse padrão funciona:

$(':text').on('input', function(){ doSomething(); });

EDITADO COM MAIS INFORMAÇÕES ATUAIS

Certamente posso confirmar que esse padrão:

$('#container').on('input', ':text', function(){ doSomething(); });

AGORA FUNCIONA também, em todos os navegadores 'padrão'.


2

Como disse claustrofob, o oninput é suportado pelo IE9 +.

No entanto , "O evento oninput é incorreto no Internet Explorer 9. Ele não é acionado quando os caracteres são excluídos de um campo de texto pela interface do usuário apenas quando os caracteres são inseridos. Embora o evento onpropertychange seja suportado no Internet Explorer 9, mas da mesma forma que o evento oninput, também é de buggy, não é acionado na exclusão.

Como os caracteres podem ser excluídos de várias maneiras (teclas Backspace e Delete, CTRL + X, Recortar e Excluir no menu de contexto), não há uma boa solução para detectar todas as alterações. Se os caracteres forem excluídos pelo comando Excluir do menu de contexto, a modificação não poderá ser detectada em JavaScript no Internet Explorer 9. "

Eu tenho bons resultados vinculando a entrada e keyup (e keydown, se você deseja acionar no IE enquanto mantém pressionada a tecla Backspace).



1

Acho que 'input' simplesmente funciona aqui da mesma forma que 'oninput' no DOM Level O Event Model.

Aliás:

Assim como o silkfire comentou, eu também pesquisei no 'evento de entrada jQuery'. Assim, fui levado até aqui e fiquei surpreso ao saber que 'input' é um parâmetro aceitável para o comando bind () do jquery . No jQuery in Action (p. 102, 2008 ed.), 'Input' não é mencionado como um evento possível (contra outros 20, de 'blur' a 'unload'). É verdade que, na p. 92, pode-se supor o contrário da releitura (isto é, de uma referência a diferentes identificadores de string entre os modelos de nível 0 e nível 2). Isso é bastante enganador.


Obrigado pela contribuição (sem trocadilhos), este parece ser um tópico oficial agora! :)
silkfire 6/09/13

0

O jQuery possui a seguinte assinatura para o .on()método:.on( events [, selector ] [, data ], handler )

Eventos podem ser qualquer um dos listados nesta referência:

https://developer.mozilla.org/en-US/docs/Web/Events

No entanto, eles não são todos suportados por todos os navegadores.

A Mozilla declara o seguinte sobre o evento de entrada:

O evento de entrada DOM é acionado de forma síncrona quando o valor de um ou elemento é alterado. Além disso, é acionado em editores editáveis ​​por conteúdo quando seu conteúdo é alterado.


-8
$("input#myId").bind('keyup', function (e) {    
    // Do Stuff
});

trabalhando no IE e no chrome


bindé preterida, o usoon
Tushar
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.