Na minha experiência, o input type="text"
onchange
evento geralmente ocorre somente depois que você sai ( blur
) do controle.
Existe uma maneira de forçar o navegador a disparar onchange
sempre que o textfield
conteúdo for alterado? Caso contrário, qual é a maneira mais elegante de rastrear isso "manualmente"?
O uso de onkey*
eventos não é confiável, pois você pode clicar com o botão direito do mouse no campo e escolher Colar, e isso mudará o campo sem nenhuma entrada do teclado.
É setTimeout
o único caminho? .. Feio :-)
javascript
html
forms
Ilya Birman
fonte
fonte
Respostas:
Atualizar:
Veja Outra resposta (2015).
Resposta original de 2009:
Então, você deseja que o
onchange
evento seja acionado com pressionamento de tecla, desfoque e cole? Isso é mágico.Se você deseja acompanhar as alterações à medida que digitam, use
"onkeydown"
. Se você precisar interceptar as operações de colar com o mouse, use"onpaste"
( IE , FF3 ) e"oninput"
( FF, Opera, Chrome, Safari 1 ).1 Quebrado para
<textarea>
no Safari. Use emtextInput
vez dissofonte
onkeypress
deve ser usado em vez deonkeydown
.onkeydown
é acionado quando uma tecla é pressionada. Se um usuário mantiver pressionada uma tecla, o evento será acionado apenas uma vez para o primeiro caractere.onkeypress
é acionado sempre que um caractere é adicionado ao campo de texto.onchange
fogo em todas essas ações.<input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">
fará bem o suficiente para a maioria.$().on('change keydown paste input', function() {})
Estes dias escutam
oninput
. Parece queonchange
sem a necessidade de perder o foco no elemento. É HTML5.É suportado por todos (inclusive dispositivos móveis), exceto o IE8 e abaixo. Para o IE, adicione
onpropertychange
. Eu uso assim:fonte
oninput
IE9, mesmo que parcial, é parcial ( caniuse.com/#feat=input-event ).innerText
no lugar de,innerHTML
para que nenhuma marcação seja renderizadaO código abaixo funciona bem para mim com o Jquery 1.8.3
HTML:
<input type="text" id="myId" />
Javascript / JQuery:
fonte
keydown
porque duplicará o valor da entrada, remova-o.Javascript é imprevisível e engraçado aqui.
onchange
ocorre apenas quando você desfoca a caixa de textoonkeyup
&onkeypress
nem sempre ocorre na alteração de textoonkeydown
ocorre na alteração do texto (mas não pode acompanhar recortar e colar com um clique do mouse)onpaste
&oncut
ocorre com a tecla pressionada e até com o botão direito do mouse.Então, para acompanhar a mudança na caixa de texto, precisamos
onkeydown
,oncut
eonpaste
. No retorno de chamada desses eventos, se você verificar o valor da caixa de texto, não receberá o valor atualizado, pois o valor é alterado após o retorno de chamada. Portanto, uma solução para isso é definir uma função de tempo limite com um tempo limite de 50 mili-segundos (ou pode ser menor) para rastrear a alteração.Este é um truque sujo, mas é o único caminho, como pesquisei.
Aqui está um exemplo. http://jsfiddle.net/2BfGC/12/
fonte
oninput
etextInput
são os eventos que são a solução real para isso, mas não são suportados por todos os navegadores.onkeyup
eonkeydown
, que são semelhantes. Ambos podem capturar as teclas Ctrl, Alt, Shift e Meta. Quanto ao terceiro ponto, suponho que você quis dizeronkeypress
.onkeyup
acontece depois que você digita, por exemplo, eu pressionot
quando levanto o dedo a ação acontece, maskeydown
a ação acontece antes de digitar o caracteret
Espero que isso seja útil para alguém.
Então
onkeyup
é melhor para quando você deseja enviar o que você acabou de digitar agora.fonte
Eu tinha um requisito semelhante (campo de texto no estilo twitter). Usado
onkeyup
eonchange
.onchange
na verdade, cuida das operações de colar do mouse durante o foco perdido do campo.[Atualização] No HTML5 ou posterior, use
oninput
para obter atualizações de modificação de caracteres em tempo real, conforme explicado em outras respostas acima.fonte
oninput
é o caminho a percorrer. Mas, quando eu implementada, HTML5 não existia e tivemos IE 8 :( Eu aprecio sua atualização, pois fornece informações up-to-date para os usuários..Eu acho que em 2018 é melhor usar o
input
evento.-
Como a especificação WHATWG descreve ( https://html.spec.whatwg.org/multipage/indices.html#event-input-input ):
-
Aqui está um exemplo de como usá-lo:
fonte
Se você usa APENAS o Internet Explorer, pode usar o seguinte:
Espero que ajude.
fonte
existe uma solução bastante próxima (não corrija todas as maneiras de colar), mas a maioria delas:
Ele funciona tanto para entradas quanto para áreas de texto:
Faça assim:
Como eu disse, nem todas as maneiras de colar acionam um evento em todos os navegadores ... o pior é que alguns não acionam nenhum evento, mas os Temporizadores são horríveis de serem usados para isso.
Mas a maioria das maneiras de Colar é feita com teclado e / ou mouse; portanto, normalmente uma ativação ou ativação do mouse são acionadas após uma colagem, também a ativação da ativação ao digitar no teclado.
Verifique se o código de verificação não leva muito tempo ... caso contrário, o usuário fica com uma impressão ruim.
Sim, o truque é acionar a tecla e o mouse ... mas cuidado, ambos podem ser acionados, então lembre-se disso !!!
fonte
Por favor, julgue a próxima abordagem usando o JQuery:
HTML:
Javascript (JQuery):
fonte
"input" funcionou para mim.
fonte
Você pode usar as
keydown
,keyup
ekeypress
eventos também.fonte
Para rastrear cada uma, tente este exemplo e reduza completamente a taxa de piscada do cursor para zero.
onblur: evento gera na saída
onchange: evento gera na saída se houver alguma alteração feita no texto de entrada
onkeydown: o evento é gerado com qualquer pressionamento de tecla (também por muito tempo)
onkeyup: evento gera em qualquer liberação de chave
onkeypress: o mesmo que onkeydown (ou onkeyup), mas não reagirá com ctrl, backsace, alt outros
fonte
2018 aqui, é isso que eu faço:
Se você puder apontar falhas nessa abordagem, ficaria grato.
fonte
Método 1: Adicionar um ouvinte de evento para
input
:Método 2: Defina a
oninput
propriedade com JavaScript:Método 3: Defina a
oninput
propriedade com HTML:fonte
O addEventListener de Robert Siemer não é suportado no IE8.
"As versões anteriores do IE suportavam um método EventTarget.attachEvent () equivalente e proprietário." https://developer.mozilla.org/it/docs/Web/API/Element/addEventListener
fonte