Esta es una solución. Probablemente no sea la mejor solución, pero parece que funciona mediante el operador módulo vejez al ciclo de las entradas:
(function() {
var inputs = $("#userInformation input[type=text]"),
i = 0,
length = inputs.length;
inputs.keyup(function(e) {
if ($(this).val().length == $(this).attr('maxlength')) {
i = ++i % length;
inputs[i].focus();
}
});
}());
Ejemplo: http://jsfiddle.net/jonathon/DysJe/
También he hecho un cambio en el selector para las entradas. En lugar de simplemente seleccionar el fieldset birthdate
, recojo todas las entradas en el formulario. Pega estos en una matriz y cíñelos centrándote en ellos. He puesto todo en su propio cierre para mantener las variables que he creado escondidas de todo lo demás.
Cuando llega a la última entrada, simplemente se detendrá (si maxlength
no está ajustado) o volverá a iniciar el enfoque al principio. Si no desea que se complete el ciclo, simplemente elimine el operador de módulo.
Se tiene un inconveniente, aunque: si el usuario no se centra en el primer elemento de entonces se ignorará esto y sólo tiene que ir a centrar el segundo, tercero, etc.
I hizo un poco más sobre esto y eliminó la necesidad de la otra variable. Este no funciona el siguiente sobre la marcha, está configurado desde el principio. Cada input
tiene su evento configurado para enfocar el siguiente elemento en la lista inputs
en lugar del siguiente elemento i
. No va a recorrer similar a la anterior pero se moverá correctamente por lo que si las lengüetas de usuario a la segunda, que va a pasar a la tercera, etc.
(function() {
var inputs = $("#userInformation input");
inputs.each(function(i, item) {
$(item).keyup(function() {
if ($(this).val().length == $(this).attr('maxlength') && inputs[i + 1]) {
inputs[i + 1].focus();
}
});
});
}());
http://jsfiddle.net/jonathon/TQzKS/
Es posible que desee configure el tabIndexes
para sus elementos de entrada también. No estoy al 100% en el orden en que jQuery devuelve los artículos; creo que podría estar basado en la estructura DOM. Si hay algo inusual en su pedido, entonces puede usar el valor tabIndex
del elemento para ordenar la lista inputs
antes de ejecutar la parte .each
.
Oh sí, y en ambos ejemplos establecí el evento keyup
para que se mueva tan pronto como termine de escribir.
No había encontrado este problema antes; una pregunta interesante (y ** + 1 **) =) –
Fuera de interés, ¿por qué asigna un manejador de teclas, dentro de un manejador de teclas? – Jamiec
Overlooked that one. – jack