Когда я устанавливаю событие для input keydown, то оно срабатывает после второго нажатия на клавишу, приходится использовать событие keyup, но визуально keyup чуть медленнее работает, потому что срабатывает после отпускания кнопки.
Почему так происходит с событием keydown и какое есть решение?
Ты делаешь что-то не так либо каким-то другом куском кода все запорол и удивляешься. Размести минимальный рабочий пример, где есть эта неприятность. На jsfiddle.com например.
Из вашего кода понятно, то что вы слушаете не тот эвент, слушайте 'change' и 'input'.
После того как сработал 'keydown', вы пытаетесь вытянуть значение из поля, которое ещё не успевает обновится, и тем самым, когда функция fninput срабатывает первый раз, поле ещё пустое.