Показать сообщение отдельно
  #1 (permalink)  
Старый 22.08.2018, 06:08
DVV DVV вне форума
Кандидат Javascript-наук
Отправить личное сообщение для DVV Посмотреть профиль Найти все сообщения от DVV
 
Регистрация: 26.12.2017
Сообщений: 125

Создание функции
Написал код, который из массива стран, выводит в алфавитном порядке выпадающий из инпута список-подсказок стран при вводе первой буквы в инпут. При вводе второй и т.д. букв список соответственно сокращается. Как можно заменить говнокод для выбора нужной страны из списка на нормальную функцию через обработчик событий? Дело в том, что он встраивает функцию в 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 = '';
  };
}
Ответить с цитированием