Свойства и методы формы
Формы и элементы управления, такие как , имеют множество специальных свойств и событий.
Работать с формами станет намного удобнее, когда мы их изучим.
Навигация: формы и элементы
Формы в документе входят в специальную коллекцию document.forms .
Это так называемая «именованная» коллекция: мы можем использовать для получения формы как её имя, так и порядковый номер в документе.
document.forms.my - форма с именем "my" (name="my") document.forms[0] - первая форма в документе
Когда мы уже получили форму, любой элемент доступен в именованной коллекции form.elements .
Может быть несколько элементов с одним и тем же именем, это часто бывает с кнопками-переключателями radio .
В этом случае form.elements[name] является коллекцией, например:
Эти навигационные свойства не зависят от структуры тегов внутри формы. Все элементы управления формы, как бы глубоко они не находились в форме, доступны в коллекции form.elements .
Форма может содержать один или несколько элементов внутри себя. Они также поддерживают свойство elements , в котором находятся элементы управления внутри них.
Сокращённая форма записи: form.name
Есть более короткая запись: мы можем получить доступ к элементу через form[index/name] .
Другими словами, вместо form.elements.login мы можем написать form.login .
Это также работает, но есть небольшая проблема: если мы получаем элемент, а затем меняем его свойство name , то он всё ещё будет доступен под старым именем (также, как и под новым).
В этом легче разобраться на примере:
Обычно это не вызывает проблем, так как мы редко меняем имена у элементов формы.
Обратная ссылка: element.form
Для любого элемента форма доступна через element.form . Так что форма ссылается на все элементы, а эти элементы ссылаются на форму.
Элементы формы
Рассмотрим элементы управления, используемые в формах.
input и textarea
К их значению можно получить доступ через свойство input.value (строка) или input.checked (булево значение) для чекбоксов.
input.value = "Новое значение"; textarea.value = "Новый текст"; input.checked = true; // для чекбоксов и переключателей
Используйте textarea.value вместо textarea.innerHTML
Обратим внимание: хоть элемент и хранит своё значение как вложенный HTML, нам не следует использовать textarea.innerHTML для доступа к нему.
Там хранится только тот HTML, который был изначально на странице, а не текущее значение.
select и option
Элемент имеет 3 важных свойства:
- select.options – коллекция из подэлементов ,
- select.value – значение выбранного в данный момент ,
- select.selectedIndex – номер выбранного .
Они дают три разных способа установить значение в :
- Найти соответствующий элемент и установить в option.selected значение true .
- Установить в select.value значение нужного .
- Установить в select.selectedIndex номер нужного .
Первый способ наиболее понятный, но (2) и (3) являются более удобными при работе.
Вот эти способы на примере:
В отличие от большинства других элементов управления, позволяет нам выбрать несколько вариантов одновременно, если у него стоит атрибут multiple . Эту возможность используют редко, но в этом случае для работы со значениями необходимо использовать первый способ, то есть ставить или удалять свойство selected у подэлементов .
Их коллекцию можно получить как select.options , например:
new Option
Элемент редко используется сам по себе, но и здесь есть кое-что интересное.
В спецификации есть красивый короткий синтаксис для создания элемента :
option = new Option(text, value, defaultSelected, selected);
- text – текст внутри ,
- value – значение,
- defaultSelected – если true , то ставится HTML-атрибут selected ,
- selected – если true , то элемент будет выбранным.
Тут может быть небольшая путаница с defaultSelected и selected . Всё просто: defaultSelected задаёт HTML-атрибут, его можно получить как option.getAttribute(‘selected’) , а selected – выбрано значение или нет, именно его важно поставить правильно. Впрочем, обычно ставят оба этих значения в true или не ставят вовсе (т.е. false ).
let option = new Option("Текст", "value"); // создаст
Тот же элемент, но выбранный:
let option = new Option("Текст", "value", true, true);
Элементы имеют свойства:
option.selected Выбрана ли опция. option.index Номер опции среди других в списке . option.value Значение опции. option.text Содержимое опции (то, что видит посетитель).
Ссылки
- Спецификация: https://html.spec.whatwg.org/multipage/forms.html.
Итого
Свойства для навигации по формам:
document.forms Форма доступна через document.forms[name/index] . form.elements Элементы формы доступны через form.elements[name/index] , или можно просто использовать form[name/index] . Свойство elements также работает для . element.form Элементы хранят ссылку на свою форму в свойстве form .
Значения элементов формы доступны через input.value , textarea.value , select.value и т.д. либо input.checked для чекбоксов и переключателей.
Для элемента мы также можем получить индекс выбранного пункта через select.selectedIndex , либо используя коллекцию пунктов select.options .
Это были основы для начала работы с формами. Далее в учебнике мы встретим ещё много примеров.
В следующей главе мы рассмотрим такие события, как focus и blur , которые могут происходить на любом элементе, но чаще всего обрабатываются в формах.
Не могу получить данные из формы и вывести в консоль
Есть маленикий кусок html, к которому прикреплен отдельным файлом js. Пробовала alert() и console.log но нет никакого результата. В чем проблема?
Document
Отслеживать
задан 2 июл 2022 в 0:08
Viktorija Popova Viktorija Popova
11 3 3 бронзовых знака
Чтобы добавить js я добавила его ниже с помощью тэга . в реальности js просто прикреплен с помощью
2 июл 2022 в 0:11
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- Когда вы используете document.getElementById , то при передаче аргумента не надо писать # . Это надо писать если вы используете document.querySelector . Когда вы пишите #some-id при вызове document.getElementById , то он ищет не id=some-id , а ищет id=#some-id
- Если вам надо повесить событие на сабмит формы, то не надо слушать событие click на кнопке sumbit (не то что невозможно, но лучше не стоит), вместо этого вешайте слушателя на событие submit у формы. Так вы с помощью e.preventDefault() сможете предотвратить перезагрузку страницы, после submit -а
- Больше не нужно писать лишний код для того чтобы достать значения полей у формы. Достаточно передать компоненту form в new FormData() и он за вас сделает всю грязную работу. Главное не забыть проставить аттрибут name у инпутов, потому что значения вы будете доставать именно по ним
- При взятии значения из инпута вы получите строку, даже если ввели число. Потому очень важно об этом помнить и приводить данные к тому типу, который вам нужен
Document
Как получить данные из формы js
Чтобы получить данные из формы, можно воспользоваться объектом FormData . Этот объект содержит метод get() , с помощью которого можно извлечь данные по имени.
id="form1"> type="text" name="name" value="John"> type="text" name="surname" value="Smith"> type="submit">
Для получения данных, навешивается обработчик отправки формы и внутри него извлекаются данные:
const formElement = document.getElementById('form1'); // извлекаем элемент формы formElement.addEventListener('submit', (e) => e.preventDefault(); const formData = new FormData(formElement); // создаём объект FormData, передаём в него элемент формы // теперь можно извлечь данные const name = formData.get('name'); // 'John' const surname = formData.get('surname'); // 'Smith' >);
Библиотека Интернет Индустрии I2R.ru
С помощью JavaScript можно отправить данные формы на сервер, очистить ее, а также получить доступ к любому элементу формы для изменения его значений.
Существует несколько способов обращения к формам с использованием объектной модели.
Семейство forms
При создании формы, доступ к ней осуществляется через семейство forms. Для этого требуется либо указать номер формы, соответствующий элементу автоматически создаваемого массива, либо указать имя формы, заданное параметром name (пример 1).
Пример 1. Обращение к форме
alert(document.forms.length) // Получаем общее количество форм на странице
alert(document.forms[0].name) // Узнаем имя первой формы через массив forms
alert(document.forms.data.length) // Определяем количество элементов в форме с именем data
alert(document.forms[«data»].length) // То же самое
Нумерация элементов массива всегда начинается с нуля, поэтому обращение к первой форме будет document.forms[0], ко второй — document.forms[1]. Вместо индекса массива можно указывать имя формы, в данном случае используется data — document.forms[«data»]. Поскольку удобней всегда обращаться к форме по имени, рекомендуется всегда его задавать
Семейство all
Семейство all является характерным для браузера Internet Explorer, но также поддерживается многими браузерами, кроме Netscape версии 6 и выше. Обращение к форме происходит как к элементу массива с именем, совпадающим с именем формы — document.all[«data»] или напрямую — document.all.data (пример 2).
Пример 2. Использование семейства all
Internet Explorer поддерживает еще один способ обращения к формам — через семейство getElemetById. Пример — document.getElementById(«data»).length, где data является именем формы.
Получение значений элементов формы
Обращение к элементам формы осуществляется посредством семейства elements или напрямую по имени элемента (пример 3).
Пример 3. Получение значений
alert(document.forms.data.elements.length) // Общее число элементов в форме
alert(document.forms[0].elements[0].value) // Значение первого элемента
alert(document.forms[«data»].userName.value) // Значение элемента с именем userName
Нумерация массива, как и в случае с семейством forms ведется с нуля, поэтому обращение к первому элементу формы будет elements[0]. Для большого количество данных в форме, значения элементов лучше получать по их имени. Здесь важна чувствительность к регистру, поэтому имя элемента, указанное параметром name, должно быть написано точно так же и при обращении к нему из JavaScript. Если в примере указать username вместо userName, ошибка не возникнет, но и нужные данные не получим.
Работа с фреймами
В случае использования фреймовой структуры, обращение к данным формы несколько меняется. Доступ из одного фрейма к другому происходит через семейство frames, оно аналогично по использованию семейству forms (пример 4).
Пример 4. Обращение к фрейму
parent.frames[0].forms.data.length // Получаем количество элементов формы с именем data в первом фрейме
parent.frames[«main»].forms.data.length // Получаем количество элементов формы с именем data в фрейме main
parent.frames.main.forms.data.length // То же самое
parent.frames.main.forms.data.textfield.value // Значение поля textfield
В общем случае получение значения элемента формы будет таким.
В примере 5 используется два фрейма, данные из формы фрейма с именем main присваиваются текстовому полю фрейма с именем left.
Пример 5. Использование форм во фреймах
Файл index.html
Файл left.html
