БлогNot. Javascript: поиск и автоматический переход в большом списке без JQuery

Javascript: поиск и автоматический переход в большом списке без JQuery

Одна из распространённых проблем web-программирования (особенно во всякого рода админках) - это необходимость выбирать нужный пункт из длинного HTML-списка <select>.

Во-первых, листать длинный список неудобно. Во-вторых, даже не очень большие списки (сотни элементов) некоторые браузеры (тот же Chrome) начинают отображать с глюками прокрутки.

В лучшем случае, в помощь себе мы имеем встроенный современными браузерами автоматический переход по первой букве ввода - то есть, если мы при выделенном на странице списке наберём "Б", то попадём на первый элемент списка с одержимым тега <option>, начинающимся на эту букву, и т.д. Увы, переход по введённой части слова в этом случае уже не работает. Тем более, я хочу, чтоб эта была любая часть слова, а не только начало.

Наверное, можно поискать решение на JQuery, но проще написать несколько строчек кода без него.

Из соображений максимальной простоты, обработчик события от клавиатуры onKeyUp, автоматически работающий с тегом списка <select>, мы не будем пытаться модифицировать, а просто разместим слева от списка поле ввода <input type="text">, в которое юзер может вводить нужную часть названия искомого пункта. При этом будет совершаться автоматический переход на первый подходящий пункт списка.

Ниже приводится законченный пример формы и обработчика события. Попробуйте ввести, например, "п", а затем "понк" :)

Код в работе (нужен включённый в браузере JavaScript):

Не получиться могло только в том случае, если Ваш браузер не понимает кодировку Windows-1251, установленную на этой странице. Тогда попробуйте "g" латинскую.

Полный листинг скрипта:

<script type="text/javascript">
 function lowercase (val) {
  var upper="QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ";
  var lower="qwertyuiopasdfghjklzxcvbnmйцукенгшщзхъфывапролджэячсмитьбюё";  
  var c,t,s='';
  for (var i=0; i<val.length; i++) {
   c=val.substring(i,i+1);
   t=upper.indexOf(''+c);
   if (t>-1) c=lower.substring(t,t+1); 
   s+=c;
  }
  return s;
 }
 function list_select () {
  var a = document.getElementById('user_id');
  var b = lowercase(document.getElementById('input').value); 
  for (i=0; i<a.options.length; i++) {
   if (lowercase(a.options[i].innerHTML).indexOf(b)>-1) {
    a.options[i].selected = true; return; 
   }
  }
 }
</script>
<form>
<input id="input" onkeyup = "list_select()">
<select id="user_id" size="1">
 <option value="1">Alpha</option>
 <option value="2">Alux</option>
 <option value="3">Beta</option>
 <option value="4">Bepa</option>
 <option value="5">Gamma</option>
 <option value="6">Пончик</option>
 <option value="7">Понка</option>
 <option value="8">Бяша</option>
</select>
</form>

В отличие от стандартного метода indexOf, код не различает большие и маленькие буквы за счёт собственной реалзиации метода lowercase (перевод латинских и русских букв в маленькие; при необходимости преобразуйте скрипт в свою кодировку).

Проверено в IE и Chrome, работает, больше ничего тут под рукой нет :)

P.S. Ниже показан более современный вариант такого скрипта (выбор из списка стран), который активно пользуется стилями и объектной моделью документа для решения задачи. Предполагается, что исходник можно увидеть из исходника открывающейся страницы, а сохранён он будет как файл .html в кодировке Юникода utf-8.

 Список стран с выбором подсписка по мере ввода (6 Кб)

12.09.2014, 14:14 [11706 просмотров]


теги: список javascript html ошибка chrome

К этой статье пока нет комментариев, Ваш будет первым