Логин пользователя используя AJAX и jQuery

В этом уроке я расскажу, как можно сделать процедуру входа в систему пользователей более удобной используя AJAX. Удобство состоит в том, что пользователю не нужно ждать перезагрузки страницы при отправке формы. Плюс, добавим некоторые “бубенчики” и “свистульки” используя эффекты jQuery.

Итак, начнем.

Шаг 1: HTML

Как водится начинаем с разметки HTML – создаем простую форму с двумя полями для логина и пароля:

<a href="login_form.php" id="login_link">Логин</a><br/>
<div id="overlay"></div>
<div id="login_box">
	<a href="#" id="close_btn">Закрыть</a>
	<div id="login_result"></div>
	<form method="post" action="login.php" id="login_form">
		<label for="username">Логин:</label>
		<input name="username" type="text" id="username" value="" maxlength="20" /><br/>
		<label for="password">Пароль:</label>
		<input name="password" type="password" id="password" value="" maxlength="20" /><br/>
		<input name="Submit" type="submit" id="submit" value="Login" />
	</form>
</div>

Все, что вы увидите на странице, это только ссылка “Логин”. Форма (login_box) и оверлей (overlay) будут появляться только после нажатия на эту ссылку. В том случае, если JavaScript в браузере выключен, пользователь будет просто перенаправлен на страницу login_form.php где будет размещена соответствующая форма.

Шаг 2: CSS

#login_form {
	margin:16px;
}
#login_box {
	position:absolute;
	height:200px;
	width:400px;
	margin:-100px 0px 0px -200px;
	top: 50%;
	left: 50%;
	text-align: left;
	padding: 0px;
	background-color: #f5f5f5;
	border: 1px dotted #000000;
	overflow: auto;
	display:none;
}
#overlay{
	position:absolute;
	display:none;
	background:#000;
	opacity:.8;
	filter:alpha(opacity=80);
	left:0;
	top:0;
}
label {
	display:block;
	width:140px;
	padding:0 6px;
	float:left;
	text-align:right;
}
input {
	float:left;
}
form br {
	clear:both;
}
#submit {
	margin-left: 150px;
}
#close_btn {
	display:block;
	height:26px;
	text-align:right;
}
#login_result {
	display:block;
	margin:10px;
	text-align: left;
	text-indent: 5px;
	height:22px;
	line-height:22px;
}
.error {
	background:#f9caca;
	border: 1px solid #f00;
}
.success {
	background:#caf9ca;
	border: 1px solid #0f0;
}
.process {
	background:#cacaf9;
	border: 1px solid #00f;
}

Сообщения о результатах логина будут отображаться в div-е с id=login_result, которому будут присваиваться классы process (в процессе обработки запроса), error (ошибка) и success (пользователь успешно залогинился), вид которых отличаются между собой только цветом. Обратите внимание на центрирование контейнера с формой – значения top и left установлены в значение 50%, а левый и правый margin равны половине ширины и высоты контейнера со знаком минус. Таким образом мы добиваемся центрирования контейнера в середине экрана.

Шаг 3: JavaScript.

Подключаем библиотеку jQuery:

<script src="jquery.js" type="text/javascript"></script>

Теперь пишем код, который будет выполнять AJAX запрос и показывать анимированные сообщения о результатах:

$(document).ready(function(){
	// 1 - по нажатию на ссылку #login_link будет появляться форма логина
	$("#login_link").click(function(e){
		var overlay = $("#overlay");
		var w = $(window).width();
		var h = $(window).height();
		overlay.css('width', w);
		overlay.css('height', h);
		overlay.css('display','block');

		$("#login_result").html('').removeClass();
		$("#login_box").css('display','block');

		e.preventDefault();
	});

	// 2 - по нажатию на ссылку #close_btn форма логина будет закрываться
	$("#close_btn").click(function(e){
		$("#overlay").css('display','none');
		$("#login_box").css('display','none');
	});

	// 3 - обработка отправки формы
	$("#login_form").submit(function() {
	        // указываем класс process для div-а сообщений и плавно показываем его
	        $("#login_result").removeClass().addClass('process').text('Проверка....').fadeIn(1000);
	        // проверяем через AJAX имя пользователя пароль
	        $.post($("#login_form").attr('action'), { username:$('#username').val(),password:$('#password').val(),rand:Math.random() } ,function(data) {
				if(data==1) {
					// логин верный
					$("#login_result").fadeTo(200,0.1,function() {
					$(this).html('Редирект.....').removeClass().addClass('success').fadeTo(900,1,
						function() {
							document.location='secure.php';
						});
					});
				} else {
					// логин неверный
					$("#login_result").fadeTo(200,0.1,function(){
						$(this).html('Логин неверен ...').removeClass().addClass('error').fadeTo(900,1);
					});
				}
			});
			return false;// отмена отправки формы (действие по умолчанию)
	});
});

