Моя библиотека - социальная сеть любителей книг

Интро

Вот появилась свободная минутка… В далеком 2007-ом году у меня была статья о “flash-сообщениях” - сообщения которые мы показываем пользователю после перезагрузки страницы. Очень удобная и нужная штука :)

Но эти сообщения не подходят для AJAX-обработчиков. Что же делать? Ведь AJAX-функций на наших сайтах становится все больше.

И вот сегодня, по служебной необходимости, мне понадобилось уведомлять пользователей о результатах AJAX-функций.

Пара строчек на JS + jQuery и готово!

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

CSS


#ajax_alert {
	width:400px;
	position:fixed;
	top:0; right:0;
	z-index:7777;
}
* html #ajax_alert { /* IE fix */
	position:absolute;
	top:expression(eval(document.documentElement.scrollTop) + 'px');
}

#ajax_alert .item {
	display:none;
	padding:10px;
	color:#fff;
	font-size:1em;
	border:1px solid #fff;
}

#ajax_alert .item h2 {
	margin:0 0 0.5em 0;
	font-size:1.4em;
}

#ajax_alert .message {
	background:#80c875;
}

#ajax_alert .error {
	background:#ec977b;
}

#ajax_alert .notice {
	background:#0099FF;
}

Вот такой простенький получился CSS. Елемент с id ajax_alert и есть наш контейнер. В него мы будем добавлять блоки сообщений с общим классом item и дополнительными классами: message, error, notice, в зависимости от типа сообщения. Различаться они будут только цветом блока. Само сообщения у нас будет состоять их 2 частей: заголовок и текст.

Теперь все, что нужно у нас есть, приступим к написанию JS’а.

JavaScript, jQuery и все, все, все…

Сразу приведу эти 2 строчки кода:


var Alert = {
	show: function(title, text, class_name) {
		if (!$('#ajax_alert').attr('id')) {
			$('<div id="ajax_alert"></div>').appendTo(document.body);
		}
		$('<div class="item ' + class_name + '"><h2>' + title + '</h2>' + text + '</div>')
			.prependTo($('#ajax_alert'))
			.fadeIn('slow')
			.animate({opacity: 1.0}, 3000)
			.fadeOut('slow', function() {$(this).remove();});
	}
}

Вот и все! Задача выполнена. Можно встраивать в проект и идти пить чай.

HTML (пример использования)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Alert Ajax</title>
<link rel="stylesheet" type="text/css" media="all" href="main.css" />
<script src="/js/jquery.js" type="text/javascript"></script>
<script src="/js/alert.js" type="text/javascript"></script>
<script type="text/javascript">
function request() {
	//Тут мы делаем обращение к серверу
	//возвращаем результат и в зависимости от него
	//выводим сообщение
	if (result) {
		Alert.show('Заголовок сообщения', 'Поздравляем! Что-то выполнилось', 'message');
	} else {
		Alert.show('Заголовок сообщения', 'При выполнении чего-то произошла ошибка', 'error')
	}
}
</script>
</head>
<body>
<a href="#" onclick="request(); return;">Кликни!</a>
</body>
</html>

Рабочий пример

Смотрим



