Улучшение форм авторизации, регистрации и напоминации

27 мая 2009, 14:00 Евгений Белодед HTML и CSS рейтинг +52-

Гутен морген таг, майне либе фройнде. Пока писал, доброе утро превратилось в добрый следующий день )

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

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

К делу.

 

1. Доступность

Это был главный, на мой взгляд недостаток, который, в общем-то поправить было несложно. В чем суть: без js мы не могли увидеть другую форму, кроме той, которая показывается по умолчанию. Поэтому вместо "#" прописываем нормальные адреса страниц:

 

2. Код

Первое, что надо было поправить - ошибки оформить в массивы. Что и было сделано.

var er = [];
er[0] = "Неправильный формат email'a"; //0
er[1] = "Пароли не совпадают"; //0
er[2] = "Пользователь с таким email'ом уже зарегистрирован"; //0
er[3] = "Не угадали пароль. Или email. Попробуйте еще раз"; //1

Второе - сделать привязку событий на клики по псевдоссылкам более лаконичной. Для этого я убрал лишние классы из разметки и определял, что должно сработать ислодя из атрибута href ссылки:

$('.additional a').click(function(e) {
e.preventDefault();
var x;
switch ($(this).attr('href')) {
case ("signup.html"):
x = 0;
break;
case ("index.html"):
x = 1;
break;
case ("remind.html"):
x = 2;
break;
};
GoTo(x);
});

3. Фокусировка

Если бы мы попробовали в прошлом примере с помощью табуляции переходить по элементам формы, мы бы перескакивали с формы на форму, причем в некоторых браузерах маргин менялся бы автоматически, чтобы показать сфокусированные элементы формы и назад нам вернуться было бы проблематично.

Проблема решается простым указанием visibility: hidden для тех форм, которые сейчас не видны. На такие элементы формы фокус не переходит.

Таким образом при клике мы должны сделать блок, который сейчас приедет видимым:

$('.additional a').click(function(e) {
e.preventDefault();
var x;
switch ($(this).attr('href')) {
...
};
$(blocks[x]).css({ 'visibility': 'visible' }); //Эту строчку мы только что добавили
GoTo(x);
});

А уехавший блок надо скрыть:

var cur = 1;
function GoTo(num) {
margin = num * 382;
$('#wr').animate(
{ marginLeft: -margin }, 800, 'easeInOutBack', function() {
$(blocks[cur]).css({ 'visibility': 'hidden' });
cur = num;
});
}

Victor сделал разумное предложение: фокусировать на первом текстовом поле при переходе на другую форму. Предложение было весьма разумным. Реализуем.

function GoTo(num) {
margin = num * 382;
$('#wr').animate(
{ marginLeft: -margin }, 800, 'easeInOutBack', function() {
switch (num) {
case 0:
$('#email').focus();
break;
case 1:
$('#loginEmail').focus();
break;
case 2:
$('#remindEmail').focus();
break;
};
$(blocks[cur]).css({ 'visibility': 'hidden' });
cur = num;
});
}

4. Индикатор.

В форме не было индикатора загрузки. А без индикатора сейчас на приличные вечеринки уже не пускают. Генерируем его на аджакслоад.инфо и вставляем в уголочек.

Код увеличится на несколько функций: показ и скрытие индикатора, которые будут вызываться при вызове ajax-функций.

function ShowIndicator() {
$('#indicator').show();
}
function HideIndicator() {
$('#indicator').hide();
}

А в функцию авторизации вставляем в нужные места показ и скрытие индикатора:

function SignIn() {
pass = $('#loginPass').val();
email = $('#loginEmail').val();
ShowIndicator(); //показали
if ((email != "") && ( CheckPassword(email, pass))) {
//Sign User In
HideIndicator(); //скрыли
HideError();
} else {
ShowError(3);
HideIndicator();//скрыли, даже если залогинить не удалось
}
}

Смотрим Загружаем

