Como posso verificar o novo valor de um campo de texto no KeyPress?
-
21-09-2019 - |
Pergunta
Eu tenho um único campo de formulário e preciso detectar quando o campo muda e executar algum código adicional usando o novo valor do campo. Eu só quero executar o código se a tecla pressionada realmente alterar o valor da caixa de texto. Aqui está a solução que eu criei.
function onkeypress(e) {
var value = this.value;
// do something with
}
function onkeyup(e) {
if ( e.which == 8 || e.keyCode == 46 ) { // delete or backspace keys
this.onkeypress(e);
}
}
Há apenas um problema. OnKeyPress é disparado antes que o valor do campo seja atualizado; portanto, quando eu pego o valor, estou obtendo o valor anterior. Eu usaria o KeyUp exclusivamente se soubesse uma maneira de testar se a chave mudou o valor ou não, mas alguns caracteres (como as teclas de seta) não têm efeito no valor do campo.
Alguma ideia?
Solução
A maneira como faço isso é simplesmente com uma variável ao longo das linhas de prevValue
. No final da função Pression Press, armazene o valor nessa variável e execute apenas a função novamente se o valor não for igual a esse valor anterior.
Outras dicas
Isso é fácil, basta usar onkeyup em vez de onkeypress
tem outro condicional:
if(e.keyCode > 31 && e.keyCode < 127) {
value = this.value + e;
}
Isso pegaria qualquer símbolo ASCII de baixo nível inserido pelo teclado fora da linha de char especial.
Editar: (32 é espaço)
function onkeyup(e) {
if ( e.which == 8 || e.keyCode == 46 ) { // delete or backspace keys
switch(e.keyCode) {
case 32:
case 48..90:
case 96..111:
case 188:
case 190..192:
case 219..222:
value = this.value + e;
break;
default:
break;
}
this.onkeypress(e);
}
}
Aqui está minha solução final, que usa uma variável PrevValue, mas não poluia o espaço de nome global (janela) ou as propriedades do elemento DOM.
(function() {
var input = document.getElementById('input_box'),
prevValue;
input.onkeyup = function(e) {
if ( this.value != prevValue ) {
prevValue = this.value;
// execute some more code here...
}
}
}());
Observe acima que a função onkeyup serve como um fechamento em torno da variável PrevValue. Isso impede a poluição do espaço para nome, para que eu não precise criar uma variável global ou anexar uma propriedade ao próprio elemento de entrada. Isso é o mais elegante possível. Na verdade, escrevi o meu em jQuery, mas pensei que a resposta em si deveria ser pura JavaScript ...
É uma espécie de hack, mas você pode colocar o valor anterior em uma propriedade da caixa de texto (chamada "Expando Atributos")
function onkeypress(e) {
this.oldvalue = this.value;
}
function onkeyup(e) {
if (this.value != this.oldvalue) {
// do something
}
}
Você pode armazenar o valor antigo e detectar se isso mudou:
function keyUpHandle(e) {
if (this.prevValue && this.prevValue != this.value) {
// do something
}
this.prevValue = this.value;
}