Комментарии (38) на запись «AJAX-светофорчики»

  1. BDSoft MonsterID Icon BDSoft | 12.08.2008 в 23:34

    хм.. прямы как на хабре)

  2. admin MonsterID Icon admin | 12.08.2008 в 23:40

    Да, есть немного. Правда, такие сообщения есть не только на Хабре )

  3. Денис MonsterID Icon Денис | 12.08.2008 в 23:49

    На хабре уже пошли жалобы на такие сообщения. Слишком далеко от “места” выводятся, пользователь может не заметить. Особенно если монитор большой и элемент на который надо среагировать находится слева внизу :)

  4. admin MonsterID Icon admin | 12.08.2008 в 23:50

    Денис, а на что реагировать? Обычно это сообщения пассивного характера. Или я ошибаюсь? Просто на Хабре не зареген )

  5. Денис MonsterID Icon Денис | 13.08.2008 в 11:26

    http://habrahabr.ru/blogs/habrahabr_ideas/36663/

  6. admin MonsterID Icon admin | 13.08.2008 в 13:06

    Денис, вы невнимательно читали комментарии на Хабре. Там люди возмущаются из-за того, что JS-семафорчики повесили на те действия которые были с перезагрузкой.
    Да и в основном там всем не нравятся новые введения на сайте, а не эти сообщения.

  7. Sam MonsterID Icon Sam | 13.08.2008 в 13:59

    Хорошая штука. И интерфейс вышел удобный.

  8. Артур MonsterID Icon Артур | 14.08.2008 в 05:30

    вай, вчера точно такую же весчь реализовал с помощью jQuery, то же с фадеином, 2 сек показа, также красные зеленые мессаджи, но еще + фишечку, мессагу можно показать статиком и абсолютом ниже любого элемента формы, показать так сказать что мол там ошибся. Ну и еще + круглые края для наглядности.

  9. kikaha MonsterID Icon kikaha | 14.08.2008 в 05:30

    специально для недовольных способом, которым эффект реализован на хабре, в подписи ссылка на более элегантный вариант на jQuery. хотя авторский способ тоже может пригодиться в определенных интерфейсах, на всякий случай сохранил код :)

  10. kikaha MonsterID Icon kikaha | 14.08.2008 в 05:31

    эк мы в одночасье-то :)

  11. Артур MonsterID Icon Артур | 14.08.2008 в 05:32

    и все-таки это решение отличное решение замены противным алертам. Пользователь без дергания воспринимает инфо об ошибке.

  12. admin MonsterID Icon admin | 14.08.2008 в 10:14

    М-да… на сайте у kikaha, нашел полезную ссылочку на плагин jGrowl.
    В общем можно было ничего и не писать ))) Все уже написано.
    Правда мое решение выигрывает по простоте - ничего лишнего и всего пара строчек кода. А это иногда важно )

  13. sectronix MonsterID Icon sectronix | 21.08.2008 в 09:01

    А обещал про дата-мапперы =\

  14. admin MonsterID Icon admin | 21.08.2008 в 09:57

    sectronix, всему свое время =)

  15. ICE MonsterID Icon ICE | 27.08.2008 в 18:38

    И всё же есть проблема с IE 6.0. Сообщение выводиться в позиции y=0 при присутствии скролинга, как пример попробуй разнести страницу, проскролируй в самый низ и выведи alert.show. Под FF и Opera таких проблем не замечено, алерт виден всегда. Похоже css не до конца отлажен.

  16. admin MonsterID Icon admin | 27.08.2008 в 18:51

    Хм… Буду благодарен багфиксу )))
    Если у кого есть идеи как решить данную проблему - пишите!

  17. Samuel MonsterID Icon Samuel | 28.08.2008 в 01:23

    Думаю не стоит их делать “исчезающими”,лучше уж там крестик в углу.

  18. admin MonsterID Icon admin | 28.08.2008 в 10:13

    “Крести в углу” потребует от пользователя дополнительных телодвижений, что не есть хорошо.
    Крестик можно делать только на очень важных сообщениях, что б быть уверенным, что пользователь сообщение точно прочел )

  19. ICE MonsterID Icon ICE | 28.08.2008 в 10:46

    Всё оказалось довольно просто, ничего менять не нужно, просто на странице необходимо добавить декларацию

    Работает, проверено.

  20. ICE MonsterID Icon ICE | 28.08.2008 в 10:48

    Хм, html вырезало, непорядочек. В обещем для IE обязательное добавление определения DOCTYPE

  21. ICE MonsterID Icon ICE | 28.08.2008 в 10:49

    Кстати, для закрытия использую следующее
    .click(function()
    {
    $(this).stop();
    $(this).hide("normal");
    })

  22. admin MonsterID Icon admin | 28.08.2008 в 10:52

    В обещем для IE обязательное добавление определения DOCTYPE

    Для меня это уже само-собой-разумеется. ))) Поэтому всера долго не мог понять почему у меня все работает, что я делаю не так? )))

  23. Dmitrii MonsterID Icon Dmitrii | 08.09.2008 в 22:14

    Почти копия Хабра

  24. Snowcore MonsterID Icon Snowcore | 11.09.2008 в 16:39

    Да ладно, какой там Хабр…

  25. Larin MonsterID Icon Larin | 12.09.2008 в 00:09

    Люди, что вам дался Хабр?! Да, сайт сделан очень красиво и технично (снимаю шляпу), но эти светофорчики это не их изобретение ))) Такое есть на многих забугорных сайтах.

  26. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 18.02.2009 в 16:03

    у вас проблемы со стилем кодирования на jquery.
    возьмем кусок и попробуем упростить

    !$('#ajax_alert').attr('id')
    ...
    !$('#ajax_alert').length


    $('' + title + '' + text + '').prependTo($('#ajax_alert'))
    ....
    $("").addClass('item ' + class_name).append($("").text(text)).prependTo('#ajax_alert')

    а вобще у вас ничего так получается и блог хороший я вас в рсс добавил

  27. Larin MonsterID Icon Larin | 18.02.2009 в 16:06

    CTAPbIu_MABP
    Честно сказать большой разницы между

    
    $('#ajax_alert').attr('id')
    ...
    !$('#ajax_alert').length
    

    не вижу…

    Второй вариант, возможно… но опять таки это дело вкуса, нежели ошибка =)

    а вобще у вас ничего так получается и блог хороший я вас в рсс добавил

    Спасибо, за столь высокую оценку! )))

  28. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 18.02.2009 в 16:39

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

    со вторым примером все сложнее, когда вы создаете $(”<div><div>”+text+”<div></div>”)
    сначала jquery разберет все простой, а потом сложной регуляркой, потом будет проверять на разные таги пока рекурсивно не дойдет до самого внутреннего уровня вложености, приведет таги к каноническому виду, запихнет все что получилось в иннерШТМЛ временного дива и заберет обратно.
    а тут все просто $(<div/>).text().appandTo(<div/>)
    два раза проверяем простой регуляркой и создаем две новых элемента.
    проверить мои слова можно в исходнике jquery в строках 35-92 + 835-852.
    ЗЫ ну все есть на вечер материал для статьи…

  29. Larin MonsterID Icon Larin | 18.02.2009 в 16:49

    Скажите мне при чем тут быстродействие??? Один запуск на событие. Зачем гнаться за быстродействием?

    Это экономия на спичках. Если бы этот скрипт вызывался в цикле, скажем, хотя бы из 10 000 итераций, тогда это имело бы смысл )))

  30. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 18.02.2009 в 16:55

    конкретно в ваших всетофорчиках, если абстрагироваться от всего остального - это экономия на спичках. Если брать реальный проект где кроме ваших светофорчиков стоит еще десяток плагинов и все они “оставляют мелочь на кассе” то в общей сложности получаем торможение. а если у вас как у меня открыто по 20 вкладок в фаерфоксе то такие спички жрут по 300 метров оперативы - не очень приятно.

  31. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 18.02.2009 в 16:58

    у меня для вас есть хороший пример почему при 100 итерациях надо экономить на спичках… возьмем например лайтбокс или другой плагин который показывает картинку на сером фоне. так вот если там не экономить то анимация будет не плавной ;)

  32. Larin MonsterID Icon Larin | 18.02.2009 в 17:02

    В данном случае, я говорю о моих “светофорчиках” =)

    Я ничего не обобщаю и хорошо понимаю, что для каждого случая свой подход.

  33. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 18.02.2009 в 17:06

    ну я и говорю. что мне нравится, тока на будущее вам рассказал то можно технику подправить :)

  34. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 23.02.2009 в 16:24

    а вот и снова я
    провел скрупулезные тесты производительности так что теперь и вы можете с ним ознакомиться на моем сайте. ссылки давать не буду а то подумаете что за ваш счет пиарюсь)
    да и по поводу экономии на спичках, я тут недавно на webo.in видел экономию на поле user-agent… задумайтесь над этим

  35. Larin MonsterID Icon Larin | 24.02.2009 в 10:16

    да и по поводу экономии на спичках, я тут недавно на webo.in видел экономию на поле user-agent… задумайтесь над этим

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

  36. CTAPbIu_MABP MonsterID Icon CTAPbIu_MABP | 24.02.2009 в 10:25

    вы что серьёзно думаете что есть смысл экономить на user-agent когда я качаю видео в HDTV o_O? Ну так вот мне с моим компом как бы все равно с какой скоростью работает ваш скрипт, но я ж тут не один)))

  37. Томилов Кирил MonsterID Icon Томилов Кирил | 04.02.2010 в 06:55

    Не работает пример :( http://larin.in/ajaxalert/
    пожалуйста поправьте

  38. Larin MonsterID Icon Larin | 15.06.2010 в 20:38

    @Томилов Кирил
    Попробуйте http://larin.in/ajaxalert/index.html

Оставить комментарий


Copyright, 1983 – 2010