

<?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>Russian Ajax Community - Всё об AjaxУроки и примеры &#187; </title>
	<atom:link href="http://www.ajaxa.net/category/uroki-i-primeryi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxa.net</link>
	<description>Русское сообщество ajax - www.ajaxa.net</description>
	<lastBuildDate>Fri, 30 Jan 2009 09:45:28 +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>Кросс-доменный Ajax</title>
		<link>http://www.ajaxa.net/2008/10/12/kross-domennyiy-ajax/</link>
		<comments>http://www.ajaxa.net/2008/10/12/kross-domennyiy-ajax/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 13:55:18 +0000</pubDate>
		<dc:creator>AndrOvcharenko</dc:creator>
				<category><![CDATA[Ajax это просто]]></category>
		<category><![CDATA[Книги]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2008/10/12/kross-domennyiy-ajax/</guid>
		<description><![CDATA[Для многих, начавших изучение Ajax является неприятным сюрпризом, что объект XMLHttpRequest не разрешает кросс-доменные запросы. В частности, это не позволяет использовать технологию Ajax для разработки клиентского кода для веб-сервисов (без использования ретрансляции запросов через "родной" веб-сервер). В новой спецификации объекта XMLHttpRequest ограничение на кросс-доменные запросы снято, однако насколько скоро это будет поддержано разраотчиками веб-браузеров остается [...]]]></description>
			<content:encoded><![CDATA[<p>Для многих, начавших изучение Ajax является неприятным сюрпризом, что объект XMLHttpRequest не разрешает кросс-доменные запросы. В частности, это не позволяет использовать технологию Ajax для разработки клиентского кода для веб-сервисов (без использования ретрансляции запросов через "родной" веб-сервер). В новой спецификации объекта XMLHttpRequest ограничение на кросс-доменные запросы снято, однако насколько скоро это будет поддержано разраотчиками веб-браузеров остается только предполагать.</p>
<p><span id="more-89"></span></p>
<p>Использовать кросс-доменный Ajax можно уже сегодня при помощи динамического создания элементов SCRIPT и загрузки кода JavaScript. При этом возникают несколько проблем, часть из которых можно решить, а часть из которых не поддается простому решению. Давайте рассмотрим эти проблемы.</p>
<p>Прежде всего в разных веб-браузерах код будет действовать по-разному и потребуются разные подходы. Например, в некоторых веб-браузерах загрузка начинается в момент присвоения свойству src нового значения, а в других - только при присоединении элемента SCRIPT к дереву DOM документа. В некоторых веб-браузерах можно повторно использовать элементы SCRIPT для загрузки новых скриптов, а других нет.</p>
<p>Проблемой является вызов функции-обработчика и передача ему параметров. В спецификации HTML, к сожалению не специфицированы события, вызывающиеся по загрузке скрипта (аналогично body.onload) и эти события у различных версий веб-браузеров будут разные.</p>
<p>Вы, наверное, уже заждались кода, решающего эти проблемы. Вот он. Некоторые подробности обсудим далее.</p>
<p><code><br />
function sendScriptRequest(url, httpParams, callback, callbackArgsArray) {<br />
var currentScript = document.createElement("SCRIPT");<br />
if (httpParams)<br />
httpParams="?rand=" + Math.random() + "&amp;" + httpParams;<br />
else<br />
httpParams="?rand=" + Math.random();<br />
currentScript.ajax_readyState = false;<br />
currentScript.onload = scriptCallback(currentScript, callback, callbackArgsArray);<br />
currentScript.onreadystatechange = scriptCallback(currentScript, callback, callbackArgsArray);<br />
currentScript.src = url + httpParams;<br />
document.getElementsByTagName("script")[0].parentNode.appendChild(currentScript);<br />
}function scriptCallback(currentScript, callback, callbackArgsArray){<br />
return function() {<br />
if (currentScript.ajax_readyState)<br />
return;<br />
if (! currentScript.readyState || currentScript.readyState == "loaded" || currentScript.readyState == "complete") {<br />
currentScript.ajax_readyState = true;<br />
callback.apply(currentScript, callbackArgsArray)<br />
currentScript.parentNode.removeChild(currentScript);<br />
}<br />
}<br />
}<br />
</code>К запросу добавляется параметр rand=Math.random(). Это необходимо, если скрипты генерируются динеамически и Вам необходимо избежать использование кэшированных скриптов. Если скрипты статические - можно удалить этот параметр.</p>
<p>К нерешенной проблеме относится то, что ответом на запрос является выполнение кода. И если Вам необходимо получить его в виде строки вроде responseText, Вам придется в генерируемом сервером скрипте присвоить єто значение переменной, например:</p>
<p><code>var responseText = "abc123" ;</code></p>
<p>Тогда вызов функции может быть таким</p>
<p><code><br />
sendScriptRequest("http://test123.com", "a=1&amp;b=2",myCallback, ["test123"]);<br />
function(a) {<br />
alert(responseText); // это переменная из загружаемого скрипта var responseText = "abc123" ;<br />
alert(a) ; этот параметр задается при вызове функции как ["test123"]<br />
}</code></p>
<p>Более подробно об этом и многом другом Вы можете прочитать в моей книге <a href="http://www.bhv.ru/books/full_contents.php?id=184616">Овчаренко А. Ajax на примерах</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2008/10/12/kross-domennyiy-ajax/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Шахматы на Ajax</title>
		<link>http://www.ajaxa.net/2007/06/01/shahmatyi-na-ajax/</link>
		<comments>http://www.ajaxa.net/2007/06/01/shahmatyi-na-ajax/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 05:02:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Найденное в сети]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/06/01/shahmatyi-na-ajax/</guid>
		<description><![CDATA[Это интересный пример приложения, написанного на Аяксе. Полноценные шахматы.
MORFIK CHESS
]]></description>
			<content:encoded><![CDATA[<p>Это интересный пример приложения, написанного на Аяксе. Полноценные шахматы.<br />
<a TARGET="_blank" HREF="http://chess.labs.morfik.com/">MORFIK CHESS</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/06/01/shahmatyi-na-ajax/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>AJAX-скрипты и не только&#8230; Сайт с бесплатными скриптами</title>
		<link>http://www.ajaxa.net/2007/06/01/ajax-skriptyi-i-ne-tolko-sayt-s-besplatnyimi-skriptami/</link>
		<comments>http://www.ajaxa.net/2007/06/01/ajax-skriptyi-i-ne-tolko-sayt-s-besplatnyimi-skriptami/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 04:55:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Найденное в сети]]></category>
		<category><![CDATA[Полезное]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/06/01/ajax-skriptyi-i-ne-tolko-sayt-s-besplatnyimi-skriptami/</guid>
		<description><![CDATA[ Много примеров, с описаниями и демо. Все бесплатно и может быть загружено с сайта без каких-либо ограничений.
http://www.dhtmlgoodies.com/index.html
]]></description>
			<content:encoded><![CDATA[<p> Много примеров, с описаниями и демо. Все бесплатно и может быть загружено с сайта без каких-либо ограничений.</p>
<p><a href="http://www.dhtmlgoodies.com/index.html" target="_blank">http://www.dhtmlgoodies.com/index.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/06/01/ajax-skriptyi-i-ne-tolko-sayt-s-besplatnyimi-skriptami/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Учебник по интеграции xAJAX в Joomla CMS 1.0.x</title>
		<link>http://www.ajaxa.net/2007/06/01/uchebnik-po-integratsii-xajax-v-joomla-cms-10x/</link>
		<comments>http://www.ajaxa.net/2007/06/01/uchebnik-po-integratsii-xajax-v-joomla-cms-10x/#comments</comments>
		<pubDate>Fri, 01 Jun 2007 04:47:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax и cms]]></category>
		<category><![CDATA[Ajax это просто]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/06/01/uchebnik-po-integratsii-xajax-v-joomla-cms-10x/</guid>
		<description><![CDATA[Joomla CMS сейчас популярна как никогда. Соответственно, и пишут под нее много.
По указанной ниже ссылке расположен небольшой учебник о том, как интегрировать AJAX в компоненты Joomla CMS, а также размещен демо-компонент, показывающий, как это делается на практике.
Учебник по интеграции xAJAX в Joomla CMS 1.0.x
]]></description>
			<content:encoded><![CDATA[<p>Joomla CMS сейчас популярна как никогда. Соответственно, и пишут под нее много.</p>
<p>По указанной ниже ссылке расположен небольшой учебник о том, как интегрировать AJAX в компоненты Joomla CMS, а также размещен демо-компонент, показывающий, как это делается на практике.</p>
<p><a href="http://myjoomla.ru/content/view/118/28/" target= "_blank">Учебник по интеграции xAJAX в Joomla CMS 1.0.x</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/06/01/uchebnik-po-integratsii-xajax-v-joomla-cms-10x/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Примеры утилит на Аяксе</title>
		<link>http://www.ajaxa.net/2007/03/30/primeryi-utilit-na-ayakse/</link>
		<comments>http://www.ajaxa.net/2007/03/30/primeryi-utilit-na-ayakse/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 23:26:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Найденное в сети]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/03/30/primeryi-utilit-na-ayakse/</guid>
		<description><![CDATA[Небольшие приложения, написанные с использованием AJAX:\

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

Есть онлайн-демо.
Все это в пакете Zapatec Suite. Посмотреть и скачать можно здесь: http://www.zapatec.com
]]></description>
			<content:encoded><![CDATA[<p>Небольшие приложения, написанные с использованием AJAX:\</p>
<ul>
<li>календарь</li>
<li>меню</li>
<li>дерево</li>
<li>wysiwyg-редактор</li>
<li> слайдер</li>
<li>часы</li>
<li>окна</li>
<li>эффекты интерактивного скрытия, перемещения, изменения цвета элементов</li>
<li>импорт содержимого из внешнего файла на сервер</li>
<li>ну и еще всяческие примочки на Аяксе.</li>
</ul>
<p>Есть онлайн-демо.</p>
<p>Все это в пакете <strong>Zapatec Suite. </strong>Посмотреть и скачать можно здесь: <a href="http://www.zapatec.com/" target="_blank">http://www.zapatec.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/03/30/primeryi-utilit-na-ayakse/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AJAX: С чего начать</title>
		<link>http://www.ajaxa.net/2007/03/30/ajax-s-chego-nachat/</link>
		<comments>http://www.ajaxa.net/2007/03/30/ajax-s-chego-nachat/#comments</comments>
		<pubDate>Thu, 29 Mar 2007 21:30:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax это просто]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/03/30/ajax-s-chego-nachat/</guid>
		<description><![CDATA[В этой статье рассмотрены основные принципы работы AJAX и даны два простых примера, использующих эту технологию.
Содержание
1 Что такое AJAX?
2 Шаг 1 — Как послать HTTP запрос
3 Шаг 2 — Обрабатываем HTTP ответ
4 Шаг 3 — Простой пример
5 Шаг 4 — Работа с XML ответом
Что такое AJAX?
Ajax означает Асинхронный JavaScript и XML. В основе технологии лежит [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье рассмотрены основные принципы работы AJAX и даны два простых примера, использующих эту технологию.</p>
<p><strong>Содержание</strong></p>
<p>1 Что такое AJAX?<br />
2 Шаг 1 — Как послать HTTP запрос<br />
3 Шаг 2 — Обрабатываем HTTP ответ<br />
4 Шаг 3 — Простой пример<br />
5 Шаг 4 — Работа с XML ответом</p>
<p><strong>Что такое AJAX?</strong></p>
<p>Ajax означает Асинхронный JavaScript и XML. В основе технологии лежит использование нестандартного объекта XMLHttpRequest(), необходимого для взаимодействия со скриптами на стороне сервера. Объект может как отправлять, так и получать информацию в различных форматах включая XML, HTML и даже текстовые файлы. Самое привлекательное в Ajax — это его асинхронный принцип работы. С помощью этой технологии можно осуществлять взаимодействие с сервером без необходимости перезагрузки страницы. Это позволяет обновлять содержимое страницы частично, в зависимости от действий пользователя.</p>
<p>Две особенности, которые мы рассмотрим:</p>
<p>* Отправление запросов серверу без перезагрузки страницы<br />
* Работа с XML документами</p>
<p><span id="more-71"></span></p>
<p><strong>Шаг 1 — Как послать HTTP запрос</strong></p>
<p>Для того, чтобы послать HTTP запрос на сервер используя JavaScript, вам необходим экземпляр класса, который позволит это сделать. Такой класс впервые был введен в Internet Explorer как объект ActiveX, называемый XMLHTTP. Позже в Mozilla, Safari и другие броузеры был введен класс XMLHttpRequest, который поддерживал методы и свойства изначального объекта ActiveX от Microsoft.</p>
<p>В результате, чтобы создать кросс-броузерный объект требуемого класса, вы можете сделать следующее:</p>
<p><code>if (window.XMLHttpRequest) { // Mozilla, Safari, ...<br />
http_request = new XMLHttpRequest();<br />
} else if (window.ActiveXObject) { // IE<br />
http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />
}</code></p>
<p>(В целях наглядности код выше является немного упрощенным. Более жизненный пример будет рассмотрен в шаге 3 этой статьи)</p>
<p>Некоторые версии некоторых броузеров Mozilla не будут корректно работать, если ответ сервера не содержит заголовка XML mime-type. Чтобы решить эту проблему вы можете использовать вызовы дополнительных методов для переопределения заголовка полученного от сервера, если он отличен от text/xml.</p>
<p><code>http_request = new XMLHttpRequest();<br />
http_request.overrideMimeType('text/xml');</code></p>
<p>Далее вам необходимо решить, что вы будете делать после получения ответа сервера. На этом этапе вам необходимо указать объекту, какая JavaScript функция будет обрабатывать ответ. Это делается путем присваивания свойству onreadystatechange имени JavaScript функции, которую вы собираетесь использовать:</p>
<p><code>http_request.onreadystatechange = nameOfTheFunction;</code></p>
<p>Заметьте, что после названия функции нет скобок и не указано параметров, потому что вы просто присваиваете ссылку на функцию, а не вызываете ее. К тому же, вместо указания имени функции, вы можете использовать возможность JavaScript объявлять функции на лету (так называемые «анонимные функции») и указывать действия, которые тотчас же будут обрабатывать ответ:</p>
<p><code>http_request.onreadystatechange = function(){<br />
// какой-нибудь код<br />
};</code></p>
<p>Далее, после того как вы объявили что будет происходить после получения ответа, вам необходимо сделать запрос. Вы должны вызвать методы класса open() и send():</p>
<p><code>http_request.open('GET', 'http://www.example.org/some.file', true);<br />
http_request.send(null);</code></p>
<p>* Первый параметр вызова функции open() — метод запроса HTTP (GET, POST, HEAD или любой другой метод, который вы хотите использовать). Используйте методы в соответствии с HTTP стандартами; иначе некоторые броузеры (такие как Firefox) могут не обработать запрос. Информация о допустимых HTTP запросах доступна по адресу спецификации <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html" target="_blank">W3C</a><br />
* Второй параметр — URL запрашиваемой страницы. Из соображений безопасности вы не можете запрашивать страницы сторонних доменов. Убедитесь, что вы используете одинаковое доменное имя на всех страницах, иначе вы получите ошибку 'доступ запрещен' при вызове функции open(). Типичной ошибкой при доступе к сайту через site.ru является подача запросов на <a href='www.site.ru.'>www.site.ru.</a><br />
* Третий параметр указывает, является ли запрос асинхронным. Если он TRUE, то выполнение JavaScript продолжится во время ожидания ответа сервера. В этом и заключается асинхронность технологии.</p>
<p>Параметром метода send() могут быть любые данные, которые вы хотите послать на сервер. Данные должны быть сформированы в строку запроса:</p>
<p><code>name=value&amp;anothername=othervalue&amp;so=on</code></p>
<p>Заметьте, что если вы хотите отправить данные методом POST, вы должны изменить MIME-тип запроса с помощью следующей строки:</p>
<p><code>http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');</code></p>
<p>Иначе сервер проигнорирует данные отправленные методом POST.</p>
<p><strong> Шаг 2 — Обрабатываем HTTP ответ</strong></p>
<p>Отправляя запрос, вы указали имя функции JavaScript, обрабатывающей ответ.</p>
<p><code>http_request.onreadystatechange = nameOfTheFunction;</code></p>
<p>Давайте посмотрим, что эта функция должна делать. Во-первых, функция должна проверять статус запроса. Если значение переменной статуса 4, то это означает, что ответ от сервера получен и его можно обрабатывать.</p>
<p><code>if (http_request.readyState == 4) {<br />
// все в порядке, ответ получен<br />
} else {<br />
// все еще не готово<br />
}</code></p>
<p>Полный список значений кодов readyState такой:</p>
<p>* 0 (uninitialized)<br />
* 1 (loading)<br />
* 2 (loaded)<br />
* 3 (interactive)<br />
* 4 (complete)</p>
<p><a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp" target="_blank">(Источник)</a></p>
<p>Следующее, что нужно проверить — это статус HTTP-ответа. Все возможные коды можно посмотреть на <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" target="_blank">сайте W3C</a>. Для наших целей нам интересен только код ответа 200 OK.</p>
<p><code>if (http_request.status == 200) {<br />
// великолепно!<br />
} else {<br />
// с запросом возникли проблемы,<br />
// например, ответ может быть 404 (Не найдено)<br />
// или 500 (Внутренняя ошибка сервера)<br />
}</code></p>
<p>Теперь, после проверки состояния запроса и статуса HTTP-ответа, вы можете делать с данными, полученными от сервера, все что угодно. Есть два способа получить доступ к данным:</p>
<p>* http_request.responseText – возвращает ответ сервера в виде строки текста.<br />
* http_request.responseXML – возвращает ответ сервера в виде объекта XMLDocument, который вы можете обходить используя функции JavaScript DOM</p>
<p><strong>Шаг 3 — Простой пример</strong></p>
<p>Давайте соберем все вместе и сделаем простой пример HTTP-запроса. Наш JavaScript запросит HTML документ test.html, который содержит текст "I'm a test." и выведет содержимое файла в диалоговом окне.</p>
<p><code><br />
&lt;script type="text/javascript" language="javascript"&gt;<br />
function makeRequest(url) {<br />
var http_request = false;<br />
if (window.XMLHttpRequest) { // Mozilla, Safari, ...<br />
http_request = new XMLHttpRequest();<br />
if (http_request.overrideMimeType) {<br />
http_request.overrideMimeType('text/xml');<br />
// Читайте ниже об этой строке<br />
}<br />
} else if (window.ActiveXObject) { // IE<br />
try {<br />
http_request = new ActiveXObject("Msxml2.XMLHTTP");<br />
} catch (e) {<br />
try {<br />
http_request = new ActiveXObject("Microsoft.XMLHTTP");<br />
} catch (e) {}<br />
}<br />
}<br />
if (!http_request) {<br />
alert('Не вышло <img src='http://www.ajaxa.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Невозможно создать экземпляр класса XMLHTTP ');<br />
return false;<br />
}<br />
http_request.onreadystatechange = function() { alertContents(http_request); };<br />
http_request.open('GET', url, true);<br />
http_request.send(null);<br />
}<br />
function alertContents(http_request) {<br />
if (http_request.readyState == 4) {<br />
if (http_request.status == 200) {<br />
alert(http_request.responseText);<br />
} else {<br />
alert('С запросом возникла проблема.');<br />
}<br />
}<br />
}<br />
&lt;/script&gt;<br />
&lt;span<br />
style="cursor: pointer; text-decoration: underline"<br />
onclick="makeRequest('test.html')"&gt;<br />
Сделать запрос<br />
&lt;/span&gt;<br />
</code><br />
В этом примере:</p>
<p>* Пользователь нажимает на ссылку "Сделать запрос" в броузере;<br />
* Это вызывает функцию makeRequest() с параметром test.html — именем HTML файла;<br />
* Посылается запрос, после чего (onreadystatechange) выполнение передается alertContents();<br />
* alertContents() проверяет получен ли ответ и все ли с ним в порядке, после чего содержимое файла test.html выводится в диалоговом окне.</p>
<p>Вы можете попробовать пример в действии <a href="http://www.w3clubs.com/mozdev/httprequest_test.html" target="_blank">здесь</a>, а сам тестовый файл можно посмотреть <a href="http://www.w3clubs.com/mozdev/test.html" target="_blank">здесь</a>.</p>
<p>Замечание: Строка http_request.overrideMimeType('text/xml'); вызовет ошибки в консоли JavaScript в Firefox 1.5 или более позднем, как описано в <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=311724" target="_blank">https://bugzilla.mozilla.org/show_bug.cgi?id=311724</a>, если страница вызванная с помощью XMLHttpRequest не является правильным XML (например, если это обычный текст). На самом деле это корректное поведение.</p>
<p>Замечание 2: Если вы посылаете запрос не на статический XML-файл, а на серверный скрипт, возвращающий XML, то нужно установить некоторые заголовки ответа, если вы планируете сделать вашу страницу работоспособной в Internet Explorer помимо Mozilla. Если вы не установите заголовок Content-Type: application/xml, IE будет сообщать об ошибке JavaScript, 'Object Expected', после строки, где вы пытаетесь получить доступ к XML элементу. Если вы не установите заголовок Cache-Control: no-cache броузер будет кэшировать ответ и никогда не будет повторно отправлять запрос, что сделает отладку весьма «забавной».</p>
<p>Замечание 3: Если переменная http_request используется глобально, то конкурирующие функции, вызывающие makeRequest() могут конкурировать друг с другом, вызывая состязания. Объявление переменной http_request локально в функции и передача ее в alertContent() предотвращает состязания.</p>
<p>Замечание 4: При привязывании функции обратного вызова к onreadystatechange нельзя указывать аргументов. По этой причине не работает следующий код:</p>
<p><code>http_request.onreadystatechange = alertContents(http_request); // (не работает)</code></p>
<p>Таким образом, для успешной регистрации функции, вы должны передать ей аргументы косвенно через анонимную функцию или используя http_request как глобальную переменную. Вот пример:</p>
<p><code>http_request.onreadystatechange = function() { alertContents(http_request); };  //1 (одновременный запрос)<br />
http_request.onreadystatechange = alertContents;  //2 (глобальная переменная)</code></p>
<p>Первый способ позволяет делать несколько запросов одновременно, а второй используется, когда переменная http_request является глобальной.</p>
<p>Замечание 5: В случае ошибки взаимодействия (например, если сервер упал), при попытке доступа к переменной .status метода onreadystatechange будет сгенерировано исключение. Убедитесь, что if...then заключено в try...catch. (См. <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=238559" target="_blank">https://bugzilla.mozilla.org/show_bug.cgi?id=238559</a>).</p>
<p><code>function alertContents(http_request) {<br />
try {<br />
if (http_request.readyState == 4) {<br />
if (http_request.status == 200) {<br />
alert(http_request.responseText);<br />
} else {<br />
alert('С запросом возникла проблема.');<br />
}<br />
}<br />
}<br />
catch( e ) {<br />
alert('Произошло исключение: ' + e.description);<br />
}<br />
}<br />
&lt;strong&gt;Шаг 4 — Работа с XML ответом&lt;/strong&gt;<br />
</code><br />
В предыдущем примере, после того как был получен ответ на HTTP-запрос мы использовали responseText запрашиваемого объекта, который содержал данные файла test.html. Теперь давайте попробуем использовать свойство responseXML.</p>
<p>Прежде всего, давайте создадим правильный XML документ, который мы будем запрашивать. Документ (test.xml) содержит следующее:</p>
<p><code>&lt; ?xml version="1.0" ?&gt;<br />
<root><br />
I'm a test.<br />
</root></code></p>
<p>В скрипте нам всего лишь необходимо заменить строку запроса на:</p>
<p><code>...<br />
onclick="makeRequest('test.xml')"&gt;<br />
...</code></p>
<p>Далее в alertContents() нам нужно заменить строку alert(http_request.responseText); на:</p>
<p><code>var xmldoc = http_request.responseXML;<br />
var root_node = xmldoc.getElementsByTagName('root').item(0);<br />
alert(root_node.firstChild.data);</code></p>
<p>Этот код берет объект XMLDocument, возвращаемый responseXML и использует методы DOM для доступа к данным, содержащимся в документе XML. Посмотреть test.xml можно <a href="http://www.w3clubs.com/mozdev/test.xml" target="_blank">здесь</a>, а обновленный скрипт <a href="http://www.w3clubs.com/mozdev/httprequest_test_xml.html" target="_blank">здесь</a>.</p>
<p>Чтобы узнать больше о методах DOM, посмотрите <a href="http://www.mozilla.org/docs/dom/" target="_blank">реализация DOM в Mozilla</a>.</p>
<p>Источник: <a href='http://developer.mozilla.org'>http://developer.mozilla.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/03/30/ajax-s-chego-nachat/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Как заставить AJAX читать между строк</title>
		<link>http://www.ajaxa.net/2007/03/24/kak-zastavit-ajax-chitat-mezhdu-strok/</link>
		<comments>http://www.ajaxa.net/2007/03/24/kak-zastavit-ajax-chitat-mezhdu-strok/#comments</comments>
		<pubDate>Sat, 24 Mar 2007 13:57:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Разное]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/03/24/kak-zastavit-ajax-chitat-mezhdu-strok/</guid>
		<description><![CDATA[Дмитрий Шейко
ведущий программист Red Graphic Systems
На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать [...]]]></description>
			<content:encoded><![CDATA[<p>Дмитрий Шейко<br />
ведущий программист Red Graphic Systems</p>
<p>На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать по ним и получать окно с контекстной подсказкой. Это подход достаточно неуклюжий, он отнимает у пользователя слишком много времени - на то, чтобы кликнуть по ссылке, дождаться загрузки окна и затем закрыть окно. В эпоху AJAX мы можем быть ближе к пожеланиям пользователей. Мы можем сделать так, чтобы уже при наведении мыши на термин незамедлительно появлялось сообщение с подсказкой и как только курсор мыши сдвинут с термина, сообщение исчезало. Наличие этого сервиса не отразится на объеме страниц сайта. При запросе контекстной подсказки Java Script будет обращаться к внешнему словарю, получать содержание и отображать его.<br />
<span id="more-70"></span><br />
Метод получения информации по неявному запросу может найти применение не только в словаре терминов. Обращали ли вы внимание на ссылки с двойным подчеркиванием в таких проектах как hotscripts.com и devarticles.com? Это контекстная реклама на основе движка IntelliTXT компании Vibrant Media. При наведении курсора мыши на подобную ссылку появляется окно с рекламным предложением на соответствующую тему. Эта технология уже получила название in-text advertising.</p>
<p>Все чаще и чаще подобный метод применяется и на новостных порталах. Посетители видят на главной странице портала лишь заголовки новостей. Однако при наведении курсора мыши на заголовок новости они получают ее краткое описание. Таким образом, на главной странице портала можно вместить куда как больше новостей. Посетитель портала увидит заголовки и для того, чтобы получить анонсы новостей, ему будет достаточно пробежаться курсором мыши по заголовкам.</p>
<p>Давайте теперь рассмотрим, каким образом реализуется контекстная подсказка с помощью AJAX. Программисту, освоившему этот метод, не составит труда заставить портал комментировать новости по запросу или же написать модуль in-text advertising.</p>
<p>Итак, очевидно нам следует позаботиться об окне сообщения, того самого, которое будет появляться каждый раз, когда посетитель наводит курсор на термин. Для того, чтобы окно появлялось и исчезало мгновенно, следует поместить его на скрытом DIV.</p>
<p><code><br />
&lt;div id="InstantMessage" class="instant_message"&gt; &lt;/div&gt;<br />
</code><br />
Для простоты эксперимента мы можем оформить его в стиле системных сообщений MS Windows.</p>
<p><code><br />
&lt;style&gt;<br />
.instant_message { padding: 5px; font-size: 12px; font-family: Arial; visibility: hidden;<br />
position: absolute; width: 240px; border: outset 2px #FFFFFF; background: #D4D0C8}<br />
.instant_message a { width: 240px; padding: 2px 17px; color: black; text-decoration: none;<br />
cursor: default}<br />
.instant_message a:hover {color: #ffffff; background: #0A246A}<br />
&lt;/style &gt;<br />
</code></p>
<p>Окно должно появиться в тот момент, когда посетитель навел курсор мыши на термин и исчезнуть, когда курсор мыши будет за пределами термина. Причем, в тот самый момент окно должно содержать уже не пробел, а текст определения термина. Таким образом, мы должны поместить термины в тексте документа в inline тег, поддерживающий события onMouseOver и onMouseOut. Первому событию следует назначить функцию JavaScript, которая получит определение термина, поместит его в окно сообщения и покажет окно. Второму событию требуется назначить функцию, которая просто скроет окно сообщения.</p>
<p><code><br />
&lt;a onmouseover="getDefinition('термин', event);"<br />
onmouseout="hideMessage();"&gt;термин&lt;/a&gt;<br />
</code></p>
<p>В параметре функции, отображающей окно (getDefenition) сообщения надо указать термин. Этот термин будет использован для запроса текста определения посредством AJAX. Так как при показе окна нам потребуется его позиционировать под курсором мыши для поддержки Gecko-базированых браузеров, в эту функцию также следует передать параметр event. Функция для сокрытия окна (hideMessage) не требует каких-либо параметров.</p>
<p>Теперь наша задача - при вызове функции getDefinition заставить JavaScript позиционировать окно сообщения.</p>
<p><code>function adjustMessage(evt) {<br />
MessageObj = document.getElementById('InstantMessage');<br />
if (isThisMozilla) event=evt;<br />
var rightedge = document.body.clientWidth-event.clientX;<br />
var bottomedge = document.body.clientHeight-event.clientY;<br />
if (rightedge &lt; MessageObj.offsetWidth)<br />
MessageObj.style.left = document.body.scrollLeft +<br />
event.clientX - MessageObj.offsetWidth;<br />
else<br />
MessageObj.style.left = document.body.scrollLeft + event.clientX;<br />
if (bottomedge &lt; MessageObj.offsetHeight)<br />
MessageObj.style.top = document.body.scrollTop + event.clientY -<br />
MessageObj.offsetHeight;<br />
else<br />
MessageObj.style.top = document.body.scrollTop + event.clientY;<br />
MessageObj.innerHTML = 'Loading...';<br />
MessageObj.style.visibility = "visible";<br />
}<br />
</code><br />
Итак, мы имеем окно сообщения, рапортующее о загрузке данных. Теперь следует выполнить запрос к контроллеру за определением термина. Вы можете написать собственные функции для обслуживания AJAX запросов. Но если вы только начинаете работать с AJAX, я могу порекомендовать вам готовую библиотеку от Yahoo. В этом случае запрос будет выглядеть так:</p>
<p><code><br />
function getDefinition(term,evt){<br />
adjustMessage(evt);<br />
var request = YAHOO.util.Connect.asyncRequest('POST',<br />
'http://адрес_контроллера', callback, 'term='+term);<br />
}<br />
</code></p>
<p>Раз мы запрашиваем контроллер, очевидно, нам надлежит его написать. В общем случае, это самая простая часть. Задача контроллера - вернуть описание термина, переданного в POST. Каким бы языком программирования мы не пользовались при написании контроллера, нам достаточно выполнить несколько простейших операций.</p>
<p>* соединиться с базой данных<br />
* выполнить SQL запрос для получения определения термина<br />
* отобразить на консоль результат в следующем виде:</p>
<p><code>     {<br />
"errormsg" : "в случае ошибки ее код",<br />
"content" : "текст определения"<br />
}</code></p>
<p>Это структура данных, известная как JSON. Она воспринимается JavaScript в явном виде, как &lt; родная&gt;. В случае использования AJAX-библиотеки YAHOO ответ контроллера обслуживается следующей конструкцией</p>
<p><code>var handleSuccess = function(o){<br />
if(o.responseText !== undefined){<br />
showMessage(o.responseText);<br />
}<br />
};<br />
var handleFailure = function(o){<br />
if(o.responseText !== undefined){<br />
showMessage("Connection Error");<br />
}<br />
};<br />
var callback =<br />
{<br />
success:handleSuccess,<br />
failure:handleFailure,<br />
argument:['foo','bar']<br />
};<br />
</code><br />
Нам осталось лишь описать функцию showMessage(), которая помещает принятый текст определения в окно сообщения<br />
<code>function showMessage(json) {<br />
var respondStructure = eval( '(' + json + ')' );<br />
MessageObj.innerHTML = respondStructure.content;<br />
return false;<br />
}</code></p>
<p>Как вы понимаете, для сокрытия окна сообщения потребуется лишь изменить атрибут объекта</p>
<p><code>function hideMessage(){<br />
var MessageObj=document.getElementById('InstantMessage');<br />
MessageObj.style.visibility="hidden";<br />
}</code></p>
<p>Когда вы будете опробовать этот пример, едва ли вы встретитесь с проблемами под браузером MS IE, однако, в FireFox вы можете обнаружить мерцание окна сообщения. Это связано с тем, что FireFox своеобразно обслуживает события onMouseOver/onMouseOut. Впрочем, эту проблему можно решить путем расстановки флагов задержки в функциях обслуживания этих событий.</p>
<p>Скрипты приведенного здесь примера можно загрузить здесь</p>
<p>Работу примера можно увидеть здесь <a href='http://www.phpclasses.org/browse/package/3505.html'>http://www.phpclasses.org/browse/package/3505.html</a><br />
Информация об авторе.</p>
<p>Дмитрий Шейко</p>
<p><a href='http://www.cmsdevelopment.com'>http://www.cmsdevelopment.com</a></p>
<p>Ведущий программист Red Graphic Systems</p>
<p>Занят разработкой программного обеспечения с 1987 года. Начиная с 1998 года опубликовал более 50 технических статей в специализированных изданиях. С 2001 года разрабатывает архитектурные решения и инструментальные средства для управления содержанием (Content Management, CMF, ECM). В 2004 году разработал и опубликовал спецификацию универсального языка для разработчиков CMS XML Sapiens</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/03/24/kak-zastavit-ajax-chitat-mezhdu-strok/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Google ajax search</title>
		<link>http://www.ajaxa.net/2007/02/25/google-ajax-search/</link>
		<comments>http://www.ajaxa.net/2007/02/25/google-ajax-search/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 03:48:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax это просто]]></category>
		<category><![CDATA[Полезное]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/02/25/google-ajax-search/</guid>
		<description><![CDATA[Используя плагин для wordpress, вы можете добавить поиск на ajax в гугле, но вообще встраивается в любой сайт. Скачать плагин можно здесь.
Установка:

Скачайте плагин и разархивируйте его.
Закачайте файл Google-AJAX-Search.php в папку wp-content/plugins/
В админ. панели активируйте плагин Google Ajax Search
После активации появятся настройки переходим к ним:


Получите API key здесь http://code.google.com/apis/ajaxsearch/signup.html
Настройте остальные параметры

5.  Вставьте в шаблон wp [...]]]></description>
			<content:encoded><![CDATA[<p>Используя плагин для wordpress, вы можете добавить поиск на ajax в гугле, но вообще встраивается в любой сайт. Скачать плагин можно <a href="http://code.google.com/p/google-ajax-search-wordpress-plugin/downloads/list" target="_blank">здесь.</a></p>
<p>Установка:</p>
<ol>
<li>Скачайте плагин и разархивируйте его.</li>
<li>Закачайте файл Google-AJAX-Search.php в папку wp-content/plugins/</li>
<li>В админ. панели активируйте плагин Google Ajax Search</li>
<li>После активации появятся настройки переходим к ним:</li>
</ol>
<ul>
<li>Получите API key здесь <a href="http://code.google.com/apis/ajaxsearch/signup.html">http://code.google.com/apis/ajaxsearch/signup.html</a></li>
<li>Настройте остальные параметры</li>
</ul>
<p>5.  Вставьте в шаблон wp этот код &lt;?php gajaxsearch(); ?&gt;, обычно можно использовать sidebar.</p>
<p>Пример поиска можно увидеть в боковой панели.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/02/25/google-ajax-search/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Графики реального времени</title>
		<link>http://www.ajaxa.net/2007/02/20/grafiki-realnogo-vremeni/</link>
		<comments>http://www.ajaxa.net/2007/02/20/grafiki-realnogo-vremeni/#comments</comments>
		<pubDate>Tue, 20 Feb 2007 07:15:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax это просто]]></category>
		<category><![CDATA[Найденное в сети]]></category>
		<category><![CDATA[Полезное]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/02/20/grafiki-realnogo-vremeni/</guid>
		<description><![CDATA[Нашёл скрипт, который может генерировать графики. Генерирует он в формате Adobe SVG, так что может не работать под вашим браузером. Для примера вот здесь вы можете нарисовать диаграмму, выбрав стиль (линейный, круговой, столбчатый), а также цвет, чтобы добавить новое значение нажмите add new row, а чтобы значение перерисовались надо нажать redraw. Вот ещё примеры графиков, [...]]]></description>
			<content:encoded><![CDATA[<p>Нашёл скрипт, который может <a href="http://www.liquidx.net/plotkit/" target="_blank">генерировать графики</a>. Генерирует он в формате Adobe SVG, так что может не работать под вашим браузером. Для примера вот <a href="http://media.liquidx.net/js/plotkit-tests/dynamic.html" target="_blank">здесь</a> вы можете нарисовать диаграмму, выбрав стиль (линейный, круговой, столбчатый), а также цвет, чтобы добавить новое значение нажмите add new row, а чтобы значение перерисовались надо нажать redraw. Вот ещё <a href="http://media.liquidx.net/js/plotkit-tests/svg-sweet.html" target="_blank">примеры графиков</a>, генерируемых скриптом. Довольно неплохо можно это применить, например, для показа <a href="http://stats.liquidx.net/" target="_blank">статистики сайта</a>, как это у них сделано. Скачать все исходники можно <a href="http://media.liquidx.net/static/plotkit/plotkit-0.9.1.zip" target="_blank">здесь.</a>  Также можно <a href="http://media.liquidx.net/js/plotkit-doc/PlotKit.html" target="_blank">ознакомится с полной документацией</a> или же <a href="http://media.liquidx.net/js/plotkit-doc/PlotKit.QuickStart.html" target="_blank">узнать всё по-быстрому.</a></p>
<p>Требования: <a href="http://www.mochikit.com/" target="_blank">MochiKit 1.3 и выше</a>,</p>
<p>HTML Canvas: Safari 2+, Opera 9+, Firefox 1.5+, IE 6</p>
<p>SVG: Opera 9+, Firefox 1.5+ (примечание), IE6 с Adobe SVG</p>
<p>Примечание: В Firefox 1.5+ на Linux и Windows поддерживается, в Firefox 1.5+ на Mac не прорисовывается SVG.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/02/20/grafiki-realnogo-vremeni/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Серые&#8221; коробки</title>
		<link>http://www.ajaxa.net/2007/02/20/seryie-korobki/</link>
		<comments>http://www.ajaxa.net/2007/02/20/seryie-korobki/#comments</comments>
		<pubDate>Tue, 20 Feb 2007 06:11:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ajax и php]]></category>
		<category><![CDATA[Ajax это просто]]></category>
		<category><![CDATA[Полезное]]></category>
		<category><![CDATA[Уроки и примеры]]></category>

		<guid isPermaLink="false">http://www.ajaxa.net/2007/02/20/seryie-korobki/</guid>
		<description><![CDATA[Именно такое название у такой штуки как GreyBox. Это открывающиеся окна в любом размере. Также может использоваться для открытия и пролистывания картинок, для мини-галереи. Пример можно посмотреть всё на той же странице, нажав на ссылку “Launch google.com in a 500x500 center window” (у нас откроется окно с размером 500 на 500) или кликнув на картинку [...]]]></description>
			<content:encoded><![CDATA[<p>Именно такое название у такой штуки как <a href="http://orangoo.com/labs/GreyBox/" target="_blank">GreyBox</a>. Это открывающиеся окна в любом размере. Также может использоваться для открытия и пролистывания картинок, для мини-галереи. Пример можно посмотреть всё на той же странице, нажав на ссылку “Launch google.com in a 500x500 center window” (у нас откроется окно с размером 500 на 500) или кликнув на картинку чуть ниже. Чем же удобна это штука? </p>
<p>– Показывать внутренние страницы</p>
<p>– Создавать загрузку файлов</p>
<p>– Создавать окна для входа на сайт, такие как настройка, контакты и т.п.</p>
<p>– Показывать/прослушивать видео, аудио файлы</p>
<p>Какие браузеры поддерживает:</p>
<p>Safari <br />Firefox 1.5 и выше<br />Internet Explorer 5.5 и выше<br />Opera 8.5 и выше</p>
<p><a href="http://orangoo.com/labs/uploads/GreyBox_v5_40.zip" target="_blank">Скачать напрямую</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajaxa.net/2007/02/20/seryie-korobki/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
