Выпадающее меню с поиском и списком городов!

47
09 июня 2018, 01:30

Затея такая: При клике на поле "Выберите город" выпадает меню, при двойном клике закрывается, при клике вне дива закрывается: В этом меню сразу идет поиск по городам которые будут ниже, потом идет список городов. Список с городами листается вниз ( справа ползунок прокрутки) Когда делается выбор города он вставляется в поле "Выберите город".

Вот html:

<div class="b-order-prepare__field" data-qaid="city-dd"> 
  <div class="js-toggle x-drop-down x-drop-down_state_active" data-qaid="dd_widget"><span class="x-drop-down__value b-order-prepare__field">Выберите город</span><span class="x-drop-down__arrow"></span><input type="hidden" value="8e1718f5-1972-11e5-add9-005056887b8d"> 
    <div class="x-drop-down__dropped"> 
      <div class="x-drop-down__search"> 
        <div class="x-input x-input_size_s"><input type="text" class="x-input__field" autocomplete="off" value=""></div> 
      </div> 
      <ul class="x-drop-down__list js-dropdown" style="max-height: 300px;"> 
        <li class="js-item b-drop-down__list-item b-drop-down__list-item_state_hover">Авангард</li> 
        <li class="js-item b-drop-down__list-item">Авдеевка</li> 
        <li class="js-item b-drop-down__list-item">Авиаторское</li> 
        <li class="js-item b-drop-down__list-item">Агрономичное</li> 
        <li class="js-item b-drop-down__list-item">Аджамка</li> 
        <li class="js-item b-drop-down__list-item">Ананьев</li> 
        <li class="js-item b-drop-down__list-item">Андреевка (Балаклейский р-н)</li> 
        <li class="js-item b-drop-down__list-item">Андреевка (Бердянский р-н)</li> 
        <li class="js-item b-drop-down__list-item">Андрушевка</li> 
        <li class="js-item b-drop-down__list-item">Антоновка (Скадовский р-н)</li> 
        <li class="js-item b-drop-down__list-item">Антонины</li> 
        <li class="js-item b-drop-down__list-item">Апостолово</li> 
        <li class="js-item b-drop-down__list-item">Арбузинка</li> 
        <li class="js-item b-drop-down__list-item">Арциз</li> 
        <li class="js-item b-drop-down__list-item">Аскания-Нова</li> 
        <li class="js-item b-drop-down__list-item">Аулы</li> 
        <li class="js-item b-drop-down__list-item">Бабаи</li> 
        <li class="js-item b-drop-down__list-item">Бабанка</li> 
        <li class="js-item b-drop-down__list-item">Балабино</li> 
        <li class="js-item b-drop-down__list-item">Балаклея (Черкасская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Балаклея (Харьковская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Балки (Запорожская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Балта</li> 
        <li class="js-item b-drop-down__list-item">Банилов</li> 
        <li class="js-item b-drop-down__list-item">Бар</li> 
        <li class="js-item b-drop-down__list-item">Баранинцы (Закарпатская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Барановка</li> 
        <li class="js-item b-drop-down__list-item">Барвенково</li> 
        <li class="js-item b-drop-down__list-item">Барышевка</li> 
        <li class="js-item b-drop-down__list-item">Бахмач</li> 
        <li class="js-item b-drop-down__list-item">Бахмут</li> 
        <li class="js-item b-drop-down__list-item">Баштанка</li> 
        <li class="js-item b-drop-down__list-item">Безлюдовка</li> 
        <li class="js-item b-drop-down__list-item">Бердичев</li> 
        <li class="js-item b-drop-down__list-item">Бердянск</li> 
        <li class="js-item b-drop-down__list-item">Берегово</li> 
        <li class="js-item b-drop-down__list-item">Берегомет</li> 
      </ul> 
    </div> 
  </div><noscript></noscript></div>

Answer 1

$(".x-drop-down__value").click(function(event) { 
  toggleMenu(); 
  event.stopPropagation(); 
}); 
 
$('.b-drop-down__list-item').click(function() { 
  $('.x-drop-down__value').html($(this).text()); 
  toggleMenu(); 
}); 
 
function toggleMenu() { 
  let menu = $(".x-drop-down__dropped"); 
  if (!menu.hasClass('active')) { 
    window.addEventListener('click', closeMenu); 
  } else { 
    window.removeEventListener('click', closeMenu); 
  } 
  menu.toggleClass("active"); 
} 
 
function closeMenu() { 
  $(".x-drop-down__dropped").removeClass("active") 
} 
 
$('.x-drop-down__dropped').click(function(event) { 
  event.stopPropagation(); 
}); 
 
 
$('.x-input__field').on('input', function() {  
  let search = $(this).val(); 
  searchData(search); 
}); 
 
function searchData(search) { 
  let towns = $('.b-drop-down__list-item'); 
  towns.each(function() { 
    if ($(this).text().indexOf(search) === -1) { 
      $(this).addClass('item_hide'); 
    } else { 
      $(this).removeClass('item_hide'); 
    } 
  }); 
}
.js-dropdown { 
  display: inline-block; 
  max-height: 400px; 
  overflow-y: auto; 
  width: auto; 
} 
 
.x-drop-down__dropped { 
  display: none; 
} 
 
.x-drop-down__dropped.active { 
  display: block; 
} 
 
.item_hide { 
  display: none; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div class="b-order-prepare__field" data-qaid="city-dd"> 
  <div class="js-toggle x-drop-down" data-qaid="dd_widget"><span class="x-drop-down__value b-order-prepare__field">Выберите город</span><span class="x-drop-down__arrow"></span><input type="hidden" value="8e1718f5-1972-11e5-add9-005056887b8d"> 
    <div class="x-drop-down__dropped"> 
      <div class="x-drop-down__search"> 
        <div class="x-input x-input_size_s"><input type="text" class="x-input__field" autocomplete="off" value=""></div> 
      </div> 
      <ul class="x-drop-down__list js-dropdown" style="max-height: 300px;"> 
        <li class="js-item b-drop-down__list-item b-drop-down__list-item_state_hover">Авангард</li> 
        <li class="js-item b-drop-down__list-item">Авдеевка</li> 
        <li class="js-item b-drop-down__list-item">Авиаторское</li> 
        <li class="js-item b-drop-down__list-item">Агрономичное</li> 
        <li class="js-item b-drop-down__list-item">Аджамка</li> 
        <li class="js-item b-drop-down__list-item">Ананьев</li> 
        <li class="js-item b-drop-down__list-item">Андреевка (Балаклейский р-н)</li> 
        <li class="js-item b-drop-down__list-item">Андреевка (Бердянский р-н)</li> 
        <li class="js-item b-drop-down__list-item">Андрушевка</li> 
        <li class="js-item b-drop-down__list-item">Антоновка (Скадовский р-н)</li> 
        <li class="js-item b-drop-down__list-item">Антонины</li> 
        <li class="js-item b-drop-down__list-item">Апостолово</li> 
        <li class="js-item b-drop-down__list-item">Арбузинка</li> 
        <li class="js-item b-drop-down__list-item">Арциз</li> 
        <li class="js-item b-drop-down__list-item">Аскания-Нова</li> 
        <li class="js-item b-drop-down__list-item">Аулы</li> 
        <li class="js-item b-drop-down__list-item">Бабаи</li> 
        <li class="js-item b-drop-down__list-item">Бабанка</li> 
        <li class="js-item b-drop-down__list-item">Балабино</li> 
        <li class="js-item b-drop-down__list-item">Балаклея (Черкасская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Балаклея (Харьковская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Балки (Запорожская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Балта</li> 
        <li class="js-item b-drop-down__list-item">Банилов</li> 
        <li class="js-item b-drop-down__list-item">Бар</li> 
        <li class="js-item b-drop-down__list-item">Баранинцы (Закарпатская обл.)</li> 
        <li class="js-item b-drop-down__list-item">Барановка</li> 
        <li class="js-item b-drop-down__list-item">Барвенково</li> 
        <li class="js-item b-drop-down__list-item">Барышевка</li> 
        <li class="js-item b-drop-down__list-item">Бахмач</li> 
        <li class="js-item b-drop-down__list-item">Бахмут</li> 
        <li class="js-item b-drop-down__list-item">Баштанка</li> 
        <li class="js-item b-drop-down__list-item">Безлюдовка</li> 
        <li class="js-item b-drop-down__list-item">Бердичев</li> 
        <li class="js-item b-drop-down__list-item">Бердянск</li> 
        <li class="js-item b-drop-down__list-item">Берегово</li> 
        <li class="js-item b-drop-down__list-item">Берегомет</li> 
      </ul> 
    </div> 
  </div><noscript></noscript></div>

Answer 2

чем обычный инпут с даталистом не угодил?

<input list="%идентификатор%">
<datalist id="%идентификатор%">
 <option value="Город1">
 <option value="Город2">
</datalist>

Обстилить его чтобы на <select> похоже было, и всего делов.

И, да, двойной щелчок на веб-сайте - мракобесие.

READ ALSO
jQuery $(this) в if условии внутри click function

jQuery $(this) в if условии внутри click function

Я хотел бы додать class только для одного (create-new-label-main-container div) с backgrond-color 'ColorOfLabel', не для всех, но проблема в том, что $(this) в этом коде это кликнутый('

26
Как после выбора в select отобразить соответствующее содержимое?

Как после выбора в select отобразить соответствующее содержимое?

Как переписать скрипт, чтобы вкладки работели с тегом select? Те

24
Транслитерация в input поле

Транслитерация в input поле

Как сделать, чтоб при вводе в это поле русских символов проходила транслитерация, и пробелы менялись символом "-"?

14
jQuery.getJSON() возвращает не те данные

jQuery.getJSON() возвращает не те данные

Здравствуйте уважаемые знатоки, вопрос такой: Мне на сайте WP в sidebar нужно вывести 2 виджета, для этого я использую разные файлы JS в которых...

19