29 abr
Postado por Wallace Gonçalves
Mais um artigo escrito por Tiago Dantas. Agradecemos novamente pela contribuição.
Autoria de Tiago Dantas ()
Introdução
Antigamente os sistemas funcionavam com a tecla ENTER para trocar de campo. Isso agilizava a digitação, pois uma tecla ENTER fica ao lado do teclado numérico e o outro ENTER geralmente tem um formato diferente. As aplicações web vêm ganhando um mercado cada vez maior, porém há essa dificuldade aonde existem pessoas que trabalhavam com sistemas aonde o ENTER era para trocar de campo e não se adaptam facilmente ao TAB para a troca de campos. Esse artigo descreve uma solução simples para transformar a tecla ENTER para a mudança de campos como o TAB em aplicações ASP.NET.
Solução
Para solucionar esse problema vamos criar um JavaScript que controla toda vez que a tecla ENTER for pressionada. Esse script verifica qual o próximo campo obedecendo a prioridade do TABINDEX quando existir. Então vamos ao que interessa. O código, seguindo os passos:


Adicione o código:
var podePost=true; //Variável que cancela o post no firefox
// Função principal
function ClicouEnter(evt)
{
evt = getEvent(evt);
if (getKeyCode(evt) != 13)
return true;
var elementAtivo = getTarget(evt);
if (!elementAtivo)
return true; // Se não tiver nenhum elemento ativo
if (!elementAtivo.type)
return true; // Se não tiver nenhum elemento ativo
if (elementAtivo.type.toLowerCase() == "submit" || elementAtivo.type.toLowerCase() == "button")
{
podePost = true;
elementAtivo.click();
return cancelaPost(evt);
}
var nextElement = null;
if (elementAtivo.tabIndex == 0)
nextElement = getNextElementByName(elementAtivo);
else
nextElement=getNextElementByTabIndex(elementAtivo);
if(nextElement)
{
var theForm = document.forms[0];
if(theForm.addEventListener)
theForm.addEventListener('submit', enviaForm, false); // Evento submit no form para FireFox
if (nextElement.type.toLowerCase() == "submit" || nextElement.type.toLowerCase() == "button")
{
if (elementAtivo.tabIndex == 0)
return true;
podePost = true;
nextElement.click();
return cancelaPost(evt);
}
podePost = false;
nextElement.focus();
return cancelaPost(evt);
}
else
{
podePost=true;
return true;
}
}
// Função para cancelar o envio do form para o FireFox
function enviaForm(evt)
{
if (!podePost)
{
evt.cancelBubble = true;
evt.returnValue = false;
if (evt.preventDefault)
evt.preventDefault();
if (evt.stopPropagation)
evt.stopPropagation();
podePost = true;
return false;
}
else
return true;
}
function cancelaPost(evt)
{
evt.cancelBubble = true;
evt.returnValue = false;
if (evt.preventDefault)
evt.preventDefault();
if (evt.stopPropagation)
evt.stopPropagation();
return false;
}
// Recupera o evento do form
function getEvent(evt)
{
if( !evt ) evt = window.event; //Internet Explorer
return evt;
}
// Recupera o elemento que está com o foco
function getTarget(evt)
{
var target;
if (evt.srcElement)
target = evt.srcElement;
else if (evt.target)
target = evt.target;
return target;
}
// Recupera o código da tecla que foi pressionado
function getKeyCode(evt)
{
var code;
if(typeof(evt.keyCode) == 'number')
code = evt.keyCode;
else if(typeof(evt.which) == 'number')
code = evt.which;
else if(typeof(evt.charCode) == 'number')
code = evt.charCode;
else
return 0;
return code;
}
// Recupera o elemento deacordo com o TabIndex
function getElementByTabIndex(tabIndex)
{
var form = document.forms[0];
for( var i=0; i < form.elements.length; i++ )
{
var el = form.elements[i];
if( el.tabIndex && el.tabIndex == tabIndex )
return el;
}
return null;
}
// Recupera o próximo elemento de acordo com o nome
function getNextElementByTabIndex(elementAtivo)
{
var targetTabIndex = elementAtivo.tabIndex;
var nextTabIndex = targetTabIndex+1;
var nextElement = getElementByTabIndex(nextTabIndex);
// Margem de erro
var i=0;
for(i=0; i < 15; i++) // Tolerância de tabIndex
{
if (nextElement!=null && !nextElement.disabled)
break;
nextTabIndex = nextTabIndex+1;
nextElement = getElementByTabIndex(nextTabIndex);
}
return nextElement;
}
// Recupera o próximo elemento de acordo com o nome
function getNextElementByName(elementAtivo)
{
var passou=false;
var form = document.forms[0];
for(var i=0; i < form.elements.length; i++)
{
var el = form.elements[i];
if( el && el.id == elementAtivo.id || passou)
{
passou=true;
// Encontrou o elemento atual
var x=i+1;
var elnx = form.elements[x];
if(elnx)
{
switch (elnx.type)
{
case "text":
case "submit":
case "button":
case "reset":
case "select-one":
case "checkbox":
case "image":
case "password":
case "radio":
case "reset":
case "submit":
case "textarea":
if (elnx.disabled)
continue;
break;
default:
continue;
break;
}
return elnx;
}
}
}
return null;
}
O código acima verifica se o ENTER foi pressionado e dá o foco em no próximo campo. Quando existir o TABINDEX no campo ele verifica o próximo campo respeitando uma tolerância dos 15 próximos. Exemplo: você pode ter um campo com TABINDEX 1 e o próximo campo pode ser até TABINDEX 15.

