Xo66uT5 Май 2011JQuery
jquery

Любой пользовательский интерфейс, даже самый примитивный, сегодня не обходится без ajax запросов. Хорошо когда запросы проходят практически мгновенно, благодаря большой скорости соединения пользователя или по другим причинам, но что делать когда запрос длится очень долго? Нужно как-то сообщить пользователю, что все хорошо, скрипт не повис, отправка данных идет, “полет нормальный”. Для этого обычно отображают индикатор загрузки.

Используя JQuery.ajax очень легко отобразить и убрать индикатор загрузки когда это необходимо. Для этого существуют 2 события beforeSend и complete, на которые легко повесить соответствующее отображение индикатора.  Ниже я создаю div по событию beforeSend (запрос начался) и уничтожаю его по событию complete (запрос завершен).

div.ds-loading {
 background-image: url("/images/admin/loader.gif");
 background-repeat: no-repeat;
 position: fixed;
 width: 126px;
 height: 22px;
 z-index: 11111;
}
$.ajax({
  url: '/admin/photos/delete',
  data: "photo_id=" + photo_id,
  success: function(){
  },
  beforeSend: function(){
    //создаем div
    var loading = $("<div>", {
      "class" : "ds-loading"
    });
    //выравним div по центру страницы
    $(loading).css("top", ($(window).height()/2)-($(loading).height()/2)).css("left", ($(document).width()/2)-($(loading).width()/2));
    //добавляем созданный div в конец документа
    $("body").append(loading);
  },
  complete: function() {
    //уничтожаем div
    $(".ds-loading").detach();
  }
});

Но что делать, если таких запросов очень много? Вешать на каждый ajax запрос обработчики событий? Благодаря тому, что в JQuery 1.5 добавили дополнительные методы для работы с ajax, стало возможным, легко и непринужденно отобразить индикатор для всех JQuery ajax запросов выполняющийся на сайте, с помощью метода $.ajaxSetup. Просто добавляем следующий код перед началом первого ajax-запроса.

$.ajaxSetup({
  beforeSend: function(){
    //создаем div
    var loading = $("<div>", {
      "class" : "ds-loading"
    });
    //выравним div по центру страницы
    $(loading).css("top", ($(window).height()/2)-($(loading).height()/2)).css("left", ($(document).width()/2)-($(loading).width()/2));
    //добавляем созданный div в конец документа
    $("body").append(loading);
  },
  complete: function() {
    //уничтожаем div
    $(".ds-loading").detach();
  }
});

Теперь нам не нужно вешать обработчики событий на каждый вызов JQuery.ajax, этот функционал теперь “преднастроен” в каждом вызове.

 
Xo66uT13 Октябрь 2010JQuery, JavaScript

Очень важным моментом в интерфейсе сайта является сохранение его текущего положения, для того, чтобы после перезагрузки страницы, пользователю не пришлось заново повторять свои действия с настройкой интерфейса сайта под себя. Идеальным средством для хранения состояния пользовательского интерфейса является cookies. Всем известно как работать с куки с помощью серверных (backend) языков,  но зачастую проще это делать напрямую из JavaScript. Конечно можно передавать данные интерфейса серверной части, а там уже сохранять их хоть в БД. Но как правило, если вы не разрабатывайте новый интерфейс для gmail, нет необходимости делать это для 5-6 параметров.

JavaScript и Cookies.

В JavaScript есть стандартные методы для работы с document.cookie, именно так происходит обращение к куки в JavaScript. Например функция для установки куки будет выглядеть следующим образом

