- Обрабатываете не то событие - должно быть
blur
, а не focus
- Пытаетесь вызвать
toUpperCase
не у строки, а у массива - забыто [0]
- Возвращаете результат в никуда, вместо того, чтобы установить значение инпута
И вообще, всё это делается гораздо короче:
input.addEventListener('blur', function() {
const value = this.value.trim();
if (value) {
this.value = value
.split(/\s+/)
.map(n => n[0].toUpperCase() + n.slice(1))
.join(' ');
}
});
// или
input.addEventListener('blur', ({ target: t }) => {
t.value = t.value
.trim()
.replace(/\s+/g, ' ')
.replace(/(^|\s)\S/g, m => m.toUpperCase());
});