A classe BaseWebUI ficará assim:
public class BaseWebUI : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
if ((new AppSettingsReader()).GetValue("EnterComoTab", typeof(string)).ToString() == "true")
{
ClientScript.RegisterStartupScript(typeof(void), "entertab", "if (typeof(ClicouEnter) == 'function') document.onkeydown = ClicouEnter;", true);
}
base.OnInit(e);
}
}
A classe herda da System.Web.UI.Page e sobrescreve o método OnInit (que é executado toda vez que a página é carregada). O método onInit associa à função ClicouEnter no evento onkeydown da página, essa associação é feita caso a chave EnterComoTab do web.Config estiver como true.

Abra o arquiVo Default.aspx e entre as tags Head coloque a referência ao arquivo MSGAguarde.js

Pronto! Agora todo vez que for pressionado o ENTER o JavaScript verifica qual o próximo campo para dar o foco.
Teste
Para testar nossa aplicação vamos criar 2 TextBox e um botão do asp.net na Default.aspx e dê dois cliques para digitar o código do evento click. E escreva o seguinte código:
TextBox1.Text = “Clicou”;
O código serve para quando o botão for acionado o sistema escreve a mensagem “Clicou” no primeiro TextBox criado. No evento Page_Load escreva o seguinte código:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
TextBox1.Focus();
Page.Form.DefaultButton = Button1.UniqueID;
}
O código acima seta o foco no TextBox1 quando a página é carregada e seta o botão Button1 como botão padrão, isso faz quando o ENTER for pressionado o botão será clicado. Essa estrutura é do próprio ASP.NET.
Execute e o foco inicial será o TextBox1, aperte a tecla ENTER e o sistema dá o foco no TextBox2, pressione o ENTER mais uma vez e o botão será clicado.
Conclusão
Um software quando é usado para a digitação constante exige agilidade, tem que ter teclas de atalho e uma estrutura para que não se use o mouse. O ENTER como TAB resolve o problema de adaptação mais simples dos usuários com sistemas WEB. Essa solução funciona em Internet Explorer e Mozila FireFox e adapta facilmente a sua aplicação. Todo programador ou analista recebe algumas reclamações sobre alguns problemas, como o ENTER como TAB, e tentam convencer o usuário que isso não é um problema e que as tendências novas são diferentes. Isso gera uma insatisfação do cliente que pode comprometer e muito o projeto. Lembre-se, o cliente tem sempre a razão.
Você pode também baixar o Código Fonte.
Um grande abraço!
Deixe um comentário