СтатьиJavaScript SELECT - динамические списки"Как реализовать следующее: есть два HTML списка select, нужно динамически с помощью Javascript заполнить второй список по значению, выбранному в первом? И если я таких селектов связанных захочу много, а не два?" - эти вопросы были вчера заданы мне по аське и подвигли меня к написанию этой статьи... Как это выглядит снаружи
Выбираете в первом списке браузер, при этом второй список заполняется названиями ОС на которых браузер работает, а исходя из значения второго списка, заполняется третий список, содержащий доступные версии браузера. Работаем с SELECT из Javascript (что и как)
Для решения поставленной задачи необходимо иметь понятие о том как воздействовать на элемент Пусть у нас на странице есть элемент: <FORM name="myForm"> <select id="mySelectId" name="mySelect"> <option value="str0"> Строка списка 0 </option> <option value="str1"> Строка списка 1 </option> <option value="str2"> Строка списка 2 </option> </select> </FORM>
Как видно,
Для обращения к нашему элементу списка будем использовать DOM метод var objSel = document.getElementById("mySelectId"); Если список находится внутри формы, то к нему можно обратиться и через форму: var objSel = document.myForm.mySelect;
где, Как добавить новый элемент в список SELECT?
Все HTML элементы var objSel = document.getElementById("mySelect"); //Создаем новый объект Option и заносим его в коллекцию options objSel.options[0] = new Option("Строка списка 0", "str0"); objSel.options[1] = new Option("Строка списка 1", "str1"); objSel.options[2] = new Option("Строка списка 2", "str2"); Добавлять элементы в конец списка удобно так: objSel.options[objSel.options.length] = new Option("текст", "значение");
Свойство objSel.options.length=1; //добавляем в конец списка пустой элемент objSel.options[0].text = "Строка списка 0"; objSel.options[0].value = "str0";
Вернемся к функции-конструктору var newOpt = new Option("text", "value", isDefaultSelected, isSelected);
где первые два аргумента - это строки, а третий и червертый булевы аргументы и принимают значения До сих пор для добавления элемента мы использовали BOM (Browser Object Model / объектная модель браузера), однако лучше, во всех отношениях, использовать методы DOM (Document Object Model / объектная модель документа), и реализовывать добавление элемента так: function addOption (oListbox, text, value, isDefaultSelected, isSelected) { var oOption = document.createElement("option"); oOption.appendChild(document.createTextNode(text)); oOption.setAttribute("value", value); if (isDefaultSelected) oOption.defaultSelected = true; else if (isSelected) oOption.selected = true; oListbox.appendChild(oOption); } Пример использования: var objSel = document.getElementById("mySelect"); addOption(objSel, "текст", "значение", true);
И на последок о некоторых особенностях IE :-) В IE 5+ исключена (ввиду нестабильной работы) возможность добавления элемента списка через Доступ к элементам спискаvar text = objSel.options[2].text; var value = objSel.options[2].value; Элементы списка в массиве options индексируются с нуля, поэтому первый элемент списка имеет индекс 0:
Изменение элемента спискаobjSel.options[1].text = "Новый текст"; objSel.options[1].value = "новое значение"; objSel.options[2] = new Option("Новый текст", "новое значение");//полная замена элемента на новый Как узнать какой элемент выбран и как выбрать нужный элемент?
У объекта элемента if ( objSel.selectedIndex != -1) { //Если есть выбранный элемент, отобразить его значение (свойство value) alert(objSel.options[objSel.selectedIndex].value); } Замечание
Возможен выбор нескольких значений в списке, для этого нужно указать свойство
В случае когда доступен множественный выбор элементов, данное свойство содержит индекс первого выделенного в списке элемента (т.е. того элемента который в списке находиться выше). Чтобы в данном случае найти все выделенные элементы нужно перебрать в цикле все элементы массива options и проверить их свойство function getSelectedIndexes (oListbox) { var arrIndexes = new Array; for (var i=0; i < oListbox.options.length; i++) { if (oListbox.options[i].selected) arrIndexes.push(i); } return arrIndexes; };
Функция Пример использования (отображение индексов выделеных элементов): var objSel = document.getElementById("mySelect"); alert ( getSelectedIndexes(objSel) );
Описанные свойства //выбрать (выделить) второй элемент списка objSel.selectedIndex = 1; //или так objSel.options[1].selected=true;
Для выбора нескольких элементов (при установленном свойстве //выбрать (выделить) 1 и 3 элементы списка objSel.options[0].selected=true; objSel.options[2].selected=true;
Следует обратить внимание на баг в браузере Opera, проявляющийся при динамическом заполнении списка через скрипт и последующей установке выделенного пункта через свойство var objSel = document.getElementById("mySelect"); //Динамически создаем элементы списка objSel.options[0] = new Option("Строка списка 0", "str0"); objSel.options[1] = new Option("Строка списка 1", "str1"); //Выделяем второй элемент списка setTimeout( function(){objSel.options[1].selected=true;}, 1 ); Удаление i-го элемента спискаobjSel.options[1] = null; //удалить элемент списка с индексом 1 (второй элемент списка) Или используя DOM метод remove: oListbox.remove(0); //удалить первый элемент списка Как очистить список SELECT (как удалить все элементы списка)?
Для этого можно установить свойство objSel.options.length = 0;
Либо вызвать DOM метод function clearSelect(oListbox) { for (var i=oListbox.options.length-1; i >= 0; i--) { oListbox.remove(i); } }; Как сдвинуть элемент списка вверх или вниз?function shiftUpOption (oListbox, iIndex) { if (iIndex > 0) { var oOption = oListbox.options[iIndex]; var oPrevOption = oListbox.options[iIndex-1]; oListbox.insertBefore(oOption, oPrevOption); } }; function shiftDownOption (oListbox, iIndex) { if (iIndex < oListbox.options.length - 1) { var oOption = oListbox.options[iIndex]; var oNextOption = oListbox.options[iIndex+1]; oListbox.insertBefore(oNextOption, oOption); } }; Примеры: var objSel = document.getElementById("mySelect"); shiftDownOption (objSel, 1); //переместить второй элемент списка (с индектом 1) на первую позицию (с индексом 0) Динамические связанные списки Select - взгляд изнутри
Ну что же, теперь вы знаете достаточно, чтобы выполнить практически любую задачу связанную с элементом <html> <head> <title>Связанные селекты</title> <!-- Подключаем javascript-библиотеку функций --> <script type="text/javascript" src="linkedselect.js"></script> </head> <body> <!-- Первый (главный) список (изначально заполнен вручную) --> <select size="4" id="List1"> <option value="ie"> Internet Explorer </option> <option value="safari"> Safari </option> </select> <!-- Подчиненный список 1 (изначально пуст) --> <select size="4" id="List2"></select> <!-- Подчиненный список 2 (изначально пуст) --> <select size="4" id="List3"></select> <script type="text/javascript"> // Создаем новый объект связанных списков var syncList1 = new syncList; // Определяем значения подчиненных списков (2 и 3 селектов) syncList1.dataList = { /* Определяем элементы второго списка в зависимости от выбранного значения в первом списке */ 'ie':{ 'ie_win':'Windows', 'ie_mac':'Mac' }, 'safari':{ 'safari_mac':'Mac' }, /* Определяем элементы третьего списка в зависимости от выбранного значения во втором списке */ 'ie_win':{ 'ie_win_5':'версия 5', 'ie_win_6':'версия 6' }, 'ie_mac':{ 'ie_mac_5':'версия 5' }, 'safari_mac':{ 'safari_mac_1':'версия 1', 'safari_mac_2':'версия 2' } }; // Включаем синхронизацию связанных списков syncList1.sync("List1","List2","List3"); </script> </body> </html>
Давайте разберем страницу. Первым делом в разделе head подключаем библиотеку linkedselect.js, которая определяет класс объектов
Автор: Игорь Цыгырлаш |
||