Этот код разбит на три части. В первой мы добавляем обработчик события onclick для ссылки “Логин” (id=login_link), в котором определяются размеры страницы, для того, чтобы присвоить их оверлею, затем устанавливается значение display:block для формы и оверлея. Размеры окна определяем при помощи функций width() и height():

var w = $(window).width();
var h = $(window).height();

В конце обязательно нужно предотвратить действие по умолчанию для ссылки при помощи функции preventDefault().

Во второй части добавляем обработчик для ссылки “Закрыть”, чтобы дать возможность пользователю закрыть форму логина, если он забыл пароль и отчаялся его угадывать. Здесь просто устанавливаем значения display:none для оверлея и формы логина:

		$("#overlay").css('display','none');
		$("#login_box").css('display','none');

Функцию preventDefault() здесь можно не использовать, поскольку ссылка никуда не ведет (href для нее равен “#”).

Ну и наконец третья часть – отправка запроса на сервер. Здесь мы добавляем обработчик к событию onsubmit формы login_form. В первой строке функции обработчика устанавливаем класс process для контейнера login_result чтобы дать понять пользователю, что запрос отправлен. Затем собственно отправляется запрос при помощи функции post(). Куда этот запрос отправлять мы определяем по атрибуту action формы ( $(”#login_form”).attr(’action’) ). Далее указываем параметры запроса:

{ username:$('#username').val(),password:$('#password').val(),rand:Math.random() }

Первые два поля – username (имя пользователя) и password (пароль), берем из соответствующих полей формы, а последний параметр – rand служит для избежания возможных проблем с кэшированием.

Скрипт, который проверяет, правильно ли введены данные для входа в систему (в нашем примере это login.php), возвращает 1 в случае успеха и 0 в случае ошибки. Проверяем эти значения в структуре if … else и показываем соответствующие сообщения используя fadeTo() для придания эффекта плавного появления.

После успешного входа в систему, направляем пользователя на его домашнюю страницу, которую мы собственно и закрывали паролем:

document.location='secure.php';

смотреть демоскачать пример

Maklay.com - Большой каталог товаров для спорта и активного отдыха
  • http://www.legco.net/ kikaha

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

  • admin

    @kikaha
    Да действительно, спасибо за замечание. В этом случае можно воспользоваться функцией scrollTo() перед тем, как показывать оверлей.

  • brmn

    Отключил слой overlay и придал #login_box {position:static;}
    Появляется как надо, по центру экрана. Но если страница с прокруткой то при закрытии перебрасывает в начало страницы.
    Лечится заменой ссылки “Закрыть” на кнопку

  • http://www.aos.com.ua nice

    Спасибо!
    Уже пользуюсь :)

    А вот с прокруткой с вертикальной прокруткой решил проблему так:

    заменить:
    var w = $(window).width();
    var h = $(window).height();

    на:
    var w = document.body.scrollWidth + ‘px’;
    var h = document.body.scrollHeight + ‘px’;

  • r._15

    пишет, что логин не верный…

  • Mirk

    Хы, странно, а вообще зачем нужно было получать размеры страницы, я просто при описании стиля, сразу указал размеры:
    #overlay{
    height:100%;
    width:100%;
    position:absolute;
    display:none;
    background:#000;
    opacity:.8;
    filter:alpha(opacity=80);
    left:0;
    top:0;
    }
    проверил в FF и Google Chrome, всё прекрасно работает, и при изменении рамеров станицы уже активного оверлея не образуются пустые края =)
    единственное в IE тупит, ну там тупило и при оригинальном методе

  • http://trydota.ru Дота

    Способ интересный, мне понравился, и да же захотелось реализовать у себя на сайте. А скажите, как насчёт кросбраузерности? как в IE5\6 хроме и т.п.? Всё в порядке?

  • admin

    В IE5 точно не тестировал. В остальных должно работать.

  • vladax

    Если контента на странице много, то хорошо бы ещё центрировать блок в зависимости от ресайзинга пользователем окна браузера.
    Ну и поскольку решение должно быть кроссбраузерным,
    всякие там position: fixed в топку!!!

    Хтмл:

    ЖС:
    function centerForm() {
    var overlay = $(”#overlay”);
    var display_overlay = overlay.css(’display’);
    if (display_overlay==’block’) {
    var w = document.body.scrollWidth + ‘px’;
    var h = document.body.scrollHeight + ‘px’;
    overlay.css(’width’, w);
    overlay.css(’height’, h);
    overlay.css(’display’,'block’);

    var top_coords = $(window).scrollTop()
    var coords = top_coords + (($(window).height()/2)-250);
    $(”#form_block”).css({margin: coords+’px 0px 0px -350px’, ‘top’: ‘0′, ‘display’: ‘block’});
    }
    }

    Размеры только под себя подгоните..

  • vladax

    Хтмл:

  • vladax

    Простите, заработался ночью.. Анонимной функции достаточно:

    $(window).resize(function() {………….

  • http://www.webrothers.biz Владимир

    Спасибо за формочку! давно искал!

JSToolbox создан на основе WordPress