Функция конечно перегружена, я бы её немного декомпозировал(но ладно, отдельная проблема).
Как минимум я вижу что не убираются слушатели событий, то точно нужны(перед добавлением)
те, возможно баг как раз в этом :
inputElement.removeEventListener("keydown", ...);
inputElement.removeEventListener("blur", ...);
И там лучше передать созданные функции типа handleKeydown/handleBlur
И еще нормально выделить гарды на проверку данных, те что
if (query.length < 3) {
return;
}
и другие
например с инпутом сразу:
if (!inputElement) return;
Короче пройтись, чтобы легче читалось и понимать что происходит.
Точнее сказать сразу сложно, без живой отладки. Если выгрузите где-то, будет понятнее.