Такие вот мелочи отличают плохое от хорошего. Спасибо всем читателям. Тем, кто критикует и тем кто благодарит.

Бис фрайтаг, майне либе.

PS. Кто-нибудь вставил в свой проект подобную форму?

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

Комментарии — 45

RSS
  • Аватарка
    27 мая 2009 в 14:21 ]]>Сашко]]>
    Я вставлю, тока частично
  • Аватарка
    27 мая 2009 в 15:47 Ньярли
    Что тут СКАЗАТЬ!? КОНФЕТКА!
  • Аватарка
    27 мая 2009 в 15:49 ]]>Александр]]>
    Классно, спасибо!
  • Аватарка
    27 мая 2009 в 16:11 ]]>Neutron]]>
    Очень хочу вживить в Wordpress... но не знаю как :(
  • Аватарка
    27 мая 2009 в 16:57 ]]>Борода]]>
    Очень интересно. Главное в IE6 работает.
    Правда нашел баг,не баг, не знаю. В FF3 перейдя по ссылке http://vremenno.net/examples/nice-forms-2/remind.html , кликнув на "Войти" всё исчезает. Это только у меня?
  • Аватарка
    27 мая 2009 в 18:14 ]]>sanchosrancho]]>
    Хороший пример. Спасибо!

    Правда, как и в предыдущий раз, у меня есть мааленькое «но»:

    Когда мы переключаемся между формами, в нашей голове рождаются следующие вопросы:
    - На какой форме мы находились?
    – На какую форму мы перешли?
    – Сколько еще там таких блоков спрятанно за границами?

    То есть формы листаются конечно красиво, но при этом мы теряем ориентацию в этом пространстве. Мы теряемся, пытаясь понять, откуда вылезет форма (слева или справа).

    Решить эту проблему можно двумя способами:
    1) Оставлять надписи «Войти», «Вспомнить пароль», «Зарегистрироваться» всегда на виду.
    2) Сократить количество форм до двух («Войти» и «Зарегистрироваться»), тогда каждая из них будет иметь свое законное место (либо слева, либо справа). Форма же «Вспомнить пароль» — это частный случай формы «Войти». Как ее упразднить наиболее красиво, я пока не придумал :) (но есть кое-какие мысли).

    зы: на форме «войти» отсутствует валидация.
  • Аватарка
    27 мая 2009 в 19:33 bugdenes
    На самом деле такой авторизацией ВООБЩЕ не удивить если бы вы рассказали как сделать такую!!!
    http://webo.in/my/
    ДРУГОЕ ДЕЛО! к такому стремиться надо)
  • Аватарка
    27 мая 2009 в 19:38 ]]>Grin]]>
    bugdenes, а что такого сложного в форме на Вебоине? Проявление-выезд элементов в jQuery делается довольно просто
  • Аватарка
    27 мая 2009 в 20:19 Grundiss
    2bugdenes, 2Grin:
    Мало того что ничего выдающегося, так еще и явный косяк: переходя от "войти" к "забыли" мне в промежутке зачем-то показывается "регистрация"
    2автор:
    Да, неплохая форма получилась. Соглашусь с sanchosrancho: нопоминация это частный случай авторизации, их бы как-то объединить
  • Аватарка
    27 мая 2009 в 20:21 I2Y
    Спасибо, довольна интересная идея. Но действительно немножко путаешься с формами если много раз переходить с одной на другую.

    P.S.
    Отдельное спасибо за "Граватарки", впервые узнал об этом сервисе :)
  • Аватарка
    28 мая 2009 в 2:55 ]]>Женя]]>
    Борода, спасибо за замечание. Мой косяк.
    Хотя, вообще говоря, его невозможно увидеть, так как невозможно попасть на страницу remind.html c включенным джаваскриптом. А без js ничего исчезнуть не может.
  • Аватарка
    28 мая 2009 в 3:13 ]]>Женя]]>
    И спасибо всем, кто сказал спасибо )
  • Аватарка
    2 июня 2009 в 9:39 ]]>sergy]]>
    Спасибо большое. А почему бы не сделать отправку данных не по onclick а по $().submit? Таким образом сразу начинает работать нажатие кнопки enter ) Да и с выключенным javascript данные будут отправляться.
  • Аватарка
    4 июня 2009 в 19:27 ]]>Алексей]]>
    клаСНЕНЬКО спасибі вам велике!!!
  • Аватарка
    25 июня 2009 в 11:00 николай
    сделать бы эти формы в всплывающем окне JQUERY, чтобы сайт затемнялся, а в окне работать с формами... (возможно==TRUE) ? "Как?" : "Жаль";
  • Аватарка
    25 июня 2009 в 14:18 ]]>Евгений]]>
  • Аватарка
    29 июня 2009 в 14:37 николай
    Евгений, спасибо! попробую прикрутить к сайту
  • Аватарка
    24 июля 2009 в 1:08 ]]>marienplatz]]>
    для большей читабельности кода я бы использовал псевдо-ассоциативные массивы, что-то типа такого

    var Message = new Object();

    Message['not_login']='1234';
    Message['success']='4321';
    Message['question']='1432';
    Message['error_on_ajax']='3214';

    согласитесь, not_login или error_on_ajax более понятно
  • Аватарка
    24 июля 2009 в 21:38 ]]>Smile42RU]]>
    привет. если не в лом поясните почему форма не пашет в 7-ом ослике?
    и если можно, помогите вылечить сей косяк.
  • Аватарка
    25 июля 2009 в 0:22 ]]>Evgenij]]>
    Смайл, я проверял форму в ИЕ7. И перепроверил. Должна работать.
  • Аватарка
    25 июля 2009 в 0:24 ]]>Smile42RU]]>
    блин, ну ладно, буду разбираться... потом напишу в чем была проблема.
  • Аватарка
    25 июля 2009 в 0:56 ]]>Smile42RU]]>
    разобрался, косяк был в моем коде, сама форма пашет отлично... Жека - респект тебе!)
  • Аватарка
    28 июля 2009 в 14:14 Коля
    Подскажите как поставить форму на сайт
  • Аватарка
    28 июля 2009 в 14:16 ]]>Evgenij]]>
    Коля, просто копируете код из примера. И вставляете на сайт.
  • Аватарка
    28 июля 2009 в 14:48 Коля
    Evgenij спасибо
  • Аватарка
    1 августа 2009 в 11:50 ]]>Glam]]>
    Хорошая статья, проделано не мало работы. Вот еще бы скрипты приложить к этому всему - цены бы не было ;)
  • Аватарка
    2 августа 2009 в 21:15 ]]>gps]]>
    Спасибо отличная авторизация, а я искал мучился )))))
  • Аватарка
    18 августа 2009 в 23:54 zurito
    Как говорится, спасибо за форму, однако, в 7 ИЕ не хочет ругаться если пустые поля в форме SignIn, пишет ошибка на странице.
    Исправил в функции SignIn() email на e_mail - заработало, хрен знает че такое.
    Кста, лейблы с формы SignUp не переименованы в других, но это так, мелочи.
  • Аватарка
    16 сентября 2009 в 3:51 cord
    Спасибо огромное! Долго искал, прикручу к сайту обязательно!
  • Аватарка
    16 сентября 2009 в 16:53 ]]>Oleg]]>
    Спасибо огромное, особенно полезным оказался индикатор загрузки.
  • Аватарка
    25 декабря 2009 в 18:49 Анатолий
    Женя, каким образом лучше дождаться ответа от сервера при проверке существования email или правильности введенного пароля?
    К примеру, функция
    function CheckPassword(email, pass) {
    //check if email and pass match
    ........
    return result;
    }
    не успевает дождаться ответа от сервера возвращает в основной алгоритм значение по умолчанию.
    Заранее благодарен за ответ!
  • Аватарка
    19 января в 20:09 alex
    2 Евгений, 3й вариант хорош, только, к сожалению, нет кнопки отмены (убрать окно).
  • Аватарка
    11 марта в 16:45 Osadach
    Здравствуйту. Вставил себе на сайт все работает только не регистрирует. В чем может быть дело. Я только осваиваю html CSS Php.Может кто подскажет причину
    P.S www.aqueduct-v-v.ru
  • Аватарка
    12 марта в 17:11 German
    Osadach, мама моя... Так надо же PHP скрипт, которому будут посылаться данные из формы, а так же база данных, к которой будет обращаться PHP скрипт!

  • Аватарка
    12 марта в 17:16 German
    2 alex, то что нету кнопки убрать окно, этот пипец как плохо!
    Это даже хуже того, о чем я сейчас напишу!

    Нужно зайти на jquery.com и познакомиться с аттрибутами.. Точнее с возможностью назначения атрибутов!

    Смотрите!

    Это кнопка, при нажатии на нее вызывается функция ShowForm!

    Теперь смотрим саму функцию!

    function ShowForm() {
    $('#button').hide();
    $('#blocker').show();
    $('#vrWrapper').slideDown(700);
    }

    А что она делает?

    Скрывает элемент с ИД #button - это и есть кнопка...
    Показывает блок #blocker
    И $('#vrWrapper').slideDown(700);

    Почитайте о slideDown на jquery.com
  • Аватарка
    13 марта в 1:56 Osadach
    German про php скрипт и про базу я знаю, только написать не могу. Никак не пойму это php.)))))
  • Аватарка
    13 марта в 14:50 Геннадий
    Хотим заказать дизайн для сайта агентства недвижимости.Есть структура,ТЗ и понимание.Мнения-на почту.
  • Аватарка
    13 апреля в 10:44 Sergey Shimkiv
    Все получилось, спасибо за формочку ;)
  • Аватарка
    17 апреля в 11:34 ]]>Роман]]>
    Доброго времени суток!
    Хотел бы узнать, как вставить эту форму на свой сайт?? Дело понятное, что html-код из примера необходимо вставить на свой сайт. Но необходимо ли еще что-нибудь для этого? Имею ввиду, где будет храниться информ-ия о пользователях? Как я смогу ее увидеть? Нужно ли еще что-нибудь сделать для этого?? Форма, кстати, лучшая из тех, что я видел)
  • Аватарка
    19 апреля в 18:59 Sergey Shimkiv
    2 Роман:
    Как минимум понадобится пример+php+mysql(минимум 1 таблица в некоторой БД). Дальше как вариант - расширять javascript код примера аяксовыми запросами, которые отправлять в созданные php-сценарии, которые в свою очередь обращаются к таблице БД с пользователями.
  • Аватарка
    19 апреля в 19:39 German
    Роман, посмотрите 2 видео на этой странице! Думаю кое что станет понятно... После чего идите на сайт denwer.ru Скачивайте денвер и устанавливайте!
  • Аватарка
    28 апреля в 22:48 Виктор
    Евгений, хелп!
    Посмотрел Вашу работу, понравилась, вставил к себе на сайт. А какие скрипты прописывать и как подключить базу данных не знаю. Помоги пожалуйста.
  • Аватарка
    30 апреля в 11:44 ]]>Evgenij]]>
    Виктор, мы здесь освещаем только клиентскую часть вопроса.
    Ваш вопрос слишком объемен, чтобы на него можно было ответить в комментарии.
  • Аватарка
    17 мая в 22:28 Arius
    А разве HTML и базы совместимы?
    Всегда видел PHP+базы, а тут те на...
  • Аватарка
    17 мая в 22:38 German
    Arius, HTML - это язык гипертекстовой разметки! При помощи HTML разметки, то есть тегов вы создаете структуру страницы!

    PHP - язык исполняемый на стороне веб-сервера!

    PHP может общаться с базой данных и выдавать результат общения в виде HTML...
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>