Для создания списка используется html-элемент select. Причем с его помощью можно создавать как выпадающие списки, так и обычные с ординарным или множественным выбором. Например, стандартный список:
<select name="language" size="4"> <option value="JS" selected="selected">JavaScript</option> <option value="Java">Java</option> <option value="C#">C#</option> <option value="C++">C++</option> </select>
Атрибут size
позволяет установить, сколько элементов будут отображаться одномоментно в списке. Значение size="1"
отображает только один элемент списка, а сам список становится выпадающим. Если установить у элемента select атрибут multiple,
то в списке можно выбрать сразу несколько значений.
Каждый элемент списка представлен html-элементом option, у которого есть отображаемая метка и есть значения в виде атрибута value
.
В JavaScript элементу select соответствует объект HTMLSelectElement, а элементу option - объект HtmlOptionElement или просто Option.
Все элементы списка в javascript доступны через коллекцию options. А каждый объект HtmlOptionElement имеет свойства:
index
(индекс в коллекции options), text
(отображаемый текст) и value
(значение элемента).
Например, получим первый элемент списка и выведем о нем через его свойства всю информацию:
<form name="myForm"> <select name="language" size="4"> <option value="JS" selected="selected">JavaScript</option> <option value="Java">Java</option> <option value="CS">C#</option> <option value="CPP">C++</option> </select> </form> <script> const firstLanguage = document.myForm.language.options[0]; console.log("Index:", firstLanguage.index); console.log("Text:", firstLanguage.text); console.log("Value:", firstLanguage.value); </script>
Другой способ получить нужный элемент списка по индексу представляет метод item(), в который передается индекс элемента:
const firstLanguage = myForm.language.item(0); console.log("Index:", firstLanguage.index); console.log("Text:", firstLanguage.text); console.log("Value:", firstLanguage.value);
В javascript мы можем не только получать элементы, но и динамически управлять списком. Например, применим добавление и удаление объектов списка:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head> <body> <form name="myForm"> <select name="language" size="5"> <option value="JS" selected="selected">JavaScript</option> <option value="Java">Java</option> <option value="CS">C#</option> <option value="CPP">C++</option> </select> <p><input type="text" name="textInput" placeholder="Введите текст" /></p> <p><input type="text" name="valueInput" placeholder="Введите значение" /></p> <p> <input type="button" name="addButton" value="Добавить" /> <input type="button" name="removeButton" value="Удалить" /> </p> </form> <script> const myForm = document.myForm; const addButton = myForm.addButton, removeButton = myForm.removeButton, languagesSelect = myForm.language; // обработчик добавления элемента function addOption(){ // получаем текст для элемента const text = myForm.textInput.value; // получаем значение для элемента const value = myForm.valueInput.value; // создаем новый элемента const newOption = new Option(text, value); languagesSelect.options[languagesSelect.options.length]=newOption; } // обработчик удаления элемент function removeOption(){ const selectedIndex = languagesSelect.options.selectedIndex; // удаляем элемент languagesSelect.options[selectedIndex] = null; } addButton.addEventListener("click", addOption); removeButton.addEventListener("click", removeOption); </script> </body> </html>
Для добавления на форме предназначены два текстовых поля (для текстовой метки и значения элемента option) и кнопка. Для удаления выделенного элемента предназначена еще одна кнопка.
За добавление в коде javascript отвечает функция addOption
, в которой получаем введенные в текстовые поля значения, создаем новый объект Option и
добавляем его в массив options объекта списка.
За удаление отвечает функция removeOption
, в которой просто получаем индекс выделенного элемента с помощью свойства selectedIndex
и в коллекции options приравниваем по этому индексу значение null.
Для добавления/удаления также в качестве альтернативы можно использовать методы элемента select:
// вместо вызова // languagesSelect.options[languagesSelect.options.length]=newOption; // использовать для добавления вызов метода add languagesSelect.add(newOption); // вместо вызова // languagesSelect.options[selectedIndex] = null; // использовать для удаления метод remove languagesSelect.remove(selectedIndex);
Элемент select поддерживает три события: blur (потеря фокуса), focus (получение фокуса) и change (изменение выделенного элемента в списке). Рассмотрим применение события select:
<form name="myForm"> <select name="language" size="5"> <option value="JS" selected="selected">JavaScript</option> <option value="Java">Java</option> <option value="CS">C#</option> <option value="CPP">C++</option> </select> </form> <div id="selection"></div> <script> const languagesSelect = document.myForm.language; const selection = document.getElementById("selection"); function changeOption(){ const selectedOption = languagesSelect.options[languagesSelect.selectedIndex]; selection.textContent = "Вы выбрали: " + selectedOption.text; } languagesSelect.addEventListener("change", changeOption); </script>
Если у элемента <select>
установлен атрибут multiple, то список позволяет выбрать несколько элементов. В этом случае для получения всех выделенных элементов необходимо использовать свойство selectedOptions,
которое представляет объект типа HTMLCollection и содержит список выбранных элементов. А каждый объект в этом списке имеет тип
HTMLOptionElement. Соответственно для получения каждого из выбранных элементов нам надо перебрать эту коллекцию:
<form name="myForm"> <select name="languages" multiple> <option value="JS">JavaScript</option> <option value="Java">Java</option> <option value="CS">C#</option> <option value="CPP">C++</option> </select> </form> <div id="selection"></div> <script> const languages = document.myForm.languages; const selection = document.getElementById("selection"); function changeOption(){ // удаляем ранее выбранные элементы while (selection.firstChild) { selection.removeChild(selection.firstChild); } // получаем выбранные элементы const options = languages.selectedOptions; for (let i = 0; i < options.length; i++) { // for each option ... const option = options[i].text // получаем выбранный элемент const div = document.createElement("div"); // для каждого выбранного элемента создаем div const optionText = document.createTextNode(option); // создаем текстовый узел для выбранного элемента div.appendChild(optionText); // добавляем optionText в div selection.appendChild(div) // добавляем div в контейнер } } languages.addEventListener("change", changeOption); </script>
В данном случае в обработчике события change проходим по каждому выбранному элементу и для каждого элемента создаем текстовый узел, который помещаем в элемент div, который, в свою очередь, помещаем в элемент selection на веб-странице.