Самый простой и понятный для новичков способ получения данных из формы, скорее всего окажется не слишком эффективным. Давайте вернемся к предыдущему уроку , где мы разбирали один из способов извлечения данных.

Получение данных из HTML формы используя цикл for..of

Самый простой и понятный для новичков способ получения данных из формы, скорее всего окажется не слишком эффективным. Давайте вернемся к предыдущему уроку, где мы разбирали один из способов извлечения данных.

Взгляните на JavaScript код, я его продублирую здесь. Мы начали с поиска всех полей формы по их селекторам, методично перечисляя их названия и записывая в переменные. Но что не так с этим кодом? Данный код отлично сработает здесь и сейчас, под конкретную задачу.

const form = document.getElementById('form');

function getFormValue(event) {
    event.preventDefault();
    // поиск полей формы по селекторам
    const name = form.querySelector('[name="name"]'),
        age = form.querySelector('[name="age"]'),
        terms = form.querySelector('[name="terms"]'),
        plan = form.querySelector('[name="plan"]');

    const values = {
        name: name.value,
        age: age.value,
        plan: plan.value,
        terms: terms.checked
    };

    console.log(values);
}

form.addEventListener('submit', getFormValue);

Представьте, что заказчик получил данный код от программиста для получения данных из формы перед отправкой на сервер и разместил на своем сайте. Клиенты оставляют заявки на сайте, заполняя форму. Но заказчик не все учел сразу и решает, что неплохо было бы получить от клиента email. Он самостоятельно добавляет в HTML-код дополнительное поле для email. Многие владельцы сайтов или их админы имеют кое-какое предсталение о HTML и CSS, но вот понимание JavaScript требует систематического подхода и более глубокого погружения в тему. Добавил он дополнительное поле в HTML-код и на этом все.

<div>
    <label>
        Email:
        <input type="email" name="email" value="email">
    </label>
</div>

Не трудно догадаться, что емейлов от так и не дождется от своих клиентов, поскольку JavaScript ничего об этом не знает. Нужно было добавить в JavaScript следующие строчки кода.

...
email = form.querySelector('[name="email"]'),

const data = {
    name: email.value,
    ...
};

Универсальный способ получения данных из формы

Есть способ, как получать данные из формы, независимо от получения идентификаторов, классов или селекторов полей формы. С помощью цикла for..of, мы переберем все поля формы. Создадим пустой объект data, куда будут записываться найденные значения полей.

const data = {};

Получим имена из полей формы, найденные в цикле. Сделаем проверку, если у поля есть атрибут name, тогда мы извлечем из него данные и запишем их в объект по ключу name.

for (let field of form) {
    const {name} = field;

    if (name) {
        const {type, checked, value} = field;

         data[name] = isCheckboxOrRadio(type) ? checked : value;
    }
}

Затем проверим есть ли у нас тип полей checkbox или radio, чтобы JavaScript возвращал true или false. Напишем функцию isCheckboxOrRadio, которая определит, является ли поле чекбоксом или радиокнопкой. Если галочка стоит, то вернется значение true, в противном случае функция вернет false.

const isCheckboxOrRadio = type => ['checkbox', 'radio'].includes(type);

Если тип поля checkbox, то в качестве значения возьмем checked, иначе в объект с данными попадет value.

data[name] = isCheckboxOrRadio(type) ? checked : value;

Весь JavaScript код:

const isCheckboxOrRadio = type => ['checkbox', 'radio'].includes(type);

const {form} = document.forms;

function getFormValue(event) {
    event.preventDefault();

    const data = {};

    for (let field of form) {
        const {name} = field;

        if (name) {
            const {type, checked, value} = field;

            data[name] = isCheckboxOrRadio(type) ? checked : value;
        }
    }

    console.log(data);
}

form.addEventListener('submit', getFormValue);

Теперь выведем результат в консоль.



Получение данных из HTML формы используя цикл for..of.

При способе получения данных через цикл, заказчику не нужно править JavaScript код. Циклу for..of все равно какие поля у формы есть и какие ещё будут.