Java Script - função onkeyup - shift + tab

Amigos estou com um conflito com o recurso SHIFT+TAB, que retrocede o cursor na navegação da tela. Quando o cursor retrocede para um desses campos que saltam automaticamente, ele volta para o campo posterior, pois o script de “saltar campo” entende que o campo está preenchido e não permite que o cursor lá permaneça; essa função em conjunto com o evento onkeyup acontece este problema. Alguém sabe como resolvo isso?


    if (campoAtual.value.length=="")
			campoProx.focus();
      
    }  
      
        }       

Ola,

Nao daria pra vc detectar quando o usuario preciona shift + tab, e setar alguma flag que vai evitar o cursor de pular de volta pro campo posterior??
Por exemplo, Para pegar o shift+tab no the onkeyup event, vc pode fazer alguma coisa desse tipo:

var _mudaCampo = true;

...

if(event.shiftKey && event.keyCode == 9) { 
     _mudaCampo = false;
}

Ai na funcao que faz o cursos salta pro proximo campo, vc verifica se _mudaCampo eh “true” se for vc salta pro proximo campo, se nao for, vc
seta _mudaCampo = true e nao faz nada.

function mudaCampo(campoAtual, tamTotal, campoProx) {    

     if(_mudaCampo == false) {
          _mudaCampo = true; // muda para true porque vc vai querer mudar de campo apos editar.
          return;
     }

     // faz o que tem que fazer na funcao e muda de campo.

}    

FONTE: https://developer.mozilla.org/en/DOM/event.shiftKey

Eu nao sei a implementacao do seu codigo, mas voce tera que definir essa flag em algum lugar que seja visivel onde ela sera utilizada, de repente ate funciona se vc passar como parametro para a funcao mudaCampo, por exemplo.

//Daniel

Amigo obrigado por responder, seguinte fiz da seguinte forma:

function mudaCampo(campoAtual, tamTotal, campoProx){
	
	var focusAnt = true;
	
			if (event.shiftKey && event.keyCode == 9) {   
     			focusAnt = false;
     			}
     			
     			if(facusAnt == false){
     	   		facusAnt = true;
     	   		return;	
     	   	}
     	  
     	   	if (campoAtual.value.length == tamTotal){
			campoProx.focus();
			}	
     	   
     	   			
     }  

porém agora ele não muda o foco quando edita todos os campos para próximo.

Renato,

Já utilizou JQuery? Ele é ótimo pra fezer isso que você precisa.

Abraços

[quote=RenatoFigueredo]
porém agora ele não muda o foco quando edita todos os campos para próximo.[/quote]

Ola,

Nao entendi o que voce quis dizer. Que nao esta mudando o foco quando vc quer mudar pro proximo campo??
Debuga com o firebug e verifica se o seu codigo esta chegando ate

campoProx.focus();  

Isso que vc a mudanca pro proximo campo nao eh??

//Daniel

Exatamente para retroceder com shift + tab está ok, porém quando completo a edição do campo ele não muda para o próximo campo, tem alguma ideia como faço isso?

Como vc faz pra mudar pro proximo campo?? Tab ?

Parece que tem um bug no seu codigo:

Voce definiu a variavel

var focusAnt = true;

e depois no if colocou

if(facusAnt == false)

facusAnt nao vai existir, provavelmente vc ta tento erro no seu console. muda para focusAnt e veja se resolve o problema.

Outra coisa:

if(facusAnt == false){  
    facusAnt = true;  
    return; 
}

Talvez algo desse tipo

function mudaCampo(campoAtual, tamTotal, campoProx){  
      
    var focusAnt = true;  
      
    if (event.shiftKey && event.keyCode == 9) {     
         focusAnt = false;  
    }  
                  
    if(focusAnt == false){  
         //focusAnt = true;  ** vc pode remover essa linha porque vc seta a variavel toda vez que a funcao eh chamada.
         return;   
     }  
            
     if (campoAtual.value.length == tamTotal){  
         campoProx.focus();  
     }                  
}

