Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Рецепт "Мгновенная валидация форм" #5131

Merged
merged 47 commits into from
Mar 5, 2024

Conversation

makarovaiuliia
Copy link
Contributor

@makarovaiuliia makarovaiuliia commented Jan 19, 2024

Описание

Добавляю статью-рецепт "Мгновенная валидация форм"

Closes #2732

https://content-5131.dev.doka.guide/recipes/validation/

Чек-лист

  • Текст оформлен согласно руководству по стилю
  • Ссылки на внутренние материалы начинаются со слеша и заканчиваются слэшем либо якорем на заголовок (/css/color/, /tools/json/, /tools/gulp/#kak-ponyat)
  • Ссылки на картинки, видео и демки относительные (images/example.png, demos/example/, ../demos/example/)

@github-actions github-actions bot added статья Расширенный материал рецепт Контент для Рецептов labels Jan 19, 2024
@vitya-ne
Copy link
Contributor

vitya-ne commented Jan 19, 2024

Привет, классный рецепт!
Если не против я бы предложил добавить дополнительную проверку для текстовых полей.

В текущей реализации я могу ввести в поле "Имя" только пробелы и стандартная валидация пройдет.
Или ввести только одну букву в поле Фамилия и пробелы:

изображение

Предлагаю добавить дополнительную функцию проверки длины строки:

function checkLengthMismatch(inputElement) {
  if (inputElement.type !== 'text') {
    return ""
  }
  const valueLength = inputElement.value.trim().length
  if (valueLength < inputElement.minLength) {
    return `Минимальное количество символов ${inputElement.minLength}`
  }
  return ""
}

и ее вызов из checkInputValidity() :

function checkInputValidity(inputElement) {
  if (inputElement.validity.patternMismatch) {
    inputElement.setCustomValidity(inputElement.dataset.errorMessage);
  } else {
    inputElement.setCustomValidity(checkLengthMismatch(inputElement)); // <--
  }
  ...

Тогда валидация не пропустит пробелы:
изображение

@makarovaiuliia
Copy link
Contributor Author

Привет!

Спасибо большое за очень классное дополнение!❤️ Я добавила эту функцию в код и подправила текст статьи)

@skorobaeus skorobaeus changed the title Article/recipes Рецепт "Мгновенная валидация форм" Jan 22, 2024
@skorobaeus
Copy link
Member

Мой любимый фильм! 🤩

Спасибо тебе большое за рецепт!

Я немного увеличила шрифты в демках, чтобы было и ближе к нашей дизайн-системе, и легче читать. Под капотом убрала у сообщений об ошибках абсолютное позиционирование, чтобы мы не полагались на то, что, если текст будет достаточно мелкий, он поместится в отведённое пространство. Визуально ничего не изменилось, но теперь, если что, форма просто немного подрастёт :)

@makarovaiuliia
Copy link
Contributor Author

Ура, я рада, что понравилось)❤️ Если что-то нужно будет доделать, пиши)

Copy link
Member

@solarrust solarrust left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как же давно эта статья ждала своего автора! Спасибо большое, что написала её!

Прошлась по первому кругу, предложила небольшие правки форматирования и устоявшихся договорённостей по оформлению.

У меня есть один консёрн во всей этой замечательной истории: блокирование кнопки до верного заполнения полей. В моей голове это плохой интерфейсный паттерн. Кмк, кнопка должна оставаться доступной пользователю, но данные не должны отправляться пока не заполнены поля верно. При ошибке по нажатию на кнопку можно подкручивать до неверно заполненного поля.

Что ты думаешь по этому поводу? Очень интересно узнать твоё мнение. Может быть есть какие-то хорошие источники с аргументами в пользу блокировки кнопки?

recipes/validation/demos/final-form/index.html Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/index.md Outdated Show resolved Hide resolved
recipes/validation/demos/final-form/index.html Outdated Show resolved Hide resolved
recipes/validation/demos/final-form/index.html Outdated Show resolved Hide resolved
@makarovaiuliia
Copy link
Contributor Author

Привет!

Так, сначала по поводу кнопки: сразу оговорюсь, что я не большой эксперт в UX, как и не большой эксперт в принципе во фронтэнде - я только начинаю:)) Но у меня по этому поводу такая мысль: Мне кажется, что деактивация кнопки помогает в ориентации пользователя в интерфейсе. То есть она сразу, наряду с подсвеченными красным полями и комментариями помогает юзеру понять, что форма заполнена неверно.

