[Перевод] Что нового можем делать с формами в 2022?

Эта статья — перевод оригинальной статьи Ollie Williams «What«s New With Forms in 2022?»

Также я веду телеграм канал «Frontend по-флотски», где рассказываю про интересные вещи из мира разработки интерфейсов.

Вступление

Браузеры постоянно добавляют новые функции HTML, JavaScript и CSS. Вот несколько полезных дополнений к работе с формами, которые вы могли пропустить…

requestSubmit ()

Safari 16 станет последним браузером, в котором будет добавлена поддержка requestSubmit.

Прежде чем мы рассмотрим, как работает .requestSubmit (), давайте напомним себе, как программная отправка формы с помощью JavaScript работает при использовании метода .submit (). Отправка формы с помощью submit () не вызывает событие submit. Таким образом, в следующем коде форма отправляется, функция preventDefault () не запускается, и в консоль ничего не записывается:

const form = document.forms[0];
form.addEventListener('submit', function(event) {
  // code to submit the form goes here
  event.preventDefault();
  console.log('form submitted!');
});

document.querySelector('.btn').addEventListener('click', function() {
  form.submit();
})

.submit () также будет игнорировать любую валидацию HTML формы. Учитывая следующую разметку, форма будет отправлена, когда инпут пуст, даже если инпут имеет атрибут required:

.requestSubmit () — это альтернативный способ отправки формы с использованием JavaScript, но, в отличие от .submit (), валидация HTML-формы предотвратит отправку формы. Если все данные, введенные в форму, проходят проверку, будет запущено событие submit, что означает «form submitted!» будет выведено в консоль в следующем примере:

form.addEventListener('submit', function(event) {
  event.preventDefault();
  console.log('form submitted!');
});

document.querySelector('.btn').addEventListener('click', function() {
  form.requestSubmit();
})

Вы можете добиться того же самого эффекта, щелкнув на кнопку отправки формы, но requestSubmit, возможно, является более элегантным решением.

Свойство submitter события submit

Свойство SubmitEvent.submitter получило полную кросс-браузерную поддержку с выпуском Safari 15.4. Это свойство только для чтения указывает элемент

Если у вас есть несколько кнопок отправки или входных данных, каждая из которых имеет свое значение, на сервер будет отправлено только значение кнопки или ввода, которое было нажато для отправки формы, а не оба значения. Ничего нового. Новым является то, что прослушиватель событий для события отправки теперь имеет доступ к свойству event.submitter. Вы можете использовать это, чтобы добавить класс к кнопке или вводу, который инициировал отправку формы, например, или чтобы получить его значение или любой другой из его HTML-атрибутов.

document.forms[0].addEventListener('submit', function(event) {
  event.preventDefault();
  console.log(event.submitter.value);
  console.log(event.submitter.formaction);
  event.submitter.classList.add('spinner-animation');
})

Событие formdata

В этом нет ничего нового, но кросс-браузерная поддержка была достигнута только с выпуском Safari 15. Основной вариант использования события formdata — позволить кастомным элементам участвовать в отправке форм. Однако за пределами веб-компонентов он все еще может быть полезен.

Вы добавляете прослушиватель событий formdata в форму, с которой хотите взаимодействовать:

document.querySelector('form').addEventListener('formdata', handleFormdata);

Событие запускается как обычной отправкой HTML-формы, так и появлением new FormData ().event.formData содержит все отправляемые данные.

function handleFormdata(event) {
  for (const entry of event.formData.values()) {
    console.log(entry);
  }
}

Коллбэк для прослушивания событий formdata запускается перед отправкой данных на сервер, что дает вам возможность добавить или изменить отправляемые данные.

function handleFormdata(event) {
  event.formData.append('name', 'John');
}

Вы могли бы изменить или добавить FormData внутри обработчика события отправки, но formdata позволяет вам отделить логику. Это также альтернатива использованию скрытых входных данных в разметке вашей формы в тех случаях, когда вы отправляете форму «по старинке», то есть полагаетесь на встроенную функциональность HTML для отправки формы, а не на собственную.

showPicker () для input элемента

showPicker () поддерживается начиная с Chrome 99, Firefox 101 и в готовящейся к выпуску Safari 16. Для input элемента, атрибутом type которого является Date, Month, Week, Time, datetime-local, color или file, showPicker () предоставляет программный способ отображения пользовательского интерфейса выбора. Для ввода цвета и файла всегда можно было программно отобразить средство выбора, вызвав .click на инпуте:

document.querySelector('input[type="color"]').click();

Этот подход не работает для ввода даты, поэтому был добавлен этот новый API. .showPicker () также будет работать с входными данными цвета и файла, но нет никакого реального преимущества в его использовании по сравнению с .click ().

46b0a75d182d8d2a239022c75b96d15b.png

Inert атрибут

Всегда можно было заблокировать несколько инпутов одновременно, заключив их в fieldset с атрибутом disabled:

Inert — это новый атрибут HTML. Он работает не только с формами, но формы, безусловно, являются ключевым вариантом использования. В отличие от атрибута disabled, inert можно применить к самому элементу формы. Все в форме будет недоступно для фокусировки и кликов. Когда дело доходит до вспомогательных технологий, inert аналогичен установке aria-hidden=«true». В отличие от атрибута disabled, inert по умолчанию не применяет никаких стилей, но их легко добавить самостоятельно:

form[inert] {
  opacity: .2;
}

Это еще не все…

Большой проблемой является стилизация элементов