<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JSToolbox - все о JavaScript &#187; YUI</title>
	<atom:link href="http://www.jstoolbox.com/category/yui/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jstoolbox.com</link>
	<description>Блог о программировании вообще и о JavaScript в частности, уроки, статьи, заметки, база знаний.</description>
	<lastBuildDate>Mon, 07 Mar 2011 18:19:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Диалог alert на YUI</title>
		<link>http://www.jstoolbox.com/2008/09/29/dialog-alert-na-yui/</link>
		<comments>http://www.jstoolbox.com/2008/09/29/dialog-alert-na-yui/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 06:22:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[YUI]]></category>
		<category><![CDATA[alert]]></category>
		<category><![CDATA[SimpleDialog]]></category>
		<category><![CDATA[диалог]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/09/29/dialog-alert-na-yui/</guid>
		<description><![CDATA[Стандартный диалог alert не больно уж симпатично выглядит, да и изменить его вид не представляет возможности. Так что если вы захотите заменить его на что-нибудь более приглядное, то при помощи YUI и диалога SimpleDialog это сделать очень просто. Вот как это будет выглядеть:




Идею я позаимствовал у Asvin Baloo и несколько переделал реализацию. Суть метода заключается [...]]]></description>
			<content:encoded><![CDATA[<p>Стандартный диалог <strong>alert</strong> не больно уж симпатично выглядит, да и изменить его вид не представляет возможности. Так что если вы захотите заменить его на что-нибудь более приглядное, то при помощи <a href="">YUI</a> и диалога <a href="">SimpleDialog</a> это сделать очень просто. Вот как это будет выглядеть:</p>
<div class="entry_picture" style="width:410px">
<img src='http://www.jstoolbox.com/wp-content/uploads/2008/09/alert.png' alt='Стилизованый alert' />
</div>
<p><span id="more-227"></span></p>
<p>Идею я позаимствовал у <a href="http://htmlblog.net/yui-based-alert-box-replace-your-ugly-javascript-alert-box/" title="Блог Asvin Baloo">Asvin Baloo</a> и несколько переделал реализацию. Суть метода заключается в том, что стандартная функция <strong>alert</strong> переопределяется с использованием диалога <strong>SimpleDialog</strong> из состава <strong>YUI</strong>:</p>
<pre class="prettyprint">
window.alert = function(text) {
	var dialog = new YAHOO.widget.SimpleDialog("simpledialog1",
			{ 	width: "300px",
				fixedcenter: true,
				visible: false,
				draggable: false,
				zIndex: 9999,
				icon: YAHOO.widget.SimpleDialog.ICON_INFO,
				close: true,
				modal: true,
				constraintoviewport: true,
				buttons: [{ text:"Закрыть", handler: function(){this.hide()}, isDefault:true }]
			});
	dialog.setBody(text);
	dialog.setHeader('Информация');
	dialog.render(document.body);
	dialog.show();
}
</pre>
<p>В результате такого переопределения, при вызове функции <strong>alert</strong> будет вызываться диалоговое окно, показанное выше, с заголовком, иконкой и кнопкой &#8220;закрыть&#8221;. Все это естественно настраивается. При создании окна указываем параметр <em>modal</em> равным <em>true</em> для того, чтобы диалог был модальным, как и стандартный alert.</p>
<p>Дабы далее расширить функциональность, можно помимо функции <strong>alert()</strong> создать функции <strong>success()</strong> и <strong>warning()</strong>, которые выводили бы сообщения об успехе или предупреждение. Реализация всех фунций показана в следующем блоке:</p>
<pre class="prettyprint">
window.alert = function(text){
	popUpDialog(text);
};

window.success = function(text){
	popUpDialog(text, 2);
}

window.warning = function(text){
	popUpDialog(text, 1);
}

function popUpDialog(text, type){
	var sIcon = YAHOO.widget.SimpleDialog.ICON_BLOCK;
	var title = 'Ошибка';
	switch (type){
		case 1:
			sIcon = YAHOO.widget.SimpleDialog.ICON_WARN;
			title = 'Предупреждение';
			break;
		case 2:
			sIcon = YAHOO.widget.SimpleDialog.ICON_INFO;
			title = 'Информация';
	}
	var dialog = new YAHOO.widget.SimpleDialog("simpledialog1",
			{ 	width: "300px",
				fixedcenter: true,
				visible: false,
				draggable: false,
				zIndex: 9999,
				icon:sIcon,
				close: true,
				modal: true,
				constraintoviewport: true,
				buttons: [{ text:"Закрыть", handler: function(){this.hide()}, isDefault:true }]
			});
	dialog.setBody(text);
	dialog.setHeader(title);
	dialog.render(document.body);
	dialog.show();
}
</pre>
<p>Здесь, создание диалогового окна вынесено в отдельную функцию <strong>popUpDialog()</strong>, где первым параметром передается строка сообщения, а вторым его тип. В зависимости от типа окна, устанавливаются два параметра &#8211; иконка и текст заголовка, которые после используются для создания диалогового окна. Далее создаются три функции <strong>alert()</strong>, <strong>success()</strong> и <strong>warning()</strong>, которые просто вызывают <strong>popUpDialog()</strong> с нужными параметрами.</p>
<p><a href="/demo/yui-alert.php" title="Смотреть демо" class="demo">смотреть демо</a><a href="/download/yui-alert.zip" title="Скачать пример" class="download">Скачать пример</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/09/29/dialog-alert-na-yui/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Асинхронная отправка файлов при помощи YUI</title>
		<link>http://www.jstoolbox.com/2008/02/29/asinxronnaya-otpravka-fajlov-pri-pomoshhi-yui/</link>
		<comments>http://www.jstoolbox.com/2008/02/29/asinxronnaya-otpravka-fajlov-pri-pomoshhi-yui/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 23:28:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/02/29/asinxronnaya-otpravka-fajlov-pri-pomoshhi-yui/</guid>
		<description><![CDATA[Ранее я написал о том, как асинхронно отправлять файлы на сервер используя простой скрипт. Теперь я покажу, как то же самое можно сделать при помощи библиотеки YUI, которая предоставляет гораздо более удобный интерфейс.
В YUI, отправка асинхронных запросов на сервер осуществляет функция asyncRequest() модуля Connection Manager. Функции необходимо передать тип (GET или POST), URL запроса и [...]]]></description>
			<content:encoded><![CDATA[<p>Ранее я написал о том, как асинхронно отправлять файлы на сервер используя простой <a href="http://www.jstoolbox.com/2008/02/20/asinxronnaya-otpravka-fajlov-na-server/">скрипт</a>. Теперь я покажу, как то же самое можно сделать при помощи библиотеки YUI, которая предоставляет гораздо более удобный интерфейс.</p>
<p>В <a href="http://developer.yahoo.com/yui/">YUI</a>, отправка асинхронных запросов на сервер осуществляет функция <strong>asyncRequest()</strong> модуля <a href="http://developer.yahoo.com/yui/connection/">Connection Manager</a>. Функции необходимо передать тип (GET или POST), URL запроса и объект <strong>callback</strong>, который будет обрабатывать полученные от сервера данные. Если нужно отправить на сервер данные формы, то необходимо указать объекту Connect вашу форму. Делается это при помощи функции <strong>setForm()</strong>:</p>
<pre class="prettyprint">
YAHOO.util.Connect.setForm(formObject, true);
</pre>
<p>Первый параметр &#8211; <strong>formObject</strong> &#8211; это указатель на форму. Однако, первым параметром может быть и ID формы. В этом случае Connection Manager сам получит указатель на форму при помощи getElementById. Второй параметр &#8211; это собственно то, что нам и нужно &#8211; это значение указывает на то, что нам необходимо отправлять файлы на сервер.</p>
<p>Далее нужно создать объект <strong>callback</strong> (если вам конечно нужно обрабатывать данные, которые возвращает сервер). Все члены объекта <strong>callback</strong> являются не обязательными, но желательно указать по крайней мере <strong>success</strong> и <strong>failure</strong> &#8211; функции, которые будут вызываться при успешной отправке (success) или ошибке (failure). Помимо этого, при отправке файлов, нужно также объявить функцию <strong>upload</strong>, которая будет вызываться при успешной отправке файла. Еще один очень важный параметр объекта <strong>callback</strong> это массив <strong>argument</strong>, в который нужно добавлять значения, необходимые для последующей обработки данных. Итак, пример:</p>
<pre class="prettyprint">
var callback_obj = {
	argument : ['targetPre'],
	success: function(o) { alert('Файл успешно отправлен.'); },
	failure: function(o) { alert('Ошибка!!!'); },

	upload : function(response){
		var target = document.getElementById(response.argument[0]);
		target.innerHTML = response.responseText;
	}
}
</pre>
<p>В этом примере ответ от сервера (responseText) будет добавлен как содержимое в элемент с ID = targetPre (параметр, указанный в argument). После этого можно выполнять запрос:</p>
<pre class="prettyprint">
var cObj = YAHOO.util.Connect.asyncRequest('POST', 'http://www.example.com', callback_obj);
</pre>
<p>Теперь пример простого web приложения, которое асинхронно отправляет файл на сервер и полученные от сервера данные помещает в элемент pre:</p>
<pre class="prettyprint">
&lt;html>
&lt;head>
&lt;script src="http://yui.yahooapis.com/2.5.0/build/yahoo/yahoo-min.js">&lt;/script>
&lt;script src="http://yui.yahooapis.com/2.5.0/build/event/event-min.js">&lt;/script>
&lt;script src="http://yui.yahooapis.com/2.5.0/build/connection/connection-min.js">&lt;/script>
&lt;script type="text/javascript">

function upload(){
	var formObject = document.getElementById('aForm'); 

	// аргумент true указывает на то, что нам нужно отправлять файлы
	YAHOO.util.Connect.setForm(formObject, true);
	// отправка формы
	var cObj = YAHOO.util.Connect.asyncRequest('POST', formObject.getAttribute('action'), callback_obj);
}

var callback_obj = {
	argument : ['targetPre'],
	success: function(o) { alert('Файл успешно отправлен.'); },
	failure: function(o) { alert('Ошибка!!!'); },

	upload : function(response){
		var target = document.getElementById(response.argument[0]);
		target.innerHTML = response.responseText;
	}
}
&lt;/script>
&lt;/head>
&lt;body>
&lt;form id="aForm" name="my_form" action="upload.php" onsubmit="upload(); return false;">
&lt;input type="file" name="my_file" />
&lt;input type="submit" name="submit_btn" value="Send" />
&lt;/form>
&lt;pre id="targetPre">&lt;/pre>
&lt;/body>
&lt;/html>
</pre>
<p>Здесь указатель на форму получается при помощи <strong>getElementById()</strong>, аттрибут <strong>action</strong> которого используется как URL запроса. Функция <strong>upload()</strong> вызывается из хендлера <strong>onsubmit</strong>, а для того, чтобы форма не выполняла действие по умолчанию (чтобы не перезагружалась страница) возвращаем из onsubmit значение false.</p>
<p>Подробнее о модуле <strong>Connection Manager</strong> можно узнать из <a href="http://developer.yahoo.com/yui/connection/" rel="nofollow">официальной документации</a> библиотеки.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/02/29/asinxronnaya-otpravka-fajlov-pri-pomoshhi-yui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Асинхронная отправка файлов на сервер</title>
		<link>http://www.jstoolbox.com/2008/02/20/asinxronnaya-otpravka-fajlov-na-server/</link>
		<comments>http://www.jstoolbox.com/2008/02/20/asinxronnaya-otpravka-fajlov-na-server/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 21:32:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/02/20/asinxronnaya-otpravka-fajlov-na-server/</guid>
		<description><![CDATA[Не так давно, при разработке чата, я столкнулся с проблемой асинхронной отправки файлов на сервер. Мне нужно было добавить возможность добавлять аватару к профилю пользователя без перезагрузки страницы. После продолжительных поисков я наткнулся на очень хороший по моему мнению скрипт, осуществляющий отправку файла через скрытый iframe, который создается динамически:

var AIM = {
	frame : function(c) {

		var [...]]]></description>
			<content:encoded><![CDATA[<p>Не так давно, при разработке чата, я столкнулся с проблемой асинхронной отправки файлов на сервер. Мне нужно было добавить возможность добавлять аватару к профилю пользователя без перезагрузки страницы. После продолжительных поисков я наткнулся на очень хороший по моему мнению <a href="http://www.webtoolkit.info/ajax-file-upload.html">скрипт</a>, осуществляющий отправку файла через скрытый <strong>iframe</strong>, который создается динамически:</p>
<pre class="prettyprint">
var AIM = {
	frame : function(c) {

		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '&lt;iframe style="display:none" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')">&lt;/iframe>';
		document.body.appendChild(d);

		var i = document.getElementById(n);
		if (c &#038;&#038; typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}

		return n;
	},

	form : function(f, name) {
		f.setAttribute('target', name);
	},

	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c &#038;&#038; typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},

	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}

		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
}
</pre>
<p>Функция <strong>submit()</strong> является основной в объекте <strong>AIM</strong>. Она создаёт скрытый iframe при помощи функции <strong>frame()</strong>, добавляет атрибут <strong>target</strong> для формы и при необходимости выполняет callback <strong>onStart</strong> при начале отправки формы. В целом, принцип действия скрипта основывается на применении атрибута <strong>target</strong>, который указывает, где будет отображаться новый документ. Поскольку здесь <strong>target</strong> указывает на скрытый iframe, то страница не будет перезагружаться при оправке формы, а ответ от сервера будет помещен как его содержимое.</p>
<p>Пример применения объекта AIM приведен в следующем листинге:</p>
<pre class="prettyprint">
&lt;form action="index.php" method="post" onsubmit="return AIM.submit(this, {'onStart' : null, 'onComplete' : completeCallback})">
....
&lt;/form>
</pre>
<p>В этом примере будет происходить отправка данных формы (в том числе и файлов, если таковые указаны) на сервер. Возвращаемые сервером данные передаются в функцию <strong>completeCallback</strong>, которую целесообразно использовать для оповещения пользователя о результатах отправки формы и возможных ошибках.</p>
<p>Если вы предпочитаете использовать библиотеку <a href="http://developer.yahoo.com/yui/">YUI</a>, то отправку файлов можно осуществлять при помощи <a href="http://developer.yahoo.com/yui/connection/#forms">connection manager</a>. Подробнее об этом я расскажу в следующий раз.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/02/20/asinxronnaya-otpravka-fajlov-na-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Добавление поддержки объекта History в AJAX приложения.</title>
		<link>http://www.jstoolbox.com/2008/01/20/dobavlenie-podderzhki-obekta-history-v-ajax-prilozheniya/</link>
		<comments>http://www.jstoolbox.com/2008/01/20/dobavlenie-podderzhki-obekta-history-v-ajax-prilozheniya/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 20:24:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[History]]></category>
		<category><![CDATA[YUI]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/2008/01/20/dobavlenie-podderzhki-obekta-history-v-ajax-prilozheniya/</guid>
		<description><![CDATA[Одной из основных проблем при использовании AJAX является невозможность навигации при помощи кнопок BACK и FORWARD,  а также функций history.back(), history.go() и др., потому что изменения в веб странице, которые осуществляются через AJAX никак не отображаются на объекте History. Кроме того, страницы, полученные с использованием AJAX, невозможно добавлять в закладки.
Эти проблемы можно решить при [...]]]></description>
			<content:encoded><![CDATA[<p>Одной из основных проблем при использовании AJAX является невозможность навигации при помощи кнопок BACK и FORWARD,  а также функций <strong>history.back()</strong>, <strong>history.go()</strong> и др., потому что изменения в веб странице, которые осуществляются через AJAX никак не отображаются на объекте History. Кроме того, страницы, полученные с использованием AJAX, невозможно добавлять в закладки.</p>
<p>Эти проблемы можно решить при помощи утилиты Browser History Manager, входящей в состав библиотеки <a href="http://developer.yahoo.com/yui/">YUI</a>. Она позволяет создавать веб приложения с полностью функциональным объектом History, а также возможностью сохранять другие параметры состояния приложения, например, информацию о том, какие панели или кнопки на странице активны.</p>
<p><span id="more-5"></span></p>
<p>У этой утилиты есть и несколько ограничений. Основное &#8211; это невозможность использовать её в браузере Opera, из-за того что последний не обновляет свойство location.hash при использовании кнопок back/forward. Также, из-за того, что утилита записывает историю в фрагменты URL (часть, которая идет после знака #), есть ограничения на длину имени состояния. Например, для Internet Explorer этот лимит составляет 2083 символа (длина URL вместе с фрагментом).</p>
<p>Теперь о том как этим пользоваться.<br />
Во первых, нужно подключить необходимые модули:</p>
<pre class="prettyprint">
&lt;script src="http://yui.yahooapis.com/2.4.1/build/yahoo/yahoo-min.js">&lt;/script>
&lt;script src="http://yui.yahooapis.com/2.4.1/build/event/event-min.js">&lt;/script>
&lt;script src="http://yui.yahooapis.com/2.4.1/build/history/history-min.js">&lt;/script>
</pre>
<p>Затем нужно добавить следующие две строки, сразу после тэга &lt;body&gt;:</p>
<pre class="prettyprint">
&lt;iframe id="yui-history-iframe" src="path_to_asset" style="position:absolute; top:0; left:0;width:1px; height:1px; visibility:hidden;">&lt;/iframe>
&lt;input id="yui-history-field" type="hidden" />
</pre>
<p>Вместо path-to-asset в аттрибуте url нужно вставить существующий url, ссылающийся на тот же домен, на котором находится ваша страница. Лучше всего здесь использовать относительные пути. Стили в тэге iframe необходимы только для того, чтобы сделать его невидимым.</p>
<p>Следующий шаг &#8211; регистрация модуля.<br />
Здесь, <strong>модуль</strong> это видимый объект на странице с которым пользователь будет взаимодействовать и состояния которого нужно будет сохранять в истории браузера. Содержимое модуля изменяется, и для того, чтобы сохранять состояние этих изменений, и затем переходить по этим состояниям при помощи кнопок back/forward, нужно этот модуль зарегистрировать. Делается это функцией <strong>YAHOO.util.History.register()</strong>, которая принимает 3 параметра : идетнификатор модуля (не пустая строка, уникально идентифицирующая этот модуль), начальное состояние модуля (т.е. состояние, соответствующее первой точке в истории), и функция обработчик, которая будет вызываться всякий раз, когда состояние модуля изменится.</p>
<p>Начальное состояние это состояние объекта при первом открытии страницы. Суть в том, что пользователь мог ранее посещать эту страницу и сохранить ссылку на определённое состояние модуля, к примеру URL может выглядеть так: www.example.com/index.php#page=tenth_page. В этом случае необходимо открыть страницу именно в том состоянии, на которое указывает идентификатор состояния модуля. Чтобы получить это состояние используйте функцию <strong>YAHOO.util.History.getBookmarkedState()</strong>, которая принимает один параметр &#8211; идинтификатор модуля:</p>
<pre class="prettyprint">var bookmarkedState = YAHOO.util.History.getBookmarkedState("module_name");</pre>
<p>В том случае если пользователь ввел ссылку без каких либо идентифкаторов, нужно показать страницу по умолчанию, т.е. передать в функцию <strong>register()</strong> идентификатор начального состояния модуля.</p>
<pre class="prettyprint">var initialState = bookmarkedState || "defaultState";</pre>
<p>Последним аргументом в функцию <strong>register()</strong> должен быть обработчик события <strong>onStateChange</strong>. Этот обработчик будет вызываться каждый раз при изменении состояния модуля (например, при нажатии пользователем кнопок back/forward).</p>
<pre class="prettyprint">function stateChangeHandler(state){
	// Обновляем интерфейс модуля в соответствии с параметром состояния - state
}</pre>
<p>Теперь, получив все параметры, вызываем функцию <strong>YAHOO.util.History.register()</strong>:</p>
<pre class="prettyprint">YAHOO.util.History.register("myModule", initialState, stateChangeHandler);</pre>
<p>Использование метода <strong>onReady</strong></p>
<p>Инициализация Browser History Manager происходит асинхронно, поэтому все его методы доступны только после полной инициализации менеджера. Для этого используется метод <strong>onReady()</strong>. Типичное применение для этого метода &#8211; это получение первоначального значения состояния и обновление интерфейса в соответствии с этим состоянием. Пример:</p>
<pre class="prettyprint">YAHOO.util.History.onReady(function () {
	var сurrentState = YAHOO.util.History.getCurrentState("myModule");
	// Обновление интерфейса модуля до состояния "сurrentState"

});</pre>
<p>Теперь последняя составляющая инициализации History менеджера &#8211; вызов функции <strong>YAHOO.util.History.initialize()</strong>:</p>
<pre class="prettyprint">try {
	YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
} catch (error){
	// обработка ошибки инициализации
}</pre>
<p>где, &#8220;yui-history-field&#8221; и &#8220;yui-history-iframe&#8221; &#8211; это id обязательных элементов, созданных нами выше.</p>
<p>Теперь, когда модуль инициализирован, можно использовать его, т.е. изменять его состояния в соответствии с выполенными изменениями. Делается это при помощи функции <strong>YAHOO.util.History.navigate()</strong>, в которую нужно передать 2 параметра &#8211; имя модуля и новое название состояния:</p>
<pre class="prettyprint">YAHOO.util.History.navigate("myModule", "newState");</pre>
<p></p>
<h3>Создание приложения</h3>
<p>Теперь от теории к практике. Напишем простой пример коммуникации с сервером посредством AJAX с использованием History Browser Manager. Наше приложение будет иметь меню с тремя ссылками на три разные страницы, содержимое этих страниц будет асинхронно подгружаться в div контейнер. После нескольких AJAX запросов можно будет возвращаться взад/вперед при помощи кнопок back/forward.</p>
<p>
<h5>Шаг 1</h5>
<p>Создаем основной HTML документ, который будет содержать все необходимые процедуры. Добавляем туда необходимые библиотеки и обязательные тэги &lt;iframe&gt; и &lt;input&gt;. Необходимо также добавить библиотеку connection.js для осуществления запросов AJAX. Далее создаём меню со ссылками и контейнер для отображения информации, полученной от сервера. После первого шага, получаем следующий HTML документ:</p>
<pre class="prettyprint">
&lt;html>
&lt;head>
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
&lt;head>
&lt;title>Демонстрация работы модуля Browser History Manager библиотеки YUI&lt;/title>
&lt;style>
#header {
	text-align: center;
	background: #ccc;
	border-top: 1px solid #aaa;
	border-bottom: 1px solid #aaa;
}

#sidebar {
	width: 240px;
	float: left;
}

#sidebar li {
	list-style-type: none;
}

#container {
	width: 440px;
	height: 400px;
	padding: 8px;
	border: 1px solid #aaa;
	float: left;
	overflow: auto;
}
&lt;/style>

&lt;!-- Зависимости -->
&lt;script src="http://yui.yahooapis.com/2.4.1/build/yahoo/yahoo-min.js">&lt;/script>
&lt;script src="http://yui.yahooapis.com/2.4.1/build/event/event-min.js">&lt;/script>

&lt;!-- Для использования ajax запросов -->
&lt;script src="http://yui.yahooapis.com/2.2.2/build/connection/connection-min.js" type="text/javascript">&lt;/script>

&lt;!-- Browser History Manager -->
&lt;script src="http://yui.yahooapis.com/2.4.1/build/history/history-min.js">&lt;/script>
&lt;/head>
&lt;body>
&lt;!-- следующие 2 строки обязательны для объекта history -->
&lt;iframe id="yui-history-iframe" src="yuihist1.html" style="position:absolute; top:0; left:0;width:1px; height:1px; visibility:hidden;">&lt;/iframe>
&lt;input id="yui-history-field" type="hidden">

&lt;!-- заголовок -->
&lt;h2 id="header">Демонстрация работы модуля Browser History Manager библиотеки YUI&lt;/h2>
&lt;!-- ссылки -->
&lt;ul id="sidebar">
	&lt;li>&lt;a href="yuihist1.html" onclick="navigate(this);return false">Страница 1&lt;/a>&lt;/li>
	&lt;li>&lt;a href="yuihist2.html" onclick="navigate(this);return false">Страница 2&lt;/a>&lt;/li>
	&lt;li>&lt;a href="yuihist3.html" onclick="navigate(this);return false">Страница 3&lt;/a>&lt;/li>
&lt;/ul>

&lt;!-- контейнер для отображения полученных от сервера данных -->
&lt;div id="container">&lt;/div>

&lt;/body>
&lt;/html></pre>
<p></p>
<h5>Шаг 2 &#8211; инициализация.</h5>
<p>Модулем в нашем приложении будет контейнер div. Именно изменения в этом объекте будут отслеживаться при помощи History менеджера. Назовем этот модуль именем &#8220;page&#8221;. Состояниями контейнера в нашем случае будут URL получаемых документов. Первым документом будет страница с именем yuihist1.html. Обработчиком события <strong>onStateChange</strong> будет функция <strong>ajaxCall()</strong>, которая будет выполнять запрос AJAX и, следовательно, изменять состояние нашего модуля. Обратите внимание на функцию <strong>onReady()</strong>, которая отображает первую страницу при инициализации приложения.</p>
<pre class="prettyprint">
// Инициализация history
window.onload = function(){
	try {
		// определяем, какая страница должна быть открыта первой
		var bookmark = YAHOO.util.History.getBookmarkedState("page");
		var initialState = bookmark || "yuihist1.html";

		// каждый раз при изменении состояния объекта history будет вызываться обработчик ajaxCall
		YAHOO.util.History.register("page", initialState, ajaxCall);

		YAHOO.util.History.onReady(function () {
			var firstPage = YAHOO.util.History.getCurrentState("page");
			ajaxCall(firstPage);
		});

		YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
	} catch (e){
		// в случае ошибки инициализации, переопределяем функцию navigate,
		// чтобы не использовать функции history
		navigate = ajaxCall;

		// открываем первую страницу
		navigate('yuihist1.html');
	}
}
</pre>
<p><br/></p>
<h5>Шаг 3 &#8211; создание функций, выполняющих AJAX запрос посредством History менеджера.</h5>
<p>Функцей, которая будет выполнять AJAX запрос, является упомянутая выше <strong>ajaxCall()</strong>. Другая функция &#8211; <strong>navigate()</strong> будет выполнять AJAX запрос посредством History менеджера. Ключевой здесь является последняя строка, вызывающая функцию <strong>navigate()</strong>. Устанавливая новое имя состояния модуля, она вызывает событие onStateChanged, которое в свою очередь вызывает обработчик &#8211; функцию <strong>ajaxCall()</strong>, которой передается текущее состояние модуля (в нашем случае URL).</p>
<pre class="prettyprint">// функции осуществляющие ajax запрос
var callback = {
	success : function(o){
		document.getElementById('container').innerHTML = o.responseText;
	},
	failure : function(o){
		alert(o.responseText);
	}
}

function ajaxCall(sURL){
	YAHOO.util.Connect.asyncRequest('GET', sURL, callback, null);
}

// функция, осуществляющая ajax запрос посредством объекта history
function navigate(elem){
	// определяем url
	var url = elem.getAttribute("href");

	// параметр url будет передаваться обработчику (в нашем случае это функция ajaxCall)
	YAHOO.util.History.navigate("page", url);
}</pre>
</p>
<p>Посмотреть демо примера можно <a href="http://www.jstoolbox.com/demo/yuihist/yuihist.html" rel="nofollow">здесь</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2008/01/20/dobavlenie-podderzhki-obekta-history-v-ajax-prilozheniya/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