//Daniel

Ainda não funcionou, ele retrocede com shift + tab, porém não passa para o próximo campo; amigo muito obrigado ok, fazemos bem o que fazemos por que gostamos do que fazemos !
Vou ver se consigo pensar em outra solução.

VAMO LÁ GALERA… MOTIVAÇÃO JAVA NO SANGUE !!!

Ei,

Vc so muda pro proximo campo se o tamanho do valor do campo atual eh igual a “tamTotal”, certo??

if (campoAtual.value.length == tamTotal){    
    campoProx.focus();    
}                    

Se vc debuggar com o firebug ate esse pedaco length eh igual tamTotal???

Colocar antes desse if :

console.log("campoAtual length: " + campoAtual.value.length + " tamTotal = " + tamTotal);

E veja no console o resultado.

//Daniel

Sim cara ele conta o valor tamTotal e não coloca o próximo foco. estranho…

Como eu sou bonzinho :slight_smile: eu exemplo que eu fiz usando JQuery. Soh copiar e colar numa pagina e testar.

Nesse exemplo, no event onBlur eu adicionei codigo pra cachear o valor do campo. E no event keyPress verifica se o valor foi alterado, se foi alterado
e o tamanho do valor do campo chegar ao maximo, vai saltar pro proximo, caso contrario continua no mesmo campo.

Entao para testar, voce digita valores ate mudar o foco pro campo 2, pressione shit+tab pra voltar pro campo 1. Altere o campo ate chegar no limite pra fazer mudar o foco pro campo 2.

Sei que voce nao esta usando JQuery, mas da pra servir de inspiracao!

Enjoy! :slight_smile:

//Daniel

<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <script>  
  $(document).ready(function () {  
	$("input").bind("keypress", _keyPressHandler);
	$("input").blur(function() {
		$(this).attr({cachedValue: this.value});
	});
  }); 
  
  function _keyPressHandler(event) {  
	var _isDirty = ($(this).attr("cachedValue") != this.value);	
	if(this.value.length == $(this).attr("maxlength") && _isDirty) {
        // esse pedaco esta hardcoded mas vc pode mudar e pegar o nome do proximo
        // campo dinamicamente.
		if(this.id == "text1") {
			$("#text2").focus();
		}
	}
	else {
		return;
	}	
  } 
  </script>
</head>
<body>
Field 1 : <input type="text" ID="text1" maxlength="10"/><br><br>
Field 2 : <input type="text" ID="text2" maxlength="10"/><br>
<br>
<input type="submit" value="send"/>
</body>
</html>

Amigo em meu sistema não funcionou não, se tiver outra ideia serei grato .

windsofhell muito obrigado conseguimos, funcionou desta maneira; porém o cursor não fica visível no campo mas selecionado como campo atual onde o usário continua digitando.


function mudaCampo(campoAtual,tamTotal,campoProx){
     
     if (event.shiftKey == true && event.keyCode == 9){ 	   
     		campoAtual.value ="";//Pula para o campo e apaga
     		}
     	
     if(campoAtual.value.length == tamTotal){
			campoProx.focus();
			} 
      
}

Resolvido.

[quote=RenatoFigueredo]Amigos estou com um conflito com o recurso SHIFT+TAB, que retrocede o cursor na navegação da tela. Quando o cursor retrocede para um desses campos que saltam automaticamente, ele volta para o campo posterior, pois o script de “saltar campo” entende que o campo está preenchido e não permite que o cursor lá permaneça; essa função em conjunto com o evento onkeyup acontece este problema. Alguém sabe como resolvo isso?


    if (campoAtual.value.length=="")
			campoProx.focus();
      
    }  
      
        }       

[/quote]

Ah legal!!!

Fico feliz em ter ajudado!

Keep coding!

//Daniel