const inputs = [...document.getElementsByClassName('inputs')];
function onInput() {
if (this.value.length === this.maxLength) {
inputs[-~inputs.indexOf(this)]?.focus();
}
if (inputs.every(n => n.value.length === n.maxLength)) {
console.log('ВСЕ ЗАПОЛНЕНЫ');
}
}
for (const n of inputs) {
n.addEventListener('input', onInput);
}
или
const inputs = document.querySelectorAll('.inputs');
inputs.forEach(function(n) {
n.addEventListener('input', this);
}, function({ target: t }) {
const isFilled = t.value.length === t.maxLength;
if (isFilled) {
t.nextElementSibling?.focus();
}
if (this[isFilled ? 'add' : 'delete'](t).size === inputs.length) {
console.log('ВСЕ ЗАПОЛНЕНЫ');
}
}.bind(new Set));
или, также будем учитывать содержимое атрибута
pattern - меняем тег родительского элемента с
div на
form, инпутам добавляем атрибут
required, и
document.querySelector('form').addEventListener('input', e => {
if (e.target.checkValidity()) {
e.target.nextElementSibling?.focus();
}
if (e.currentTarget.checkValidity()) {
console.log('ВСЕ ЗАПОЛНЕНЫ');
}
});