Создание функции
Написал код, который из массива стран, выводит в алфавитном порядке выпадающий из инпута список-подсказок стран при вводе первой буквы в инпут. При вводе второй и т.д. букв список соответственно сокращается. Как можно заменить говнокод для выбора нужной страны из списка на нормальную функцию через обработчик событий? Дело в том, что он встраивает функцию в HTML (строка 68-70) через функцию (строка 81-83).
let input = document.getElementById('input'), spans = document.getElementById('list').getElementsByTagName('span'), list = document.getElementById('list'), countryChoice, reg, selected; //Привязываем изменение в инпуте по отжатию клавиши через обработчик событий input.addEventListener('keyup', function() { inputChange();//Активируем функцию отслеживания изменений в инпуте }); //Функция отслеживания изменений в инпуте function inputChange(e) { e = e || window.event; //Отслеживание нажатия стрелки вниз if (e.keyCode === 40) { selected = -1; //Перебор выпадающего списка и перемещение по нему вниз стрелкой курсора for (let i = 0; i <= spans.length; i++) if (i in spans && spans[i].className === 'selected') { spans[i].className = ''; selected = i; } selected++; for (let i = 0; i <= spans.length; i++) if (i in spans && i === selected) { spans[i].className = 'selected'; } //Отслеживание нажатия стрелки вверх } else if (e.keyCode === 38) { selected = spans.length; //Перебор выпадающего списка и перемещение по нему вверх стрелкой курсора for (let i = 0; i <= spans.length; i++) if (i in spans && spans[i].className === 'selected') { spans[i].className = ''; selected = i; } selected--; for (let i = 0; i <= spans.length; i++) if (i in spans && i === selected) { spans[i].className = 'selected'; } //Отслеживание нажатия Enter } else if (e.keyCode === 13) { //Перебор выпадающего списка и введение в инпут выбранной страны через Enter for (let i = 0; i <= spans.length; i++) if (i in spans && spans[i].className === 'selected') { input.value = spans[i].textContent; list.textContent = ''; } } else { list.textContent = ''; //Функция проверки выбранной страны на соответствие регулярному выражению if (input.value.length > 0) { countries.forEach(function(e, i) { //Регулярное выражение reg = new RegExp('^' + input.value, 'i'); //При соответствии регулярному выражению в HTML вставляется функция для выбора страны через клик if (e.match(reg)) { countryChoice = "choiceCountry('" + countries[i] + "')"; list.innerHTML += '<span onclick="' + countryChoice + '">' + countries[i] + '</span><br />'; } }); } } //Перебор выпадающего списка стран для смены курсора на указательный палец for (let i = 0; i < spans.length; i++) { spans[i].style.cursor = 'pointer'; } //Задание переменной функции вывода выбранной по клику страны в инпут choiceCountry = function(chosenCountry) { input.value = chosenCountry; list.textContent = ''; }; } |
DVV,
поставьте только один обработчик клика на list Делегирование событий примеры автокомплита http://javascript.ru/forum/misc/4281...da-v-pole.html поиск о форуму подскажет другие варианты и на всякий случай http://jqueryui.com/autocomplete/ |
Спасибо, все получилось))
|
Часовой пояс GMT +3, время: 11:12. |