Библиотека Cash — это легковесный инструмент, являющийся альтернативой jQuery, предоставляющий удобный API для работы с DOM, событиями и AJAX-запросами. Одной из частых задач при работе с формами является их сериализация — преобразование данных формы в строку, объект или другой удобный формат для отправки на сервер или дальнейшей обработки.
Сериализация формы в строку позволяет подготовить данные к отправке
методом application/x-www-form-urlencoded. В Cash для этого
можно использовать встроенные методы работы с элементами формы.
Пример получения строки из формы:
const form = $('#myForm')[0];
const formData = new FormData(form);
const params = new URLSearchParams(formData).toString();
console.log(params);
Пояснения:
FormData(form) — создаёт объект, содержащий все поля
формы.URLSearchParams(formData) — преобразует данные формы в
строку запроса.toString() возвращает строку в формате
key1=value1&key2=value2.Данный подход универсален и подходит для любых типов полей: текстовых, радио-кнопок, чекбоксов и select.
Для более гибкой работы с данными часто удобнее получить объект Jav * aScript:
const form = $('#myForm')[0];
const formData = new FormData(form);
const dataObject = Object.fromEntries(formData.entries());
console.log(dataObject);
Ключевые моменты:
formData.entries() возвращает итератор пар
[ключ, значение].Object.fromEntries() преобразует эти пары в объект, где
имена полей становятся ключами.Такой объект удобно использовать для JSON-запросов, манипуляции данными на клиенте и передачи через AJAX.
Поля checkbox с одинаковым name требуют
особого внимания. Стандартная сериализация присваивает последнему
значению это имя, что часто нежелательно. Для корректной обработки:
const form = $('#myForm')[0];
const formData = new FormData(form);
const dataObject = {};
for (const [key, value] of formData.entries()) {
if (dataObject[key]) {
if (Array.isArray(dataObject[key])) {
dataObject[key].push(value);
} else {
dataObject[key] = [dataObject[key], value];
}
} else {
dataObject[key] = value;
}
}
console.log(dataObject);
Особенности:
После сериализации данные формы можно отправлять на сервер без перезагрузки страницы:
const form = $('#myForm');
form.on('submit', function(e) {
e.preventDefault();
const data = Object.fromEntries(new FormData(this).entries());
fetch('/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error(error));
});
Примечания:
fetch с JSON.stringify(data)
требует указания Content-Type.submit через Cash
(form.on('submit', callback)) предотвращает стандартное
поведение формы.Cash позволяет легко выбирать отдельные элементы формы, фильтровать их по типу и извлекать значения:
// Получение всех выбранных чекбоксов
const checked = $('input[type="checkbox"]:checked', '#myForm')
.map(el => el.value)
.get();
console.log(checked);
// Получение значения текстового поля
const username = $('#username').val();
console.log(username);
val() возвращает значение элемента или
устанавливает его.map() и get() используются для
преобразования коллекции Cash в массив JavaScript.Для форм, где элементы добавляются динамически, важно использовать делегирование событий:
$('#myForm').on('input', 'input, select, textarea', function() {
console.log(this.name, this.value);
});
Перед отправкой данные часто нужно фильтровать или изменять:
const form = $('#myForm')[0];
const formData = new FormData(form);
for (const pair of formData.entries()) {
if (pair[0] === 'phone') {
pair[1] = pair[1].replace(/\D/g, '');
}
}
FormData для универсального сбора
данных.Object.fromEntries для
работы с JSON.Content-Type и сериализацию данных.Такой подход обеспечивает компактный, универсальный и гибкий механизм сериализации форм в JavaScript с использованием библиотеки Cash.