Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2013, 23:37
Новичок на форуме
Отправить личное сообщение для game_Racer Посмотреть профиль Найти все сообщения от game_Racer
 
Регистрация: 06.04.2013
Сообщений: 5

Показать/скрыть большое колличество option внутри select
Нужно реализовать фильтр в select по первой букве с помощью стандартных кнопок.
Сделал так:
function onShowBlock(id) {
$("select[name='group_id'] option").removeAttr("selected");
$("select[name='group_id'] option[class='show']").removeClass('show').wrap(document.createElement("span")).parent().hide();
$("select[name='group_id'] option[id="+id+"]").addClass('show').unwrap();
}

<p>Фильтр по первой букве:</p>
 <p><input type="button" id="l" onclick="onShowBlock(this.id);" value="L"> 
   <input type="button" id="i" onclick="onShowBlock(this.id);" value="I"> 
   <input type="button" id="d" onclick="onShowBlock(this.id);" value="D"> 
   <input type="button" id="s" onclick="onShowBlock(this.id);" value="S"></p>
<p>select</p>
<select name="group_id" size="1" >
<option>&nbsp;</option>
<option id="l" class="show" value="lorem">Lorem</option>
<option id="d" class="show" value="dolor">Dolor</option>
<option id="i" class="show" value="ipsum">Ipsum</option>
<option id="s" class="show" value="sit">Sit amet</option>
<option id="l" class="show" value="lorem">Lorem1</option>
<option id="d" class="show" value="dolor">Dolor1</option>
<option id="i" class="show" value="ipsum">Ipsum1</option>
<option id="s" class="show" value="sit">Sit amet1</option>
<option id="l" class="show" value="lorem">Lorem2</option>
<option id="d" class="show" value="dolor">Dolor2</option>
<option id="i" class="show" value="ipsum">Ipsum2</option>
<option id="s" class="show" value="sit">Sit amet2</option>
</select>

Все работает, но когда внутри select несколько тысяч option изрядно тормозит и вешает браузер. Может через массивы будет быстрее, но я с js познакомился на прошлой неделе, а то что выше написал по подсказкам гугла.
Ответить с цитированием
  #2 (permalink)  
Старый 07.04.2013, 01:24
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

game_Racer,

Готовый вариант не подойдет ? Есть отличный плагин chosen, с возможностью автокомплита (самый первый пример на странице).
Ответить с цитированием
  #3 (permalink)  
Старый 07.04.2013, 02:33
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

В первую очередь нужно понимать что $ - это функция, а не какая-то магия.
Сообщение от game_Racer
$("select[name='group_id'] option[class='show']").removeClass('show').wrap(document.createElement ("span")).parent().hide();
Что тут происходит - непонятно. Вы оборачиваете опшны в спаны? Вобще-то внутри <select> не может быть никаких спанов. Кроме того это затратная операция, и в цикле в 1000 итераций будет очень тормозить.
Нужно также понимать что каждый id должен быть уникальным.


<p id="filter">
    <input type="button" value="l">
    <input type="button" value="i">
    <input type="button" value="d">
    <input type="button" value="s">
</p>
<p>select</p>
<select id="select" name="group_id" size="10" >
    <option>&nbsp;</option>
    <option value="lorem">Lorem</option>
    <option value="dolor">Dolor</option>
    <option value="ipsum">Ipsum</option>
    <option value="sit">Sit amet</option>
    <option value="lorem">Lorem1</option>
    <option value="dolor">Dolor1</option>
    <option value="ipsum">Ipsum1</option>
    <option value="sit">Sit amet1</option>
    <option value="lorem">Lorem2</option>
    <option value="dolor">Dolor2</option>
    <option value="ipsum">Ipsum2</option>
    <option value="sit">Sit amet2</option>
</select>
<script>
(function(){
    var select = document.getElementById('select');
    var removed = [];
    function filterOptions(startsWith) {
    	if (removed.length) {
    		for (var i = removed.length - 1; i >= 0; i--) {
    			select.insertBefore(removed[i][0], select[removed[i][1]]);
    		}
    	}
        for (var i = 1, option; option = select[i]; i++) {
        	if (option.value[0] !== startsWith) {
        		removed.push([option.parentNode.removeChild(option), i]);
        		i--;
        	}
        }
    }

    var filter = document.getElementById('filter');
    var onclick = function() { filterOptions(this.value) };
    for (var i = 0, button; button = filter.children[i]; i++) {
        button.onclick = onclick;
    }
})()
</script>

Последний раз редактировалось danik.js, 07.04.2013 в 02:35.
Ответить с цитированием
  #4 (permalink)  
Старый 07.04.2013, 14:18
Новичок на форуме
Отправить личное сообщение для game_Racer Посмотреть профиль Найти все сообщения от game_Racer
 
Регистрация: 06.04.2013
Сообщений: 5

danik.js,
Большое Спасибо. В спаны гугл посоветовал обернуть, так как оптион просто так скрывается не во всех браузерах.
Ответить с цитированием
  #5 (permalink)  
Старый 07.04.2013, 20:12
Новичок на форуме
Отправить личное сообщение для game_Racer Посмотреть профиль Найти все сообщения от game_Racer
 
Регистрация: 06.04.2013
Сообщений: 5

danik.js,
Начал разбираться в коде.. Возникла пара вопросов. Почему нельзя один раз загнать все оптион в массив и выводить только нужные, предварительно удалив оставшиеся? Зачем сначала возвращать все, а потом удалять лишнее? С Вашим кодом первое нажатие на кнопку срабатывает быстро, а вот следующие нажатие на другие кнопки заставляют браузер подвиснуть.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
checkbox, radio и select c option Hekumok Общие вопросы Javascript 8 12.04.2016 17:51
Cохранение выбранного option в select. NiCKSoNka Элементы интерфейса 17 05.03.2012 15:48
Динамические option в select lurii Элементы интерфейса 10 14.01.2011 11:23
Пользовательский скрипт для выбора option в select по умолчанию justalittleperson Элементы интерфейса 1 04.10.2010 06:13
Вставка текста в textarea после выбора select option modelisto Общие вопросы Javascript 2 14.10.2009 19:27