function setCookie(c_name,value,expiredays)
 {
        var exdate=new Date();
        exdate.setDate(exdate.getDate()+expiredays);
        document.cookie=c_name+ "=" +escape(value)+
        ((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
 }

Как вы видите не очень удобно, поэтому я и предпочитаю пользоваться JQuery плагинами, если конечно фреймворк в проекте уже присутствует, если нет, то подключать JQuery, только из-за работы с куки не рационально.  В принципе взяв готовые функции для document.cookie или написав их самостоятельно, можно свести неудобства и количество кода к минимуму.

Плагины cookies для JQuery.

Если в вашем сайте уже используется JQuery, то наиболее простой способ наладить работу с cookies, это использовать плагин. Плагинов довольно много я обычно использую ezCookie. В плагине содержатся стандартные методы для работы с cookies – установка, чтение, удаление. На странице проекта есть детальное описание всех методов. Плагин ezCookie отличается от многих подобных автоматическим распознаванием значения установленной cookie, и, если это JSON данные, то функция автоматически возвращает JSON объект. Такой режим работы позволяет устанавливать subcookie, то есть множества пар имя:значение для одного cookie (для одной cookie переменной).

Сохранение положения интерфейса.

Давайте напишем небольшой пример, который позволит понять схему сохранения простых позиций интерфейса. Пусть у нас будет 5 разноцветных квадратов, которые по клику на кнопку “закрыть” закрываются, и текст на кнопке меняется на “открыть”. И при нажатии на кнопку “открыть” соответственно квадрат снова становится видимым.

Для этого воспользуемся стандартной JQuery функцией toggle (переключатель), которая в качестве аргументов принимает 2 функции, одна из которых срабатывает на четном щелчке мыши, другая на нечетном. Чтобы сохранить положение квадратов, мы в первой toggle функции будем устанавливать значение cookie в 0, а на второй функции в 1, ноль означает, что квадрат скрыт, а единица соответственно, что квадрат виден.

Здесь я использую функцию ezCookie $.setSubCookie, чтобы не увеличивать количество записей cookie. Так как структурно записи для каждого квадрата у нас равны, то все проще хранить в одной cookie с именем “ui_save”. В качестве дополнительных параметров метод $.setSubCookie позволяет установить время жизни cookies, но в данном случае используется время жизни по умолчанию.

Итак позицию интерфейса в зависимости от действий пользователя мы записали, теперь нам необходимо сделать так, чтобы после загрузки страницы интерфейс возвращался в записанное состояние. Для этого мы сначала считаем нашу куку функцией $.cookie(“ui_save”), эта функция автоматически определяет какое значение установлено в куке и если это JSON, то она возвращает JSON объект, что в нашем случае и происходит. Далее для каждого квадрата мы проверяем значение и если оно равно нулю то вызываем событие click, которое установит нужное положение квадрата.

	$(document).ready(function(){
		$(".close").toggle(
			function(){
				$(this).prev().slideUp(); //скрываем квадрат
				$(this).html("Открыть");
				var class_name = $(this).prev().attr("class");
//устанавливаем значение куки для конкретного квадрата в положение закрыть
				$.setSubCookie("ui_save", class_name, 0);
			},
			function(){
				$(this).prev().slideDown(); //разворачиваем квадрат
				$(this).html("Закрыть");
				var class_name = $(this).prev().attr("class");
//устанавливаем значение куки для конкретного квадрата в положение открыт
				$.setSubCookie("ui_save", class_name, 1);
			}
		);

		//Устанавливаем необходимую позицию интерфейса
		var ck = $.cookie("ui_save");
		for(key in ck){
			if(ck[key] == 0){
//вызываем событие "закрыть"
				$("." + key).next().trigger('click');
			}
		}

	});

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

 
Xo66uT28 Апрель 2010JQuery, JavaScript

Одной из главных особенностей JQuery является то, что эта библиотека позволяется вам легко подчеркнуть ваш дизайн, анимировав некоторые элементы. Речь идет об отображении элементов, их движении и изменении цветов. Первое часто используется для скрытия информации, такой например, как заголовки картинок, то есть по умолчанию они скрыты, а при наведении курсора они проявляются. Часто также этот эффект применяются для того чтобы показать информацию и рейтинг скриншота при наведении на него. Читать далее…

 
Xo66uT3 Июль 2009JQuery

Столкнулся с тем, что необходимо было привлечь внимание пользователя к последней новости на сайте. Решил реализовать это на jQuery. Почитав официальную документацию, остановился на функции animate. И написал простенькую функцию для манипулирования со свойствами div. Читать далее…

 
Xo66uT20 Май 2009JQuery

Понадобилось мне сегодня создать простые вкладочки для одного из проектов, с  javascript я  дружу не очень сильно, поэтому путем не долгих поисков нашел готовое решение на английском языке. Система работы довольно простая, скрыть\показать слой (div), единственное что на JQuery все выглядит намного красивее, проще и удобнее. При клике на ссылку отображает соответствующее содержимое под ней.
Читать далее…