22 декабря 2015
27 мая 2009
60
Улучшение форм авторизации, регистрации и напоминации
Гутен морген таг, майне либе фройнде. Пока писал, доброе утро превратилось в добрый следующий день )
Сегодня мы займемся улучшением формы, которую я представил в этой статье.
В примере было немало косяков и несовершенств. На некоторые из них обратили внимание читатели, другие пришлось заметить самому.
К делу.
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. Кто-нибудь вставил в свой проект подобную форму?
Правда нашел баг,не баг, не знаю. В FF3 перейдя по ссылке http://vremenno.net/examples/nice-forms-2/remind.html , кликнув на "Войти" всё исчезает. Это только у меня?
Правда, как и в предыдущий раз, у меня есть мааленькое «но»:
Когда мы переключаемся между формами, в нашей голове рождаются следующие вопросы:
- На какой форме мы находились?
– На какую форму мы перешли?
– Сколько еще там таких блоков спрятанно за границами?
То есть формы листаются конечно красиво, но при этом мы теряем ориентацию в этом пространстве. Мы теряемся, пытаясь понять, откуда вылезет форма (слева или справа).
Решить эту проблему можно двумя способами:
1) Оставлять надписи «Войти», «Вспомнить пароль», «Зарегистрироваться» всегда на виду.
2) Сократить количество форм до двух («Войти» и «Зарегистрироваться»), тогда каждая из них будет иметь свое законное место (либо слева, либо справа). Форма же «Вспомнить пароль» — это частный случай формы «Войти». Как ее упразднить наиболее красиво, я пока не придумал :) (но есть кое-какие мысли).
зы: на форме «войти» отсутствует валидация.
http://webo.in/my/
ДРУГОЕ ДЕЛО! к такому стремиться надо)
Мало того что ничего выдающегося, так еще и явный косяк: переходя от "войти" к "забыли" мне в промежутке зачем-то показывается "регистрация"
2автор:
Да, неплохая форма получилась. Соглашусь с sanchosrancho: нопоминация это частный случай авторизации, их бы как-то объединить
P.S.
Отдельное спасибо за "Граватарки", впервые узнал об этом сервисе :)
Хотя, вообще говоря, его невозможно увидеть, так как невозможно попасть на страницу remind.html c включенным джаваскриптом. А без js ничего исчезнуть не может.
http://vremenno.net/examples/nice-forms-3/
var Message = new Object();
Message['not_login']='1234';
Message['success']='4321';
Message['question']='1432';
Message['error_on_ajax']='3214';
согласитесь, not_login или error_on_ajax более понятно
и если можно, помогите вылечить сей косяк.
Исправил в функции SignIn() email на e_mail - заработало, хрен знает че такое.
Кста, лейблы с формы SignUp не переименованы в других, но это так, мелочи.
К примеру, функция
function CheckPassword(email, pass) {
//check if email and pass match
........
return result;
}
не успевает дождаться ответа от сервера возвращает в основной алгоритм значение по умолчанию.
Заранее благодарен за ответ!
P.S www.aqueduct-v-v.ru
Это даже хуже того, о чем я сейчас напишу!
Нужно зайти на jquery.com и познакомиться с аттрибутами.. Точнее с возможностью назначения атрибутов!
Смотрите!
Это кнопка, при нажатии на нее вызывается функция ShowForm!
Теперь смотрим саму функцию!
function ShowForm() {
$('#button').hide();
$('#blocker').show();
$('#vrWrapper').slideDown(700);
}
А что она делает?
Скрывает элемент с ИД #button - это и есть кнопка...
Показывает блок #blocker
И $('#vrWrapper').slideDown(700);
Почитайте о slideDown на jquery.com
Хотел бы узнать, как вставить эту форму на свой сайт?? Дело понятное, что html-код из примера необходимо вставить на свой сайт. Но необходимо ли еще что-нибудь для этого? Имею ввиду, где будет храниться информ-ия о пользователях? Как я смогу ее увидеть? Нужно ли еще что-нибудь сделать для этого?? Форма, кстати, лучшая из тех, что я видел)
Как минимум понадобится пример+php+mysql(минимум 1 таблица в некоторой БД). Дальше как вариант - расширять javascript код примера аяксовыми запросами, которые отправлять в созданные php-сценарии, которые в свою очередь обращаются к таблице БД с пользователями.
Посмотрел Вашу работу, понравилась, вставил к себе на сайт. А какие скрипты прописывать и как подключить базу данных не знаю. Помоги пожалуйста.
Ваш вопрос слишком объемен, чтобы на него можно было ответить в комментарии.
Всегда видел PHP+базы, а тут те на...
PHP - язык исполняемый на стороне веб-сервера!
PHP может общаться с базой данных и выдавать результат общения в виде HTML...
Я вот скачал форму, и не знаю как её установить на сайт, т.е. я её установил на сайт, но когда "Зарегистрироваться" нажимаю, ничего не происходит. Пожалуйста подскажите как и куда в пихнуть нужные ссылки, или чего там?
Заранее большое спасибо!
Предложите лучше, как, чем просто говорить. А форма входа - это частный случай регистрации? Может вообще без форм?
Второй косяк: с выключенным js по прежнему не попасть на сайт, т.к. функции onclick не сработают.
Если второй недочет скорее уже идейный, то первый как то надо исправить.
вот ссылка на видео:
http://narod.ru/disk/27013580001/Form.swf.html
И ещё в форме войти нет проверки email на корректность, работает только на пустое поле!