Всем снова привет.
Сегодня буду рассказывать о моем любимом — о Юзабилити.
В русском языке есть этому модному слову замена — Удобство. Но когда речь идет об удобстве взаимодействия человека с компьютером, то мы сразу говорим юзабилити.
В этой статье будет рассмотрена всего лишь форма ввода даты, которая нам так часто встречается при регистрации на любом сайте. Чаще всего просят вводить свою дату рождения. Зачем всем на свете админам знать день моего рождения — неизвестно, но будем считать, что для статистики.
Сначала окунемся в историю.
Все самые первые сайты и программы предлагали пользователю вот такое поле:
Естественно, сразу возникли проблемы. Люди заполняли данное поле кто как мог и привык:
12 июля 1980
12-07-1980
07/12/80
и так далее...
Поэтому было придумано следующее:
Но некоторым было по барабану на это, другие просто не читали, то, что было написано в скобках.
Тогда программисты и придумали разделить поле на три:
Вроде бы можно было облегченно вздохнуть. Но пользователи народ тупой и плевать они хотели на эти поля. По этим причинам в поле день вбивался месяц и наоборот. Кто вводил месяц числом, а кто и словом.
Разработчики призадумались и поняли что лучший способ избежать ошибок от тупых пользователей это не дать им возможности допустить их. И изобрели они вот это:
В таком виде, данная форма встречается, на большинстве сайтов, и по сей день. И вроде бы все нормально, но есть много НО.
Во-первых, она не исключает всяких там 31 февраля.
во-вторых, само легко выбрать месяц, но вот день, а в особенности год выбирать очень сложная задача. Посудите сами:
Нужно долго скролировать, чтобы добраться до нужного года. А мы, ведь, стремимся к идеальности и должны адаптировать интерфейс, как для стариков, так и для младенцев. В связи с этим на многих нынешних сайтах мы видим следующее:
mail.ru

