Профессиональные курсы: Практика верстки HTML JavaScript для начинающих Программирование на PHP Онлайн-курсы по веб-технологиям

Селекты

Javascript-программисты часто работают с выпадающими списками — селектами. И не всегда эта работа доставляет удовольствие.

Курс молодого бойца

SELECT — это элемент формы, предоставляющий пользователю выбрать один (или несколько) элементов из своего списка. В качестве потомков может включать элементы OPTGROUP и OPTION. Сразу доходчивые примеры.

Селект с мультивыбором:

<select multiple="multiple" size="4">
    <option value="1">Январь</option>
    <option value="2">Февраль</option>
    <option value="3">Март</option>
    <option value="4">Апрель</option>
    <option value="5">Май</option>
    <option value="6">Июнь</option>
</select>

Селект с опшинами, разбитыми по группам:

<select>
    <optgroup label="Хорошие верстальщики">
        <option value="Mike">Mike</option>
        <option value="Bob">Bob</option>
        <option value="Ember">Ember</option>
    </optgroup>
    <optgroup label="Плохие верстальщики">
        <option value="Vasya">Вася</option>
        <option value="Kolya">Коля</option>
        <option value="Petya">Петя</option>
    </optgroup>
</select>

Как надеюсь понятно из примеров, чтобы селект был с мультивыбором, необходимо повесить на него атрибут multiple, при этом атрибут size задаст число одновременно отображаемых элементов списка. Элемент optgroup просто группирует элементы по разделам, имя которым можно задать через атрибут label.

Можно блокировать селект атрибутом disabled:

<select disabled="disabled">
    <option value="0">Меня заблокировали</option>
</select>

А можно блокировать отдельные элементы списка (или даже группы элементов):

<select>
    <option value="can">Меня можно выбрать</option>
    <option disabled="disabled" value="cannot">А меня нет</option>
    <optgroup disabled="disabled" label="Ха-ха!">
        <option value="0">Мы</option>
        <option value="0">тоже</option>
        <option value="0">заблокированы</option>
    </optgroup>
</select>

К бою

JavaScript-программисту приходится часто решать однотипные задачи, связанные с селектами:

  • Получение значения/текста выбранного элемента
  • Disable/enable всего списка
  • Очистка/наполнение опшинов (особенно акутально!)

Чтобы научиться правильно манипулировать всем этим добром, рекомендую ознакомиться с интерфейсом селектов, оптгрупп и опшинов в DOM2. А можно облегчить себе задачу и воспользоваться небольшим скриптом, умеющим немного работать с селектами:

var fselect = {
    $ : function(obj) { // Возвращает DOM-элемент и только если это SELECT
        if (typeof obj == 'string')
            obj = document.getElementById(obj);
        if (obj.nodeName && obj.nodeName.toLowerCase() == 'select')
            return obj;
        else
            alert('Селект не найден');
    },
    add : function(obj, option) {
        obj = this.$(obj);
        if (/*@cc_on!@*/false)
            obj.add(option);
        else
            obj.add(option, null);
    },
    getValue : function(obj) {
        obj = this.$(obj);
        return obj.value;
    },
    getText : function(obj) {
        obj = this.$(obj);
        return obj.options[obj.selectedIndex].text;
    },
    truncate : function(obj) { // Очистка селекта от опшинов
        obj = this.$(obj);
        while (obj.options.length)
            obj.remove(obj.options.length - 1);
    },
    lock : function(obj, status) { // Блокировка селекта с выводом статусного сообщения
        obj = this.$(obj);
        this.truncate(obj);
        if (status)
            this.add(
                obj,
                new Option(status ? status : '', status ? status : 0)
            );
        obj.disabled = true;
    },
    fill : function(obj, array) { // Заполнение из массива: array[i][0] = value, array[i][1] => text
        obj = this.$(obj);
        this.truncate(obj);
        for (var i = 0; i < array.length; i++)
            this.add(
                obj,
                new Option(array[i][1] ? array[i][1] : array[i][0], array[i][0])
            );
        obj.disabled = false;
    }
};

Пример работы скрипта.

Достоинства скрипта:

  1. Он простой и очень мелкий.
  2. Работает кроссбраузерно (проверено в IE6+, FF2+, Safari3, Opera9, Chrome).
  3. Все методы принимают в качестве аргумента как ID, так и ссылку на селект.
  4. Методы getValue() и getText() быстро вернут вам значение и текст выбранного элемента.
  5. Метод truncate() очищает селект от всех опшинов, а fill() может заполнить его заново из переданного массива.
  6. Метод lock() создан для веса и полезен для ajax-обновляемых селектов, когда список необходимо вычистить, задизейблить и написать 'Загружается'.

Скрипт НЕ приспособлен для работы с мультивыборными списками или селектами с optgroup-элементами, но его можно легко модифицировать, если кому-то понадобится.

Александр Бурцев 29 января 2009

© Все права на данную статью принадлежат порталу fastcoder.org. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.

Комментарии

buger 29 января 2009, 21:43 #
Но баг с z-index в Осле убивает, все равно приходится писать свой элемент, а если уж нет js тогда вставлять стандартный.
 
Bur 29 января 2009, 21:45 #
 
buger 30 января 2009, 01:12 #
да знаю я все эти способы, пробовал. Для единичных решений подходит. А когда сложные многоуровневые интерфейсы, такое шаманство начинается, что легче свой написать.
 
freeneutron 22 декабря 2009, 16:31 #
А как картинки вставить в элементы списка?
 
Bur 22 декабря 2009, 16:36 #
Можно стиль background у <option> прописать, только работать нигде кроме Гекко не будет.
 
 
Rambler's Top100 Flede HTML valid CSS valid