Há muitas maneiras pelas quais o valor de um <input type="text">
pode mudar, incluindo:
- pressionamentos de tecla
- copiar colar
- modificado com JavaScript
- preenchido automaticamente pelo navegador ou uma barra de ferramentas
Quero que minha função JavaScript seja chamada (com o valor de entrada atual) sempre que for alterada. E quero que seja chamado imediatamente, não apenas quando a entrada perder o foco.
Estou procurando a maneira mais limpa e robusta de fazer isso em todos os navegadores (usando o jQuery de preferência).
javascript
jquery
html
Dustin Boswell
fonte
fonte
Respostas:
Esse código jQuery captura alterações imediatas em qualquer elemento e deve funcionar em todos os navegadores:
fonte
input
é o evento HTML5 que, acredito, deve abranger todos os navegadores modernos ( referência MDN ).keyup
deve pegar o resto, embora com um pequeno atraso (input
é acionado ao pressionar a tecla).propertychange
é um evento proprietário da MS e não tenho certeza sepaste
é realmente necessário.document.getElementById('txtInput').value = 'some text';
input
evento aqui afirma que ele não é acionado quando o conteúdo é modificado via JavaScript. No entanto, oonpropertychange
evento faz fogo sobre a modificação via JS (ver aqui ). Portanto, esse código funcionará quando o conteúdo for modificado via JS no IE, mas não funcionará em outros navegadores.Uma solução sofisticada em tempo real para jQuery> = 1.9
se você também deseja detectar o evento "clique", basta:
se você estiver usando jQuery <= 1.4, basta usar em
live
vez deon
.fonte
Infelizmente, acho que
setInterval
ganha o prêmio:É a solução mais limpa, com apenas 1 linha de código. Também é o mais robusto, já que você não precisa se preocupar com todos os diferentes eventos / maneiras pelas quais uma pessoa
input
pode obter um valor.As desvantagens de usar 'setInterval' não parecem se aplicar neste caso:
fonte
A ligação ao
oninput
evento parece funcionar bem na maioria dos navegadores sãos. O IE9 também suporta, mas a implementação é incorreta (o evento não é acionado ao excluir caracteres).Com o jQuery versão 1.7+, o
on
método é útil para vincular ao evento como este:fonte
oninput
evento não funciona cominput[type=reset]
ou javascript edição como você pode ver neste teste: codepen.io/yukulele/pen/xtEpbResposta de 2017 : o evento de entrada faz exatamente isso para algo mais recente que o IE8.
fonte
input
evento está falhando ao detectar alterações no JS.Infelizmente, não há evento ou conjunto de eventos que atenda aos seus critérios. As teclas pressionadas e copiar / colar podem ser tratadas com o
keyup
evento. Mudanças no JS são mais complicadas. Se você tem controle sobre o código que define a caixa de texto, sua melhor aposta é modificá-lo para chamar sua função diretamente ou acionar um evento do usuário na caixa de texto:Se você não tiver controle sobre esse código, poderá usar
setInterval()
para 'observar' a caixa de texto para alterações:Esse tipo de monitoramento ativo não captura as atualizações 'imediatamente', mas parece ser rápido o suficiente para que não haja atraso perceptível. Como DrLouie apontou nos comentários, essa solução provavelmente não se ajusta bem se você precisar observar muitas entradas. Você sempre pode ajustar o 2º parâmetro
setInterval()
para verificar com mais ou menos frequência.fonte
myTextBox.value = 'foo';
nenhum evento JavaScript lida com essa situação.input.onpropertychange
e o FF2 +, Opera 9.5, Safari 3 e Chrome 1 podem lidar com issoinput.__defineSetter__('value', ...)
( com o qual, embora esteja documentado como não funcional nos nós do DOM, posso verificar funciona). A única divergência em relação à implementação do IE é que o IE aciona o manipulador não apenas na configuração programática, mas também durante os principais eventos.Aqui está uma solução ligeiramente diferente se você não gostou de nenhuma das outras respostas:
Considere que você não pode confiar em cliques e teclas para capturar a colagem do menu de contexto.
fonte
$("input[id^=Units_]").each(function() {
Adicione esse código em algum lugar, isso fará o truque.
A solução encontrada em val () não aciona change () no jQuery
fonte
Eu criei uma amostra. Que funcione para você.
http://jsfiddle.net/utbh575s/
fonte
Na verdade, não precisamos configurar loops para detectar alterações em javaScript. Já configuramos muitos ouvintes de eventos para o elemento que queremos detectar. apenas desencadear qualquer evento não prejudicial fará o trabalho.
e ofc isso só estará disponível se você tiver o controle total das alterações de javascript no seu projeto.
fonte
Bem, a melhor maneira é cobrir essas três bases que você listou por si mesmo. Um simples: onblur,: onkeyup, etc não funcionará para o que você deseja, então apenas combine-os.
O KeyUp deve abranger os dois primeiros e, se o Javascript estiver modificando a caixa de entrada, espero que seja o seu próprio javascript, portanto, basta adicionar um retorno de chamada na função que o modifica.
fonte
Aqui está um exemplo de trabalho que estou usando para implementar uma variação de preenchimento automático e preenche um seletor jqueryui (lista), mas não quero que ele funcione exatamente como o preenchimento automático jqueryui que faz um menu suspenso.
fonte
NO JQUERY! (É meio obsoleto nos dias de hoje)
Editar: eu removi os eventos HTML. NÃO use eventos HTML ... use ouvintes de eventos Javascript.
fonte
Você não pode simplesmente usar o
<span contenteditable="true" spellcheck="false">
elemento no lugar de<input type="text">
?<span>
(comcontenteditable="true" spellcheck="false"
como atributos) distingue-se<input>
principalmente por:<input>
.value
propriedade, mas o texto é renderizado comoinnerText
e faz parte de seu corpo interno.<input>
embora não seja, embora você defina o atributomultiline="true"
.Para obter a aparência, é claro, você pode estilizá-la em CSS, enquanto escreve o valor que
innerText
você pode obter para um evento:Aqui está um violino .
Infelizmente, há algo que realmente não funciona no IE e no Edge, que não consigo encontrar.
fonte
Embora essa pergunta tenha sido publicada há 10 anos, acredito que ainda precise de algumas melhorias. Então aqui está a minha solução.
O único problema com esta solução é que ela não será acionada se o valor mudar de como o javascript
$('selector').val('some value')
. Você pode disparar qualquer evento para o seu seletor quando alterar o valor do javascript.fonte
você pode ver este exemplo e escolher quais são os eventos que lhe interessam:
fonte
Talvez eu esteja atrasado para a festa aqui, mas você não pode apenas usar o evento .change () fornecido pelo jQuery.
Você deve ser capaz de fazer algo como ...
Você sempre pode vinculá-lo a uma lista de controles com algo como ...
O fichário ativo garante que todos os elementos que existem na página agora e no futuro sejam tratados.
fonte
Esta é a maneira mais rápida e limpa de fazer isso:
Estou usando o Jquery ->
Está funcionando muito bem para mim.
fonte