Как я могу автоматически фильтровать список выбора HTML? - PullRequest
1 голос
/ 09 октября 2008

У меня есть список выбора HTML с довольно многими (более 1000) именами. У меня есть JavaScript, который выберет первое подходящее имя, если кто-то начнет печатать. Это соответствие выглядит в начале элемента:

var optionsLength = dropdownlist.options.length;
  for (var n=0; n < optionsLength; n++)
  {
    var optionText = dropdownlist.options[n].text;
    if (optionText.indexOf(dropdownlist.keypressBuffer,0) == 0)
    {
      dropdownlist.selectedIndex = n;
      return false; 
    }
  }

Клиент хотел бы иметь предложение или автофильтр: при вводе части имени следует «найти» все имена, содержащие эту часть. Я видел несколько опций Google Suggest, большинство из которых используют Ajax, но я бы хотел использовать опцию чистого JavaScript, так как список выбора уже загружен Указывает кто-нибудь?

Ответы [ 4 ]

2 голосов
/ 09 октября 2008

Я бы настроил кеш для хранения options внутри моего select. И вместо фильтрации options в select я бы очистил select и заново заполнил его соответствием options.

Псевдокод изобилие:

onLoad:
    set cache

onKeyPress:
    clear select-element
    find option-elements in cache
    put found option-elements into select-element

Вот небольшой POC, который я написал, выполняя фильтрацию на selects из того, что выбрано в другом select - фактически объединяет в цепочку кучу селектов.

Возможно, это может дать вам несколько идей:

function selectFilter(_maps)
{
    var map = {};


    var i = _maps.length + 1; while (i -= 1)
    {
        map = _maps[i - 1];


        (function (_selectOne, _selectTwo, _property)
        {
            var select = document.getElementById(_selectTwo);
            var options = select.options;
            var option = {};
            var cache = [];
            var output = [];


            var i = options.length + 1; while (i -= 1)
            {
                option = options[i - 1];

                cache.push({
                    text: option.text,
                    value: option.value,
                    property: option.getAttribute(_property)
                });
            }


            document.getElementById(_selectOne).onchange = function ()
            {
                var selectedProperty = this
                                       .options[this.selectedIndex]
                                       .getAttribute(_property);
                var cacheEntry = {};
                var cacheEntryProperty = undefined;


                output = [];

                var i = cache.length + 1; while (i -= 1)
                {
                    cacheEntry = cache[i - 1];

                    cacheEntryProperty = cacheEntry.property;

                    if (cacheEntryProperty === selectedProperty)
                    {
                        output.push("<option value=" + cacheEntry.value + " "
                        _property + "=" + cacheEntryProperty + ">" +
                        cacheEntry.text + "</option>");
                    }
                }

                select.innerHTML = output.join();
            };
        }(map.selectOne, map.selectTwo, map.property));
    }
}


$(function ()
{
    selectFilter([
        {selectOne: "select1", selectTwo: "select2", property: "entityid"},
        {selectOne: "select2", selectTwo: "select3", property: "value"}
    ]);
});
2 голосов
/ 09 октября 2008

В библиотеках YUI есть библиотека для такого рода функций, которая называется AutoComplete .

Источник данных для автозаполнения может быть локальными объектами javascript или может быть легко переключен на Ajax, если вы передумаете.

Компоненты YUI довольно настраиваемы с достаточной функциональностью.

Редактировать: Я не уверен, что вы можете заставить его работать с полем выбора, как того требует вопрос. Может быть возможно.

2 голосов
/ 09 октября 2008

Изменение

if (optionText.indexOf(dropdownlist.keypressBuffer,0) == 0)

до

if (optionText.indexOf(dropdownlist.keypressBuffer) > 0)

Чтобы найти dropdownlist.keypressBuffer в любом месте optionText.

1 голос
/ 23 июня 2010

использовать этот скрипт фильтра http://www.barelyfitz.com/projects/filterlist/

...