Яндекс
Всякие форумы
ebay
К сожалению, все эти формы на защищены от дурака и не исключают ввода, допустим, такой даты: 31 ноября 3450 года.
Что же мы можем сделать? А сделать можно многое. Мы можем учитывать особенности каждого месяца, а также високосный год или нет.
— Да ты ахренел! — скажут программисты.
Но я скажу, что данный модуль придется сделать один раз и потом в будущем его без проблем прикручивать к любому вашему продукту.
Но в связи с этим порядок заполнения придется поменять: сначала мы будем вводить год и месяц, а потом на основе полученных данных в список День ставить нужное количество деньков. Причем список День будет не доступен для пользователя, пока он не выберет Год и Месяц.
Ну, вроде проблем возникать не должно, пользовать по обычаю двигается слева направо.
Но проблемы еще есть. Списки Год и День все еще не юзабельны.
Что мы можем предпринять?
Я придумал вот, что:
На мой взгляд, в таком списке отыскать требуемый год будет полегче — глаз легко цепляется за десятки, ну и вниз провести на несколько строчек тоже нетрудно. Нудного скроллинга нет.
Список Месяц, вроде бы, не требует ни каких модернизаций.
А вот День, можно представить в классическом календарном блоке
Естественно дни следует выводить на основе, первых двух полей.
На мой взгляд, такая форма ввода даты рождения, позволит избежать заведомо неверных дат и даст пользователю удобный ввод.
Буду рад любым комментариям.
комментарии (200)
кстати должен вам сказать что вашей идеей пользуются ВСЕ сайты специализирующиеся на бронирование отелей.
Я бы этого так не оставил...
1) а если я хочу указать только месяц и день? такое часто бывает - и было бы глупо запрещать..
2) а если речь пойдет не только о годах рождения? список годов будет все так же катастрофически велик :(
А на самом-то деле лучшая форма для ввода даты та, что была дана в самом начале статьи:
Введите дату:[__________] (текстовое поле)
Во-первых, никуда не надо ничем тыкать, форма не должна быть расчитана на мышь.
Во-вторых, пользователь может ввести дату как ему хочется:
1 марта 2008
Март 1 2008
2008-03-01
1/3/2008
01.03.08
1-е марта 2008 г.
и прочие вариации на тему. Обработчик ввода должен не ленится и разобрать это, благо во вменяемых средах (perl, ruby и т.д.) это делается в одно движение наподобие Time::ParseDate. В третьих, это избавляет от громоздкого кода на клиентской стороне, и сильно упрощает логику (ввод в три приёма это же ужос).
Единственная недоднозначность, которая может возникнуть, если кто-то решит, что он американец, и нужно вводить месяц-день-год, тогда 3/1/2008 будет неверно, но если форма по-русски, вероятность такого ноль.
Ну и ещё нужно смотреть на варианты типа 01.03.08, и при обнаружении неоднозначности такого рода форму не принимать. И только если дату не удалось ввести сразу верно (3% оригиналов), то выводить подсказку, помогающее заблудшему с форматом:
Введите дату (ДД-ММ-ГГГГ):[__________]
Этим мы убиваем двух собак: дать без ограничений ввести дату нормальным людям, которые её вводят однозначно, и заставить всё же её ввести ненормальных со второй попытки.
Интерфейс должен быть удобен большинству. Из-за немногочисленных альтернативно одарённых так усложнять жизнь нельзя.
Но индустрия бронирования (отели, билеты, экскурсии) очень сильно завязана на день недели. И вот там как раз предложенный автором статьи метод просто обязан применяться. С добавной подсветки выходных и общегосударственных праздников в идеале.
При вводе данных, уже введенная строка посылается на сервер. Колбек (callback - серверный скрипт для обработки и посылки данных применяемых в технологии AJAX) обрабатывает данные, определяя формат вводимых данных и сразу предлагает пользователю ввести дату в определенном формате, а если пользователь вводит какой-то месяц, то и закончит ввод месяца.
Метод сокращает лишние действия пользователя и дает сразу правильный результат.
А на худой конец можно использовать предопределенный формат в текстовом поле будет сразу храниться текущее значение даты и при замене пользователем данных в этом поле будут выводиться подсказки с помощью JavaScript о требуемом формате на текущем этапе ввода.
с другой стороны, допустив прямой ввод с клавиатуры мы упираемся вот в это: "Люди заполняли данно поле кто как мог и привык: 12 июля 1980 12-07-1980 07/12/80"
в моей форме — фокус последователен
Если конечно 100% дебилы - не ваша ЦА.
"Мотороллер не мой, я просто разместил объяву!"
В полу программиста открывается люк, оттуда вылазит монах, бьет программиста в ухо и кричит:
"Мотороллер не его, он просто разместил объяву!"
interface Core_Validator
{
````/**
````* @return bool
````*/
````public function isValid();
}
interface Core_Validator_Speaking
{
````/**
````* @return array
````*/
````public function getErrors();
}
final class Model_Validator_Date implements Core_Validator, Core_Validator_Speaking
{
````public function isValid()
````{
`````````if (чото) {
``````````````$this->errors[] = 'Блин, так нельзя';
`````````}
`````````if (чото-еще) {
``````````````$this->errors[] = 'Блин, темболе нельзя';
`````````}
`````````if (чото-ужсовсемплохое) {
``````````````$this->errors[] = 'Блин, так ващенизяникак';
`````````}
````public function getErrors()
````{
````````return $this->errors;
````}
}
````* @param mixed $value
````* @return bool
````*
````*/
````public function isValid($value);
, если точнее
Проще нажимать цифирьки и пару раз кнопочку Tab, чем 6 раз тыкать мышкой при этом аккуратно целясь, попутно решая нетривиальную когнитивную задачу: куда-же ткнуть...
а ведь в разных странах по разному принято указывать порядок месяца и дня. И то ли это 11 декабря толи 12 ноября...
Найти: в каком выбирать число, а в каком — месяц.
Решение: смотрим, в каком селекте среди вариантов есть число 13. Это число. Другой селект — месяц.
да и если вводил американец - тут всё однозначно, если россинин - тоже
Все, что может быть корректно автоматизировано, должно быть автоматизировано.
Другое дело проверять IP-адрес пользователя и страну, но это тоже не выход, т.к. человек может быть в другой стороне по работе или каким-то другим делам.
У нас в конторе какие-то языки, кроме дефолтового, добавлены только у меня (делал многоязыковую поддержку) и у тестера (который это потом проверял). У остальных там только дефолтовый английский.
Вот и у меня такая ситуация.
буквами наверное имелось ввиду?
по мне было бы удобней годА (десятки) сделать в левом столбце, т.е. не по столбцам выбирать, а по строкам
1960 1961 1962 1963 ...
1970 1971 1972 1973 ...
1980 1981 1982 1983 ...
что-то типа:
1900
70 71 72...
80 81 82...
90 91 92...
2000
00 01 02...
а в вашей... слишком много для юзверя "думать надо".
ИМХО - удобнее ограничение по маске ввода в обычном текстовом поле.
Ну и ему подобные юзабилити для пользователя.
Правда, мне вот именно в таком виде получение даты от юзверов еще ни разу не требовалось, но я бы сделал проще: Поле для ввода с подписью ожидаемого формата, а снизу, например, прописывание нормальным человеческим языком, как была понята дата, вписаная юзвером.
Например мы хотим формат ДД.ММ.ГГ, человек нам вводит 03.03.08, мы ему подписываем для контроля, что мы это поняли как 3 марта 2008 года.
Причем для пущей юзабельности сделать валидатор прям на js, потому как ajax тут нафиг не уперся, в котором предусмотреть основные возможные ошибки (типа запятые или слэши автоматом понимать как разделитель и т.п.)
В случае кривого, непонятного нам ввода, так прямо и пишем, что введена хня и форму сабмитить не давать.
год высокой кости?
Если это гостиница/билеты - там, как правило, выбирать надо в текущем, максимум, следующем месяце - для этого вываливать календарик, пожалуй, оптимально.
А если надо спросить для той самой статистики дату рождения - ну введут пять человек из тысячи 12/11 вместо 11/12. И что?
Ещё вариант - после того как пользователь покинул поле ввода даты, рядом рисовать нечто вроде валидатора - писать дату человеческим языком: [01/02/03 ].......1 февраля 2003 года.
Тогда сразу понятно кто что имел в виду и кто как кого понял.
а вот валидатор это хорошая идея, причём "валидировать" прямо во время ввода
Но, похоже, мы в меньшинстве.
http://dynamicdrive.com/dynamicindex7/jasoncalendar.htm
удобное API, удобная работа с всевозможными форматами данных и нет проблем с 31 февраля.
я записываю даты так или "20071225", заодно и сортируется сразу правильно, и искать проще
хабрачеловек
но мы говорим о "среднестатистическом пользователе"
тот, на кого не планируется наступать - тут писать вообще не будет :)
А я лучше помню - времена года, а по ним месяцы... потом уже года и даты.
Парсер для дат написать не так уж и сложно. Если введенный пользователем текст хранится как он есть, можно время от времени искать все даты, которые парсер не смог распознать, и если это был недостаток парсера, дописывать ему вариантов. Через какое-то время он будет распознавать почти все.
------------------
Ну вроде проблемм возникать не должно, пользовать по обычаю двигаеться слева направо.
------------------
проблемм -> проблем
двигаеться -> двигается
пользовать -> пользователь
по обычаю -> обычно
Это не говоря уже о пунктуации.
Вообщем, рекомендую изучать не юзабилити, а грамматику и пунктуацию.
Но важно проверять всё же текст статьи перед выкладкой. Комментировать можно и с ошибками, это не важно.
Хотя сам лоханулся, да. Признаю)
Самый ужасный вариант ввода - разбиение на 3 поля...
А идеальный - текстовое поле с кнопкой календарика.
Итого:
Дату рождения проще всего ввести с клавиатуры, не шарясь мышкой по экрану, в то время, как ближайшие даты лучше выбирать на календаре. Распознавание даты - задача просто элементарная, надо лишь учитывать американский формат (ММ/ДД/ГГГГ) - либо упомянуть об этом, либо, как очень хорошо уточнили выше, выводить рядом то, как дату понял скрипт.
Об удобстве календаря тоже можно много чего сказать, формат комментария для этого не слишком удобен. Можно например воспользоваться "скроллинговым" календарем (Горбунов, Apple etc) для ближних дат, либо "полноразмерным" календарем (ваш вариант, ext-js etc), в котором каждую часть даты можно выбирать из полного списка.
Далее, разумеется, это все улучшать, например совмещая подходы - календарь со скроллом, в котором клик на год показывает большое табло.
В итоге получаем компактное поле с большими возможностями. Очень хочу в ближайшее время написать подробные разборы различных элементов интерфейса.
Все это, конечно, было имхо, но я надеюсь, что так думаю не я один...
Дату пользователь вводит в каком угодно формате сам, а как её распарсить - это уже моя задача.
Единственная загвоздка с американским форматом дат: если кто-то введёт 03/04/2008 - это можно понять двояко, но поскольку моя аудитория исключительно европейская, я принимаю такие строки как европейский формат дат (о чём отдельно сообщаю пользователю).
Вообщем -> В общем
lol
Вообще через 15 лет за людей будут вводить даты моллюски, управляемые имплантатами в мозгу. Нужно уже думать над интерфейсами в этом направлении.
но я думаю, что вообще это должно выгляеть след. оброзом:
просто, ПРОСТО! одно поле(к которому прикручен хитрый ява скрипт)
и в этом поле юзер вводит свою дату, просто нажимая на кнопки цыфирек...
в любом порядке, тоесть, либо в америкоском стандарте (02.17.80), либо в русском (17.02.80)
вот и все!
п.с. мое мнение-мнение абсолютного юзера.
Проверка на стороне клиента пускай будет на JS.
если мне щас 28, что мне мешает поставить 25, 27 или 33???
помему тут речь не о достоверности, всетаки, а о ЮЗАбИЛИТИ...
2000 1990 1980
2001 1991 1981
2002 1992 1982
... ... ...
Потому что большинство вводимых дат в районе 1970 - 2000, и пользователю не придется вести курсор в конец таблицы, как в авторском варианте.
Оптимизируя разметку для уменьшения расстояний и числа кликов, необходимых для достижения цели, не следует забывать и о логике.
Но если бы количество пользователей из одной категории значительно превышало всех вместе взятых из других(>95%), я бы рискнул поставить эту категорию уже выбраной по умолчанию.
в авторском интерфейсе необходимо взглядом пробежать ~8 четырехзначный цифр, прежде чем пользователь найдет 'свой' ряд.
В случае с 'японским' порядком - 3 наиболее часто выбираемые даты находятся сразу под полем 'выберите год', т.е. глазу никуда бежать не надо - все цифры перед ним, полжзователь даже удивиться не успеет :)
По-моему быстрее будет привычный глазу порядок. Ну хотя бы вот так (намеренно снизу вверх):
2000 2001 2002 2003 ...
1990 1991 1992 1993 ...
1980 1981 1982 1983 ...
Имхо это как раз тот случай когда эргономичность (минимизация времени, расстояний) отличается от юзабилити (понятность, логичность). Быть может если нужно было бы выбирать 100 дат, было бы разумнее сделать эргономичным, но в выборе даты рождения время на нахождение закономерности (и целесообразности, мол почему вдруг все наоборот?) не окупится.
Но тут мне интересно, почему вариант строчного расположения показался вам более удобным, чем столбцами?
2000 1990 1980 ...
2001 1991 1981 ...
2002 1992 1982 ...
больше похож на обычные выпадающие списки(по годам от десятков), то он более легче будет восприниматься?
Правда, работает пока только в Опере ;)
Edit сверху синхронизировать с календариком снизу
Думаю в этой статье не хватает сопоставления различных видов (динамических)форм с сайтами различной тематики. В смысле где было бы удобнее так, а где эдак.
Пользователи не должны задумываться о том, как правильно вводится дата, чтобы наша систем а её распознала.
Сейчас в своей песочнице леплю что-то вроде этого:
Идея в том, что некоторая критическая дата (скажем, допуск только лицам двадцатилетней степени разложения) каждый раз отображается новая, в зависимости от года за окном. И в БД сохраняется однажды.. обеспечивая проверку уровня допуска. Набегают орки, рисуют предупреждения, гоняют малолеток — если пользователю явно меньше 13 лет, то согласиться с утверждений количеством диких придется ему, на свой страх и риск.
Поскольку всех данных нам, в общем-то, и не надо (а кое-что дублируется сервисами проекта) — хватает отображения общих. Если человек захочет ввести личные данные — от лишнего клика по тексту не обеднеет (иначе »ахтунг, быдлокун«). А по клику можно хоть десять скрытых div'ов|слоев вывести, хоть для указания времени рождения в Unix time-формате, ня.
Да, за копипаст зодиакального круга с DreamsTime'а попрошу не бить.
http://www.therandom.org.ua/files/dateform.png
Последний формат даты можно подгружать, учитывая региональные стандарты отображения даты пользователя (страну, например, по IP можно предположить).
А где пунктик [x] ничего из вышеперечисленного? :)
ЗЫ. Если серьезно, то дату с любым разделителем и любым данным написанием может разобрать сам скрипт (не нагружая человека), если только не учитывать (а у вас это тоже не берется в расчет) что 12/02 кто-то прочтет как 12 декабря, а американец как 2 декабря.
Но с моей точки зрения на юзабилити (она сугубо субъективна и не претендует на абсолютную истину) пользователю необходимо(!) дать возможность принимать решение — что и в каком формате передавать "незнакомым людям". Даже не смотря на то, что после ввода парсер все-таки перепроверит и в случае нестыковки переформатирует дату.
Поэкспериментируем:
http://www.therandom.org.ua/files/dateform2.png
Извините, не могу напрямую картинку добавить
В процессе дискуссии рождаються интересные вещи )
Проблемма - *проблема
Естесвенно - *Естественно
данно - *данное (в контексте)
побарабану - *по барабану
програмисты - *программисты
следующие - *следующее (в контексте)
Вродебы - *Вроде бы
вбивалься - *вбивался
избешать - *избежать
Не всё, не усну - дополню
неисключают - *не исключают
высокостный - *високосный
ахренел - *охренел (приставки "а" не существует)
Стилистику, и, пунктуацию? дажетрогать небуду.
Мне кажется, хабралюдям удобнее будет читать грамотно написанный текст.
А про личное сообщение... Исправлюсь.
Там намного удобнее.
2000 01 02 ..
1990 91 92 ..
Это наверняка depends, и говорю я с позиции пользователя, а никак не юзабелиста:), так что на всякий случай объяснюсь. Отсчёт прошедших лет мне представляется задом наперёд, т.е. десятки удобнее воспринимать, начиная с последнего. Но, поскольку десятки служат отправной точкой, после отлова её нужный год проще выбрать уже просто цифрой (без обратного отсчёта).
Ну а строчки vs столбцы мотивировать не могу, они уж, наверное, точно кому как.
в HTML 5, может стоит подумать над использованием этого инструмента ?
в HTML 5 есть type date для input. может стоит подумать приспособить его ?
снизу ссылка на скрин работы тэга.
http://img84.imageshack.us/my.php?image=clipboardqt6.jpg
Хотя пользователю как таковому всегда быстрее и удобнее впечатать день, месяц и год с клавиатуры, потому что это быстрее ))
я бы как пользователь предпочла этот вариант. Другое дело, что действительно ошибок будет масса
PS
Лучший вариант - интуитивно понятный для любого имбицила, то есть первый.
еще 20 секунд почему два ряда годов. потом заметил мелкие блеклые буковки с примечаниями. офигел.
сейчас уже, начав писать комментарий, увидел еще совсем мелкие и совсем неразличимые циферки рядом с месяцами. секунд 10 на то, чтобы понять, что они обозначают.
не говоря уже о последних цифрах годов в верхней строке и завершающей строке с невидимой надписью «подтвердить».
скажите честно: вы издеваетесь? или это в шутку запостили?
Однако, после зрелых размышлений, я эту штуку убрал подальше, и сделал обычные списки — может длинный скролл кого-то и смущает, зато однозначно и всем понятно.
По крайней мере нестандартное и смелое.
Но разобраться точно трудно.
Почему не использовать выбиралку даты в виде обычного и привычного календаря? (Например как в настраивалке времени в винде или кде) ?
потом, так ли много пользователей, родившихся в 1900м году? или 1910? сомнительно. но это мелочи. главное это то, что такая куча цифер просто сбивает с толку сразу.
например, в опере есть фича, которая по одному нажатию заполняет все поля - от имени и фамилии до почтового индекса. Один раз туда забил данные - рассовывай по всему инету, не жалко.
я понимаю, что к разработчикам сайтов это отношения не имеет, но всё же..
Если в опере это есть, наверняка существуют плагины и в Огнелис, и в прочие.
Я конечно же отдаю отчёт в том что это некие проблемы.. Но если уж речь об этом..
Ну например.. Ввёл юзер неправильно дату у вас, а вы ему вместе с уведомлением о косяке ссылочку на такой плагин. И помощь, и развитие некое.
Все же пользуются автозаполнением/автовходом на сайты...
А через какое-то время в будущем - на сайте вместо огромного количества форм только разрешение на ввод данных из браузера (с какой-нить возможностью корректировать при желании)
Если человек "дурак" то никто не помешает отправить 31 февраля GET на сервер, а если опечатался, то только поблагодарит если появится подсказочка что такой даты нет и вы вероятно ошиблись.
1. можно ввести вручную
2. 4 клика вместо 6ти
3. поле ввода покороче, и покакуратнее выглядит
4. в выборе года можно один пункт сделать "не указывать" или вроде того
Различные календарики, как по мне, подходят только для дат не сильно далеко отклоняющихся от текущей, дату рождения не удобно вводить
Проще проверить дату после введения и сообщить, если ввод неправильный. Большинство введет дату верно, и потратят на ввод меньше времени, чем с вашим решением. У Яндекса хороший вариант.
2. а без привлечения внимания пользователя к освоению "инновационного интерфейса"?