Creo que debe haber una condición de carrera, pero no sé cómo solucionarlo.
Tengo varias ENTRADAS alineadas en fila, cada una con una longitud máxima = 1, y quiero moverme a través de ellas mientras el usuario escribe una letra alfabética:
/* jQuery 3.6.0 */ $("input").bind("keypress", function (e) { if (/[AZ]/i.test(e.key)) { /* breakpoint on this next line */ $(this).next('input').focus(); } });
Si coloco un punto de interrupción en la línea como se indica, el depurador se detiene allí como se esperaba, y si presiono [F5] para continuar, el enfoque avanza a la siguiente ENTRADA. Pero si elimino el punto de interrupción y ejecuto el programa normalmente, el foco no avanza.
El problema que tiene es que tiene una condición de carrera de la acción del evento y el enfoque. Puedes evitarlo con un tiempo de espera
$("input").bind("keypress", function(e) { if (/[AZ]/i.test(e.key)) { window.setTimeout(() => $(this).next('input').focus(), 0); } });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input type="text" /> <input type="text" /> <input type="text" /> <input type="text" /> <input type="text" />