JQuery фильтрации - PullRequest
4 голосов
/ 11 мая 2009

Есть ли способ отфильтровать многострочное поле выбора с помощью jQuery?

Я новичок в jQuery и, похоже, не могу найти лучший способ сделать это.

Например, если у меня есть:

<select size="10">
   <option>abc</option>
   <option>acb</option>
   <option>a</option>
   <option>bca</option>
   <option>bac</option>
   <option>cab</option>
   <option>cba</option>
   ...
</select>

Я хочу отфильтровать этот список на основе выпадающего списка:

<select>
   <option value="a">Filter by a</option>
   <option value="b">Filter by b</option>
   <option value="c">Filter by c</option>
</select>

1 Ответ

5 голосов
/ 11 мая 2009

Нечто подобное может сработать (при условии, что вы дадите свой «Фильтр по ...» выберите идентификатор , фильтр , а отфильтрованный / другой выберите идентификатор otherOptions ) :

$(document).ready(function() {
    $('#filter').change(function() {
        var selectedFilter = $(this).val();
        $('#otherOptions option').show().each(function(i) {
            var $currentOption = $(this);
            if ($currentOption.val().indexOf(selectedFilter) !== 0) {
                $currentOption.hide();
            }
        });
    });
});

ОБНОВЛЕНИЕ: Как отметил @Brian Liang в комментариях, у вас могут возникнуть проблемы при установке тегов

на display: none . Поэтому следующее должно дать вам лучшее кросс-браузерное решение:
$(document).ready(function() {
    var allOptions = {};

    $('#otherOptions option').each(function(i) {
        var $currentOption = $(this);
        allOptions[$currentOption.val()] = $currentOption.text();
    });

    $('#filter').change(function() {
        // Reset the filtered select before applying the filter again
        setOptions('#otherOptions', allOptions);
        var selectedFilter = $(this).val();
        var filteredOptions = {};

        $('#otherOptions option').each(function(i) {
            var $currentOption = $(this);

            if ($currentOption.val().indexOf(selectedFilter) === 0) {
                filteredOptions[$currentOption.val()] = $currentOption.text();
            }
        });

        setOptions('#otherOptions', filteredOptions);
    });

    function setOptions(selectId, filteredOptions) {
        var $select = $(selectId);
        $select.html('');

        var options = new Array();
        for (var i in filteredOptions) {
            options.push('<option value="');
            options.push(i);
            options.push('">');
            options.push(filteredOptions[i]);
            options.push('</option>');
        }

        $select.html(options.join(''));
    }

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...