c0dex, а ничего, что onchange отрабатывает после потери фокуса?
тут есть два очевидных подхода, но оба не так просты и хороши, как кажется на первый взгляд. это onkeydown/onkeyup. но понимание того, что это плохо, приходит тогда, когда понимаешь, что не всякое нажатие кнопки дает один символ в input и не всегда символы там появляются после нажатия кнопок.
Есть замечательный атрибут у input, maxlength. Вот но железно ограничивает кол-во введенных символов.
А чтобы перекидывать фокус, я бы с частотой в 300-400мс по setInterval проверял бы кол-во введенных символов в input и при достижении предела делал бы focus следующему. ну и делать setInterval нужно по onfocus, снимать соответственно по onblur.