Насчет "при ошибке по нажатию на кнопку можно подкручивать до неверно заполненного поля" - мне кажется, что смысл валидации на лету состоит в том, чтобы не пришлось нажимать на кнопку, поля сразу подсказывают тебе неправильность их заполнения, пропустить их будет сложно.

Что касается статей, я не нашла конкретно про кнопку, возможно я не там ищу, так как правда в UX я еще не копала:(( Я сейчас обучаюсь в яндекс-практикуме и именно там предложили использовать деактивацию кнопки при заполнении формы.

В общем, я все еще за то, чтобы отключать кнопку, но давайте все вместе решим как по итогу поступим, может спросить какого-нибудь эксперта в UX? Есть ли на примете кто-то с такой компетенцией?)

Co-authored-by: Alena Batitskaia <solarrust@users.noreply.github.com>
@makarovaiuliia
Copy link
Contributor Author

@vitya-ne, скорее дело в самом обучении и как оно было построено на этой теме. Нас в один момент после простецких проектов на чистом JS окунули в TypeScript и ООП одновременно, то есть не только надо было мыслить в новой парадигме, так еще и с новым синтаксисом....+ еще начали не с простых проектов как в Доке проект "тяжеловато" (вроде так называется), а со сложных, где все запутано. Но я вот за пару недель сама разобралась и теперь, вроде и ничего страшного и даже нравится😁

@skorobaeus
Copy link
Member

Отлично! Сделала чуть пошире на декстопе ✌

Copy link
Member

@solarrust solarrust left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я совсем чуть-чуть отформатировала код примера и поредачила текст.

От меня аппрув, спасибо за рецепт!

@vitya-ne
Copy link
Contributor

@solarrust, @skorobaeus, @TatianaFokina
Возможно в тексте стоит упомянуть о локализации стандартных validity сообщений. Например, у меня English в браузере и я вижу сообщения сразу на двух языках:
image

@TatianaFokina
Copy link
Contributor

Возможно в тексте стоит упомянуть о локализации стандартных validity сообщений. Например, у меня English в браузере и я вижу сообщения сразу на двух языках:

Да, важное уточнение. Это потенциальные проблемы с интернационализацией, конечно…

@TatianaFokina
Copy link
Contributor

Что я нашаманила:

  • Использовала для ошибки про пустую форму не псевдоэлемент, а с помощью JS добавляю и удаляю сообщение. Причин несколько: псевдоэлементы не очень доступны для скринридеров, когда они появляются и исчезают; не стоит показывать ошибки при наведении на элемент, пока ты ничего ещё не успел сделать.
  • Связала ошибки с полями и кнопкой через aria-describedby.
  • Сделала ошибки изменяющимися областями aria-live, чтобы скринридеры автоматически их читали, как только они появились.
  • Актуализировала примеры в тексте.
  • Добавила врезку про локализацию.

@TatianaFokina
Copy link
Contributor

Если никто не против моих последних изменений, можно смело мёрджить!

Copy link

github-actions bot commented Mar 5, 2024

Превью контента из 8a2c518 опубликовано.

@TatianaFokina
Copy link
Contributor

Е-е-е-е, мёрджим (за спиной Полины)!

@makarovaiuliia, спасибо огромное-преогромное за замечательный рецепт ❤️

@TatianaFokina TatianaFokina merged commit 4d3b890 into doka-guide:main Mar 5, 2024
6 checks passed
@inoyakaigor
Copy link

@makarovaiuliia
image
Спецсимвол \s матчит не только пробел, но и кучку других непечатаемых символов (MDN), что может стать потенциальным вектором атаки. В данном примере в регулярке лучше явно указать пробел

@TatianaFokina
Copy link
Contributor

@makarovaiuliia image Спецсимвол \s матчит не только пробел, но и кучку других непечатаемых символов (MDN), что может стать потенциальным вектором атаки. В данном примере в регулярке лучше явно указать пробел

Унесла справедливо замечание в ишью. Пасиб!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
рецепт Контент для Рецептов статья Расширенный материал
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Валидация полей формы на лету
6 participants