Ver Mensaje Individual
  #1 (permalink)  
Antiguo 29/04/2009, 08:39
diegoturriaga
 
Fecha de Ingreso: noviembre-2004
Ubicación: Buenos Aires
Mensajes: 34
Antigüedad: 20 años, 2 meses
Puntos: 0
Pregunta controlar tabulación

Les dejo una función que acabo de escribir para controlar el cursor en un formulario, básicamente en cada control del form se debe llamar a la función controladora que es la encargada de cambiar el foco al control anterior ó siguiente... hasta aquí todo bonito, salvo que no siempre funciona como debiera

Código:
function cambiarFoco(ctrl, idAnt, idSig)
{
	// extrae el codigo de la tecla presionada
	var e = window.event;
	var cod = (e.keyCode) ? e.keyCode : e.which;
	// comprueba se haya presionado una tecla capturable que mueva el foco a otro control
	if (cod!=9) return true;
	// decide si el cambio de foco es automático (1 parámetro) o si se utilizaran IDs de destino (3 parámetros)
	var auto = (arguments.lengt==1) ? true : false;
	if (!auto) {
		// determina si se mueve hacia adelante o hacia atrás
		if (e.shiftKey) {
			// accede al control anterior
			var ant = document.getElementById(idAnt);
			// comprueba si puede recibir el foco		
			if (ant.disabled==true || ant.type=='hidden' || ant.style.visibility=='hidden' || ant.style.display=='none') {
				// le pasa el foco al control anterior
				ant.onkeydown();
			}
			else {
				// le pasa el foco al control
				ant.focus();
			}
		}
		else {
			// accede al siguiente control
			var sig = document.getElementById(idSig);
			// comprueba si puede recibir el foco
			if (sig.disabled==true || sig.type=='hidden' || sig.style.visibility=='hidden' || sig.style.display=='none') {
				// le pasa el foco al siguiente control
				sig.onkeydown();
			}
			else {
				// le pasa el foco al control
				sig.focus();
			}
		}
	}
	return false;
}
y les dejo una página de prueba:
Código HTML:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script language="JavaScript" type="text/javascript" src="forms.js"></script>
</head>
<body>nombre:*<input type="text" id="nombre" name="nombre" onKeyDown="return cambiarFoco(this,'ok','apellido');">
teléfono: <input type="text" id="telfax" name="telfax" onKeyDown="return cambiarFoco(this,'apellido','calle');"><br><br>
apellido:*
<input type="checkbox" onclick="document.getElementById('apellido').disabled = this.checked;"><input type="text" id="apellido" name="apellido" onKeyDown="return cambiarFoco(this,'nombre','telfax');"><br><br>
calle:* <input type="text" id="calle" name="calle" onKeyDown="cambiarFoco(this,'telfax','nrocalle')"> nro: <input type="text" id="nrocalle" name="nrocalle" onKeyDown="return cambiarFoco(this,'calle','ok');">
<br>
<br>
<input type="button" value="button" id="ok" name="ok" onclick="alert('hola!');" " onKeyDown="return cambiarFoco(this,'nroCalle','nombre');">
</body>
</html> 
Tips:
- estoy usando el evento onKeyDown para poder cancelar al efecto normal de la tecla TAB (devolviendo false)
- al presionar Tab se debiera saltar al siguiente
- al presionar Shift+Tab se invierte el orden y debiera saltar al anterior
- si el control destino esta oculto o deshabilitado se lo debería ignorar

Bueno, eso es todo... si alguien me ayuda a depurarle los errores se lo agradeceré saludos!