<?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>AllAJAX.ru &#187; Статьи</title>
	<atom:link href="http://allajax.ru/category/article/feed/" rel="self" type="application/rss+xml" />
	<link>http://allajax.ru</link>
	<description></description>
	<lastBuildDate>Wed, 31 Aug 2011 02:16:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Делаем голосование (+/-) на AJAX</title>
		<link>http://allajax.ru/article/delaem-golosovanie-na-ajax/</link>
		<comments>http://allajax.ru/article/delaem-golosovanie-na-ajax/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 02:16:08 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/?p=440</guid>
		<description><![CDATA[
Суть использования AJAX заключается в передаче данных на сервер без перезагрузки страницы - что очень удобно для пользователей. Сегодня мы напишем простейший пример использования этого в виде digg-like голосования, без использования js-фреймворков (библиотек типа jQuery или MooTools). Это теоретическая статья для желающих ознакомиться с технологией AJAX, для прикладного использования существуют готовые скрипты и плагины.
Структура такова: [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://allajax.ru/wp-content/uploads/2011/08/vote.gif" alt="vote" title="vote" width="340" height="60" class="alignleft size-full wp-image-444" /></p>
<p>Суть использования AJAX заключается в передаче данных на сервер без перезагрузки страницы - что очень удобно для пользователей. Сегодня мы напишем простейший пример использования этого в виде digg-like голосования, без использования js-фреймворков (библиотек типа jQuery или MooTools). Это теоретическая статья для желающих ознакомиться с технологией AJAX, для прикладного использования существуют готовые скрипты и плагины.</p>
<p>Структура такова: на странице есть множество объектов с уникальным id (например, список постов). Для каждого из них нужно показать текущее количество голосов, а так же ссылки для голосвания за или против. При голосовании на сервер отправляется информация об id и типе голоса, данные добавляются в базу, высчитывается новый рейтинг и данные отправляются обратно на страницу, обновляя рейтинг (естественно, без перезагрузки страницы). </p>
<p><span id="more-440"></span></p>
<p>Начнем с основной функцией, реализующей асинхронную передачу данных (в разных источниках она выглдяит по разному и не всегда работает):</p>
<pre><code>
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp &#038;& typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}
</code></pre>
<p>Я не буду останавливаться на подробном разборе этой функции, это не так уж важно, главное что она работает.</p>
<p>HTML-код, 17 - идентификатор объекта:</p>
<pre><code>&lt;div&gt;
&lt;a href="#" onclick="vote('rulez','17')"&gt;плюс&lt;/a&gt;
&lt;div id=votestatus17&gt; 0 &lt;/div&gt;
&lt;a href="#" onclick="vote('sux','17')"&gt;минус&lt;/a&gt;
&lt;/div&gt;
</code></pre>
<p>Две ссылки для голосвания, хотя можно реализовать их как угодно - кнопками, картинками, главное сделать вызов нашей js-функции. В блоке votestatus[id] отображается текущий рейтинг и впоследствии обновленный (а так же статус загрузки).</p>
<p>А вот и основная функция, реализующая голосование:</p>
<pre><code>
function vote(type,id){
var req = getXmlHttp()  

req.onreadystatechange = function() {
	if (req.readyState == 4) {
	if(req.status == 200) {
document.getElementById('votestatus'  + id).innerHTML = req.responseText;
	}
	}

	}

req.open('GET', 'vote.php?type='+type+'&#038;id=' + id, true);
req.send(null);
document.getElementById('votestatus'  + id).innerHTML = 'загрузка...';
}
</code></pre>
<p>Читаем код с конца <img src='http://allajax.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Как только функция вызывается, на место текущего рейтинга помещается заглушка (можно вставить gif-картинку к примеру). Данные отправляются скрипту vote.php через GET параметры, а как только запрос выполнится - отправляет на страницу возвращенный скриптом ответ.</p>
<p>Сам скрипт vote.php индивидуален, но к примеру он может быть таким:</p>
<pre><code>
&lt;?
$type=$_GET['type'];
$id=$_GET['id'];

/*
//Обновляем рейтинг в базе
if($type=="rulez") mysql_query("UPDATE posts SET votes=votes+1 WHERE id='$id'");
if($type=="sux") mysql_query("UPDATE posts SET votes=votes-1 WHERE id='$id'");

//Получаем новый рейтинг и выводим его
$row=mysql_fetch_array(mysql_query("SELECT votes FROM posts WHERE id='$id'"));
echo $row['votes'];
*/

//А чтобы тестовый пример работал
echo rand(1,10);
?&gt;
</code></pre>
<p>Естественно, сюда стоит добавить защиту от накрутки (по IP), красиво оформить кнопки голосования, блокировать (или просто скрывать) их после нажатия и т.д., но это выходит за рамки статьи.</p>
<p><noindex><a href="http://allajax.ru/demo/vote/">Демо</a></noindex></p>
<p>Вот в принципе и всё <img src='http://allajax.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div align=right>Автор: <noindex><a href="http://spryt.ru/">Андрей «Spryt» Гиацинтов</a></noindex>, специально для сайта <noindex><a href="http://allajax.ru/">AllAJAX.ru</a></noindex></div>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/delaem-golosovanie-na-ajax/feed/</wfw:commentRss>
		<slash:comments>56</slash:comments>
		</item>
		<item>
		<title>Показ/Скрытие блока</title>
		<link>http://allajax.ru/article/pokazskrytie-bloka/</link>
		<comments>http://allajax.ru/article/pokazskrytie-bloka/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 05:05:12 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/?p=428</guid>
		<description><![CDATA[Начнем с простых примеров использования javascript в работе сайта, а именно - показ и скрытие блока. К примеру, формы ответа внизу каждого комментария на странице.
Допустим, у нас есть блок данных, который нужно показать только по клику по ссылке:
&#60;div id="hidden_content" style="display: none;"&#62;скрытый контент&#60;/div&#62;
Первый способ: jQuery
Очень простой и функциональный способ, однако придется подключать дополнительную библиотеку.
&#60;a onclick="$('div#hidden_content').slideToggle('slow')"&#62;Показать/Скрыть блок&#60;/a&#62;
В [...]]]></description>
			<content:encoded><![CDATA[<p>Начнем с простых примеров использования javascript в работе сайта, а именно - показ и скрытие блока. К примеру, формы ответа внизу каждого комментария на странице.</p>
<p>Допустим, у нас есть блок данных, который нужно показать только по клику по ссылке:</p>
<p><code>&lt;div id="hidden_content" style="display: none;"&gt;скрытый контент&lt;/div&gt;</code></p>
<p><strong>Первый способ: jQuery</strong><br />
Очень простой и функциональный способ, однако придется подключать дополнительную библиотеку.</p>
<p><code>&lt;a onclick="$('div#hidden_content').slideToggle('slow')"&gt;Показать/Скрыть блок&lt;/a&gt;</code></p>
<p>В настройках можно указать скорость появления блока (slow/fast). Повторный клик скрывает блок.</p>
<p>Подробнее можно прочитать в <noindex><a href="http://allajax.ru/wp-content/plugins/kama-clic-counter/count.php?http://api.jquery.com/slideToggle/&428" class="count">документации jQuery</a></noindex> <span class="hitcounter">(кликов:415)</span>.</p>
<p><strong>Второй способ: чистый JavaScript</strong><br />
Занимает меньше места, однако не так функционален.<br />
<code>&lt;script language="javascript" type="text/javascript"&gt;<br />
function toggle(el) {<br />
  el.style.display = (el.style.display == 'none') ? '' : 'none'<br />
}<br />
&lt;/script&gt;<br />
</code></p>
<p>И непосредственно сама ссылка:</p>
<p><code>&lt;a onclick="toggle(hidden_content)"&gt;Показать/Скрыть блок&lt;/a&gt;</code></p>
<p>Использовать можно любой способ, хотя второй более грубый и непредсказуемый.</p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/pokazskrytie-bloka/feed/</wfw:commentRss>
		<slash:comments>56</slash:comments>
		</item>
		<item>
		<title>Практический AJAX: что делать с закладками</title>
		<link>http://allajax.ru/article/prakticheskij-ajax-chto-delat-s-zakladkami/</link>
		<comments>http://allajax.ru/article/prakticheskij-ajax-chto-delat-s-zakladkami/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 15:25:39 +0000</pubDate>
		<dc:creator>pollux</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/prakticheskij-ajax-chto-delat-s-zakladkami/</guid>
		<description><![CDATA[Суть проблемы
В предыдущей статье, «Что делать с кнопкой «назад» в браузерах» вводились такие понятия, как «горизонтальные» и «вертикальные» ссылки. Если вы не читали ее, пожалуйста, ознакомьтесь перед дальнейшим изучением этой.
Итак, вертикальные ссылки не только делают несостоятельной кнопку «назад» в браузерах, но и возможность браузера сохранить ссылку на данную страницу в закладках. Это очень похоже на [...]]]></description>
			<content:encoded><![CDATA[<p>Суть проблемы<br />
В предыдущей статье, «Что делать с кнопкой «назад» в браузерах» вводились такие понятия, как «горизонтальные» и «вертикальные» ссылки. Если вы не читали ее, пожалуйста, ознакомьтесь перед дальнейшим изучением этой.<br />
Итак, вертикальные ссылки не только делают несостоятельной кнопку «назад» в браузерах, но и возможность браузера сохранить ссылку на данную страницу в закладках. Это очень похоже на проблему невозможности сохранения HTTP POST запросов тем же способом, что и HTTP GET просто потому, что они не отправляют данные в адресной строке (прим.: имеется в виду, конечно же, «полное» сохранение результатов POST запроса, потому что сейчас большинство таких запросов являются комбинированными, когда на какую-то определенную (GET) строку отправляются POST данные. В таком случае мы можем сохранить только результирующий URL, но никак не те данные, что мы отправили POST'ом на него.)</p>
<p><span id="more-223"></span><br />
Данная проблема затрагивает не только пользователей, которые захотят прийти еще раз к вам на сайт, она также касается больших сложности либо полной невозможности проиндексировать внутренние страницы сайта поисковыми машинами так, чтобы в в результатах поисковых запросов можно было выдавать корректную ссылку на ресурс (прим.: данная проблема очень схожа с проблемой frame'ов, поднимаемой несколько лет назад: поисковые машины замечательно индексировали сайт, но в качестве ссылки выдавали главную страницу, и не всегда было понятно, как же на этом сайте получить ту информацию, за которой пришел. Я считаю, что данная проблема сейчас не актуальна, ибо сами ссылки по сайту прописываются статичными, если при переходе по ним пользователь получается какую- то новую информацию, либо вообще не приписываются, если на них предполагается «повесить» динамические обработчики).<br />
Решение первое: используйте специальную AJAX-библиотеку<br />
В предыдущей статье делался обзор методов, которые позволяют сохранять историю в браузере, часть из них позволяет работать и с закладками.<br />
Прим.: суть решения: при каждом вызове AJAX к URL'у страницы в качестве якоря добавляется флаг, являющийся ключом текущей страницы. При добавлении ее в избранное, страница добавляется вместе с якорем. Затем, при открытии страницы приложение проверяет якорь-флаг и перегружает требуемое содержание.<br />
? Подход Mike Stenhouse'а. Демо-версия предельна проста и работает почти во всех браузерах. Демо-версия этого решения можно посмотреть по этой ссылке и проследить, что происходит с URL'ом страницы, когда вы кликаете по ссылкам, затем сохранить ссылку как закладку. При открытии закладки происходит перегрузка содержание.<br />
? Подход Brad Neuberg'а. Демо-версия. Эта библиотека пытается быть максимально кроссбраузерной без лишнего усложнения кода.<br />
? Подход mikage'а с использованием библиотеки jQuery можно посмотреть здесь.<br />
Использование скрытых iframe'ов в данном случае, как я считаю, совсем не оправдано, ведь в закладки попадает та же основная страница, а не та, которая грузится в iframe. Да и как было справедливо замечено http://bersz.habrahabr.ru/http://bersz.habrahabr.ru/bersz, у некоторых iframe'ы могут автоматически «резаться» как рекламосодержащие.<br />
Чуть дальше поясняется, почему первое решение не всегда подходит.<br />
Решение второе: используйте специальные ссылки<br />
Хотя не существует идеального решения, которое бы обеспечивало пользователя ссылкой на текущую страницу со всеми GET параметрами, можно частично преодолеть эту проблему за счет ухудшения поддержки самой возможности добавлять страницу в закладки. Например, этот подход используется в Google Maps. Если пользователь ищет какой-либо адрес, то URL страницы остается тем же самым (http://maps.google.com), однако при нажатии на ссылку "Link to this page", запрошенный URL преобразуется, чтоб отображать текущее местоположение уже с учетом GET параметров (например, http://maps.google.com/maps?f=q&amp;hl=en&amp;geocode=&amp;q=Moscow&amp;ie=UTF8&amp;z=17&amp;om=1).<br />
Этот подход позволяет, на самом деле, создать горизонтальную интерпретацию вертикальной ссылки, которая бы вела на текущую страницу. При использовании этого решения следует иметь в виду некоторые аспекты:<br />
? предварительное добавление в закладки — этот подход не будет работать, если пользователь добавил данную страницу в закладки перед тем, как кликнул по специальной ссылке (прим.: имеется в виду, наверное, то, что при изменении якоря у страницы браузер не может ее сохранить как новую в закладках, это справедливо для IE, у него не учитывается различие закладок по якорям, однако, в Firefox 2 и Opera 9 каждая страница с другим якорем сохраняется как новая закладка);<br />
? кодирование URL — если данные, описывающие текущее состояние, содержат специальные символы (например, символы табуляции, проценты, амперсанды), они должны быть закодированы (URL encoded), когда создается ссылка для закладки;<br />
? приватные данные — если данные для текущего состояния содержат какую-либо приватную информацию (например, пароль пользователя), не следует их включать в качестве GET параметров строки запроса. (Однако, если данные для текущей страницы содержат приватную информацию, то, в первую очередь, не стоит вообще делать возможным сохранение такой страницы в закладках.)</p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/prakticheskij-ajax-chto-delat-s-zakladkami/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Использование технологии AJAX в ASP.NET посредством Atlas</title>
		<link>http://allajax.ru/article/ispolzovanie-texnologii-ajax-v-aspnet-posredstvom-atlas/</link>
		<comments>http://allajax.ru/article/ispolzovanie-texnologii-ajax-v-aspnet-posredstvom-atlas/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 05:54:06 +0000</pubDate>
		<dc:creator>pollux</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/uncategorized/ispolzovanie-texnologii-ajax-v-aspnet-posredstvom-atlas/</guid>
		<description><![CDATA[AJAX (Asynchronous JavaScript and XML) – это кросс-платформенная технология создания Web-приложений. Данная технология позволяет разработчику выполнять асинхронные запросы к Web-приложениям, используя язык разметки данных XML.
Технология фирмы Microsoft с кодовым именем “Atlas" позволяет использовать AJAX при создании серверных приложений основанных на технологии ASP.NET 2.0.
Данная статья посвящается созданию простейшего Web-приложения, позволяющего динамически на стороне клиента заполнять данными [...]]]></description>
			<content:encoded><![CDATA[<p>AJAX (Asynchronous JavaScript and XML) – это кросс-платформенная технология создания Web-приложений. Данная технология позволяет разработчику выполнять асинхронные запросы к Web-приложениям, используя язык разметки данных XML.<br />
Технология фирмы Microsoft с кодовым именем “Atlas" позволяет использовать AJAX при создании серверных приложений основанных на технологии ASP.NET 2.0.<br />
Данная статья посвящается созданию простейшего Web-приложения, позволяющего динамически на стороне клиента заполнять данными выпадающий список, а также производить динамическую загрузку дополнительной информации из базы данных с использованием технологий ASP.NET 2.0, AJAX и Atlas.</p>
<p><span id="more-222"></span><br />
Для того, чтобы начать работу с технологией Atlas необходимо загрузить соответствующее расширение для Visual Studio 2005. Сделать это можно с сайта фирмы Microsoft (скачать).<br />
После установки данного расширения необходимо создать новый Web проект, выбрав шаблон «ASP.NET ‘Atlas’ Web Site»</p>
<p>После создания базы данных и заполнения ее какими-нибудь данными можно приступать к созданию веб-службы, необходимой для получения информации из базы данных в формате XML.<br />
Для создания веб-службы необходимо выделить в окне «Solution Exploler» созданный проект, и после этого в меню Website выбрать Add New Item. В появившемся окне выбрать шаблон Web Service, ввести имя WebAccess.asmx, и убрать галочку Place code in separate file.</p>
<p>Теперь добавим код нашей веб-службы:</p>
<p>&lt;%@ WebService Language="VB" Class="WebAccess" %&gt;<br />
Imports System.Web<br />
Imports System.Web.Services<br />
Imports System.Web.Services.Protocols<br />
Imports System.Data.SqlClient<br />
Imports System.Collections</p>
<p>_<br />
_<br />
Public Class WebAccess<br />
Inherits System.Web.Services.WebService<br />
Public Structure EmployeeLittleRec 'Структура для отправки данных об<br />
учетных записях<br />
Dim Name As String 'Имя учетной записи<br />
Dim ID As Integer 'Код учетной записи<br />
End Structure</p>
<p>Private Structure EmployeeRec 'Структура для получения дополнительно<br />
информации об учетной записи<br />
Dim Name As String 'Имя учетной записи<br />
Dim Password As String 'Пароль учетной записи<br />
Dim DateBegin As Date 'Дата создания<br />
Dim DateEnd As Date 'Дата удаления<br />
Dim Comments As String 'Комментарии<br />
End Structure<br />
'''<br />
''' Функция получения дополнительно информации по коду учетной записи<br />
'''<br />
'''<br />
Код учетной записи ''' Возвращает HTML код содержащий информацию об учетной<br />
записи<br />
_<br />
Public Function GetFullEmployeeInfo(ByVal IDEmployee As Integer) As<br />
String<br />
Dim Rec As EmployeeRec<br />
Dim ReturnStr As String<br />
Dim con As New SqlConnection("workstation id=Test;packet<br />
size=4096;Data Source=crash;Initial Catalog=WebAccess;user id=sa") 'Создаем<br />
соединение с базой данных<br />
con.Open() 'Открываем соединение (здесь конечно необходимо выполнить<br />
перехват исключений, но данная статья не об этом)<br />
Dim command As New SqlCommand("SELECT * FROM sprEmployee WHERE<br />
IDEmployee=" &amp; CStr(IDEmployee), con) 'Создаем запрос к нашей таблице<br />
Dim dbReader As SqlDataReader<br />
dbReader = command.ExecuteReader() 'Создаем SqlDataReader для чтения<br />
данных из таблицы<br />
If dbReader.Read Then<br />
Rec.Name = CStr(dbReader("Name"))<br />
Rec.Password = CStr(dbReader("Password"))<br />
Rec.DateBegin = CDate(dbReader("DateBegin"))<br />
If Not IsDBNull(dbReader("DateEnd")) Then<br />
Rec.DateEnd = CDate(dbReader("DateEnd"))<br />
Else<br />
Rec.DateEnd = Nothing<br />
End If<br />
Rec.Comments = CStr(dbReader("Comments"))<br />
ReturnStr = String.Format(" Имя: {0}</p>
<p>Пароль: {1}<br />
Дата подключения: {2}<br />
Дата<br />
отключения: {3}<br />
Комментарии: {4}</p>
<p>",Rec.Name, Rec.Password,<br />
Rec.DateBegin, Rec.DateEnd, Rec.Comments) 'Создаем код HTML который сразу же<br />
будет выведен на страницу<br />
Else<br />
ReturnStr = "Ошибка при получении данных" 'Запись не была найдена<br />
End If<br />
con.Close()<br />
con.Dispose()<br />
Return ReturnStr<br />
End Function<br />
'''<br />
''' Функция необходимая для получения списка учетных записей<br />
'''<br />
'''<br />
Максимальное количество записей ''' Массив с информацией о записях<br />
Public Function GetEmployee(ByVal Count As Integer) As<br />
Generic.List(Of EmployeeLittleRec)<br />
Dim sql As String<br />
Dim ListRec As New Generic.List(Of EmployeeLittleRec) 'Создаем массив<br />
Dim OneRec As EmployeeLittleRec<br />
Dim ReturnStr As String = ""<br />
Dim con As New SqlConnection("workstation id=Test;packet<br />
size=4096;Data Source=crash;Initial Catalog=WebAccess;user id=sa")<br />
con.Open() 'Соединяемся с базой данных<br />
Dim command As SqlCommand<br />
If Count &gt; 0 Then 'Проверяем установлено ли количество выводимых записей<br />
sql = String.Format("SELECT TOP {0} IDEmployee,Name FROM<br />
sprEmployee", Count)<br />
Else<br />
sql = "SELECT IDEmployee,Name FROM sprEmployee"<br />
End If<br />
command = New SqlCommand(sql, con)<br />
Dim dbReader As SqlDataReader<br />
dbReader = command.ExecuteReader<br />
Do Until Not dbReader.Read 'Заполняем массив учетных записей<br />
OneRec.ID = dbReader("IDEmployee")<br />
OneRec.Name = dbReader("Name")<br />
ListRec.Add(OneRec)<br />
Loop<br />
con.Close()<br />
con.Dispose()<br />
Return ListRec 'Возвращаем массив<br />
End Function<br />
End ClassТеперь приступим к созданию веб-страницы для доступа к информации об учетных записях. Для этого, выделив в окне «Solution Exploler» созданный проект и выбрав в меню Website пункт Add New Item, задаем соответствующие параметры создаваемой странице</p>
<p>Шаблон – Web Form.<br />
Name - AtlasDropDown.aspx.<br />
Галочка Place code in separate file – снята</p>
<p>После создания веб-формы введем в нее код, необходимый для ее работы</p>
<p>&lt;%@ Page Language="VB" %&gt;</p>
<p>//</p>
<form> &lt;%--Объявляем объекты Atlas--%&gt;&lt;%--Объявляем ссылку на нашу веб-службу--%&gt;</p>
<p>Type="text/javascript" /&gt;</p>
<p>&lt;%--Создаем объект для отображения загрузки--%&gt;</p>
<h2> <strong>Идет<br />
получение данных</strong></h2>
<p>onclick="return bttnLoadToDropDown_onclick()" /&gt;</p>
</form>
<p>Теперь запустим созданный проект на выполнение.</p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/ispolzovanie-texnologii-ajax-v-aspnet-posredstvom-atlas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Легкий AJAX в массы</title>
		<link>http://allajax.ru/article/legkij-ajax-v-massy/</link>
		<comments>http://allajax.ru/article/legkij-ajax-v-massy/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 01:07:04 +0000</pubDate>
		<dc:creator>pollux</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/legkij-ajax-v-massy/</guid>
		<description><![CDATA[Сейчас много различных библиотек и фреймворков доступно для разработчиков. Честно говоря я думаю, что их слишком много. Я изучил прекрасную библиотеку на javascript - Prototype.js и удивительную библиотеку script.aculo.us для создания визуальных эффектов.

Однако эти решения полностью написаны на javascript и исполняются на машине клиента. Цитируя некоторых именитых PHP разработчиков имеющих посредственные знания в javascript, что [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас много различных библиотек и фреймворков доступно для разработчиков. Честно говоря я думаю, что их слишком много. Я изучил прекрасную библиотеку на javascript - Prototype.js и удивительную библиотеку script.aculo.us для создания визуальных эффектов.</p>
<p><span id="more-219"></span></p>
<p>Однако эти решения полностью написаны на javascript и исполняются на машине клиента. Цитируя некоторых именитых PHP разработчиков имеющих посредственные знания в javascript, что делает очень затруднительным использование этих библиотек в PHP приложениях. К счастью я натолкнулся на библиотеку xAJAX, которая полностью написана на PHP, который включает Ajax функции.</p>
<p>При использовании библиотеки xAJAX требуется ОЧЕНЬ мало знаний по javascript, однако при использовании других библиотек я бы сказал что требуются солидные знания javascript. Я полагаю что интеграция Prototype.js в библиотеку xAJAX сделала бы его еще лучше, и разработчикам пришлось бы сталкиваться с javascript еще меньше. Хорошо что все это планируется в новых версиях xajax. Учитывая все это, я полагаю xAJAX это наиболее подходящий выбор для PHP разработчиков, которые будут интегрировать в свои вебприложения Ajax.</p>
<p>Основные принципы xAJAX При начале работы с xAJAX вы должны привыкнуть к некоторым вещам. Мы должны увидеть в PHP коде xAJAX, некоторый вид циклического процесса, который содержит в себе события на стороне клиент и события на стороне сервера.</p>
<p>Мощь xAJAX заключается в том, что мы можем вызвать PHP функцию напрямую из клиентского окружения. Функции, описанные в бекенде (PHP функции на сервере) доступны во фронтенде (dhtml/javascript на стороне клиента). Очень мощный встроенный механизм. Хорошие новости для разработчиков – фактически 99% javascript генерируются автоматически посредством xajax. Давайте ознакомимся с начальными сведениями – из чего состоит xAJAX .</p>
<p>Я создал четыре различных примера, которые помогут понять различные способы применения xAJAX. Однако есть некоторые принципы относящиеся ко всем примерам. Давайте посмотрим что это за принципы:</p>
<p>Шаг 1: подключение класса – библиотеки xAJAX require_once("xajax.inc.php"); Мы всегда подключаем библиотеку xajax.</p>
<p>Шаг 2: Функция xajax на стороне сервера function makeBold($p_sArg) { $sOut = ''.$p_sArg.''; $objResponse is new xajaxResponse(); $objResponse-&gt;addAssign('my_element', 'innerHTML', $sOut); return $objResponse-&gt;getXML(); } Функция получает строковый параметр $p_sArg в качестве аргумента и возвращает его в тегах .</p>
<p>Первым делом мы инициализируем объект xajaxResponse который будет обрабатывать ответ на клиентской стороне. Вторым мы назначаем элемент HTML, который будет обновлятся посредством объекта xajaxResponse.</p>
<p>Метод xajaxResponse-&gt;addAssign() имеет 3 аргумента:</p>
<p>Значение id тега элемента HTML на нашей странице Свойство, которое мы хостим изменить на стороне клиента Данные, которые мы хотим передать на сторону клиента В заключении, мы возвращаем ответ используя метод xajaxResponse-&gt;getXML().</p>
<p>Эти действия ВСЕГДА совершаются на стороне сервера посредством функций Ajax functions. Но здесь я хочу рассказать немного больше о классе xajaxResponse. Кроме того о методе я хочу рассказать поподробней xajaxResponse-&gt;addAssign().</p>
<p>Я взял список ниже с домашней страницы xajax и добавил несколько пояснений.</p>
<p>addAssign($sTargetId,$sAttribute,$sData)</p>
<p>Назначает свойству ($sAttribute) элемента, с id равным $sTargetId новые данные ($sData).</p>
<p>В связи с этим мы можем заменять данные определенного элемента новыми, сгенерированными на сервере.</p>
<p>$objResponse-&gt;addAssign("contentDiv","innerHTML", "Some Text");</p>
<p>$objResponse-&gt;addAssign("checkBox1","checked","true");</p>
<p>addAppend($sTargetId,$sAttribute,$sData)</p>
<p>Добавляет после, данные ($sData) к свойству элемента ($sAttribute), с id равным $sTargetId. Это значит, что в содержание свойства элемента будет находится старое значение, после которого добавлен результат выполнения функции на стороне сервера.</p>
<p>$objResponse-&gt;addAppend("contentDiv","innerHTML", "Some Text");</p>
<p>addPrepend($sTargetId,$sAttribute,$sData)</p>
<p>Добавляет перед, данные ($sData) к свойству элемента ($sAttribute), с id равным $sTargetId.</p>
<p>Это значит, что в содержание свойства элемента будет находится старое значение, перед которым добавлен результат выполнения функции на стороне сервера.</p>
<p>$objResponse-&gt;addPrepend("contentDiv","innerHTML", "Some Text");</p>
<p>addReplace($sTargetId,$sAttribute,$sSearch,$sData) заменяет все вхождения поиска ($sSearch) данными ($sData) в свойстве ($sAttribute) элемента HTML с id = $sTargetId</p>
<p>$objResponse-&gt;addReplace("contentDiv","innerHTML", "text","text");</p>
<p>addClear($sTargetId,$sAttribute) Удаляет значение свойства($sAttribute) элемента HTML с id=$sTargetId</p>
<p>$objResponse-&gt;addClear("Input1","value");</p>
<p>addCreate($sParentId, $sTagname, $sId, $sType)</p>
<p>Добавляет элемент-потомок ($sTagName) существующего элемента с id= $sParentId, и назначает id элемента-потомка ($sId), также можно задать тип элемента потомка $sType.</p>
<p>$objResponse-&gt;addCreate("form1","input", "pass", "password");</p>
<p>addRemove($sElementId)</p>
<p>Удаляет элемент с id=$sElementId из вашего приложения</p>
<p>$objResponse-&gt;addRemove("div1");</p>
<p>addAlert($sMsg) Показывает предупреждение javascript c текстом = $sMsg $objResponse-&gt;addAlert("The server said: Hi!");</p>
<p>addScript($sJS) Выполняет код JavaScript, содержащийся в $sJS.</p>
<p>Этим мощным методом мы можем отсылать на сторону клиента для немедленного исполнения.</p>
<p>$objResponse-&gt;addAlert("var txt = prompt('get some text');");</p>
<p>Шаг 3: Для всего этого создаем оболочку. После установки одной или нескольких функций конечно же ничего не случается.</p>
<p>Мы должны сделать некоторые обязательные вещи:</p>
<p>$objAjax = new xajax(); $objAjax-&gt;registerFunction('makeBold');</p>
<p>$objAjax-&gt;processRequests();</p>
<p>Первым делом мы создаем экземпляр класса xajax. Этот обект будет обрабатывать все события. Вторым мы регистрируем функцию для объекта xAJAX, которую ранее создали.</p>
<p>Делаем это посредством метода xajax-&gt;registerFunction().</p>
<p>В заключении мы можем обработать запросы методом xajax-&gt;processRequests().</p>
<p>Вы удивитесь 'Ну и что мы с этого получили?'.</p>
<p>Остался только один шаг для того чтобы доставить до клиентской стороны всю мощь языка PHP. После создания функций и установки объекта xAJAX мы можем отправлять HTML с сервера. Теперь мы добавим xAJAX на страницу HTML, для этого используем простой код, который должен располагаться в теге :</p>
<p>$objAjax-&gt;printJavascript();</p>
<p>Теперь мы можем закончить нашу страницу и использовать функции которые мы описали на первых шагах, напрямую со стороны клиента. В Для завершения нашего примера нам нужно взять элемент HTML с ID = 'my_element':</p>
<p>I'm gonna have my ass kicked by xajax!(этот юмор переводить не буду)<br />
Если мы добавим ссылку на страницу вызывающую наши функции с сервера, то они выделят текст жирным шрифтом без перезагрузки. Вид этой ссылки приведен ниже: Kick his ass! Ура, мы сделали это! Мы создали нашу первую AJAX ссылку. Щелкните по ней, чтобы увидеть магию AJAX. Как вы можете увидеть функции с сервера всегда вызывается посредством javascript функции с таким же именем, только с префиксом xajax_. В нашем примере мы вызываем xajax_makeBold().</p>
<p>Мы используем document.getElementById('my_element') для изменения содержания элемента HTML. Мы можем определить содержание этого элемента как заключенного в теги и . Двигаемся дальше Это всё? По основам, все! Это действительно легко. Конечно, немного больше вы узнаете, дочитав статью до конца, основные принципы вы уже получили. Теперь продемонстрируем мощь библиотеки и легкость использования в полнофункциональном приложении.</p>
<p>Демонстрации имеют полностью документированный код с понятными объяснениями, как это все работает. Поэтому если статья вас заинтересовала создайте мини сайт и посмотрите xAJAX в действии.</p>
<p>Посмотреть демо сайт!</p>
<p>И в заключении Если вы могли заметить, при прочтении этой статьи, что создание сайтов на AJAX не так сложно, как вы могли себе представить. Библиотека xAJAX сделана на границе Ajax и PHP, что позволяет писать приложения почти также легко как и на обычном PHP. Конечно, есть множество других библиотек, которые определенно стоит посмотреть. Я просто выбрал xajax потому что его можно непринужденно использовать, и при этом имеет такие большие возможности. Я надеюсь что эта статья будет для вас полезна.</p>
<p>Счастливо поAJAXить!</p>
<p>Обновлено: Дж. Макс Вилсон, создатель xajax сообщил прекрасную новость:</p>
<p>Привет. Я создатель php библиотеки xAJAX. Спасибо за презентацию (прим. перев. : автор проводил презентацию xAJAX)! Сейчас мы ведем сложную работу над новым релизом xAJAX. Мы выпускаем бета версию на следующей неделе. Новые изменения включают: Новая обработка ошибок: Ошибки, которые не являются критическими могут теперь скрываться и записываться только в лог файл или показываться пользователю в предупреждениях. ООП: Вы теперь можете регистрировать объекты и статические методы для вызова через xAJAX.</p>
<p>Эта особенность делает xAJAX легким для применения в различных ООП CMS-разработках (CMS – система управления сайтом). Локализация: xajax по умолчанию использует UTF-8, но мы добавляем возможность определять нужную вам кодировку. Регистрация внешних функций: вы можете теперь регистрировать функции во внешних файлах .php и xajax будет динамически включать файл и вызывать функцию только если она запрошена. Мы имеем сообщество разработчиков, использующих xajax.</p>
<p>Оригинал www.i-marco.nl/weblog/archive/2005/11/12/easy_ajax_for_the_masses_with<br />
Автор: Марко Ван Хилкам<br />
Перевод: Федоринов Григорий</p>
<p>Источник: www.myjoomla.ru</p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/legkij-ajax-v-massy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Что такое xAjax?</title>
		<link>http://allajax.ru/article/chto-takoe-xajax/</link>
		<comments>http://allajax.ru/article/chto-takoe-xajax/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 08:16:26 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/chto-takoe-xajax/</guid>
		<description><![CDATA[xAjax это open source библиотека классов PHP, которая позволяет вам легко создавать мощные, вебориентированные Ajax приложения использующие HTML, CSS, JavaScript, и PHP. Приложения, разработанные при помощи библиотеки xAjax могут асинхронно вызывать расположенные на сервере PHP функции и обновлять содержание без перезагрузки страницы.

Как работает xAjax?
Библиотека xAjax создает функции JavaScript, которые являются оболочкой для PHP функций, которые [...]]]></description>
			<content:encoded><![CDATA[<p>xAjax это open source библиотека классов PHP, которая позволяет вам легко создавать мощные, вебориентированные Ajax приложения использующие HTML, CSS, JavaScript, и PHP. Приложения, разработанные при помощи библиотеки xAjax могут асинхронно вызывать расположенные на сервере PHP функции и обновлять содержание без перезагрузки страницы.<br />
<span id="more-22"></span><br />
<strong>Как работает xAjax?</strong></p>
<p>Библиотека xAjax создает функции JavaScript, которые являются оболочкой для PHP функций, которые вы можете вызывать с сервера из вашего приложения. Когда вызывается функция JavaScript то эта функция, которая является оболочкой для функции PHP использует объект XMLHttpRequest для асинхронного соединения с объектом xAjax на сервере, который вызывает соответствующую функцию PHP. После завершения этого действия, возвращается xAjax XML ответ от вызванной PHP функции. Возращенный XML содержит инструкции и данные, которые будут проанализированы специальными функциями JavaScript-овой части xAjax и использованы для обновления содержания вашего приложения.</p>
<p><strong>Почему Вы должны использовать xAjax, а не другую библиотеку?</strong></p>
<ul>
<li>Вы выберете эту библиотеку, так как она удовлетворит все ваши потребности при разработке вашего проекта.</li>
<li>xAjax предлагает следующие возможности, которые вместе делают его уникальным и мощным инструментом:</li>
<li>xAjax's уникальная система на javaScript, которая может анализировать возращенный XML и автоматически его обрабатывать согласно инструкциям находящимся в этом ответе. Т.к. xAjax обрабатывает все это, то вам не нужно отдельно писать отдельные функции на Javascript для того чтобы обрабатывать возвращенный XML.</li>
<li>xAjax это объект ориентированный на создание отношений между программным кодом и данными для хранения кода хajax отдельно от другого программного кода. Так как это объектно-ориентированный код, то вы всегда можете добавлять свои функции в класс xAjaxResponse используя метод addScript().</li>
<li>xAjax работает в Firefox, Mozilla, возможно что и в остальных родственных Mozilla браузерах, Internet Explorer, и Safari. Помимо обновления значений элементов (имеется в виду DOM) и innerHTML, xAjax также может быть использован для обновления стилей, css классов, значений чекбоксов и выпадающих списков, или каких либо других свойств элемента.</li>
<li>xAjax может использовать одно и многоразмерные массивы, а также ассоциативные массивы из javascript в PHP как параметры ваших функций xAjax. В дополнение, если вы вводите объект javascript в функцию xAjax function, функция PHP будет получать ассоциативных массив, определяющий свойства этого объекта.</li>
<li>xAjax предоставляет легкую асинхронную обработку формp. Используя метод javascript xAjax.getFormValues(), вы можете легко отправить массив данных в форме как параметры для асинхронной функции xAjax: xAjax_processForm(xAjax.getFormValues('formId');.<br />
Если действие совершилось совместно с элементом формы input под именем "checkbox[][]" и "name[first]" для того чтобы создать многоразмерные и ассоциативные массивы такие как если бы вы отправляли форму используя массив $_GET. Используя xAjax вы можете динамически подгружать дополнительный javascript для вашего приложения для того чтобы при его исполнении менялись свойства элемента DOM.</li>
<li>xAjax автоматически сравнивает данные возвращенные из PHP функций с текущими значениями свойства элемента, который вы хотите изменить. Свойство изменяется только в том случае если это изменение актуально на данный момент. Это позволяет устранить мерцание, которое происходит если элемент обновляется каждый раз через определенные промежутки времени. Каждая функция зарегистрируется для того чтобы быть доступной через xAjax, который имеете различные типы запросов. Все функции по умолчанию используют POST за малым исключением GET. Это сделано для большей безопасности запросов.</li>
<li>Если не определен запрашиваемый URI, xAjax пытается автоматически определить запрашиваемый URL скрипта. Алгоритм автоопределения xAjax достаточно универсален, так что он будет работать как на безопасном протоколе https:// так и на http:// и на нестандартных портах.</li>
<li>xAjax перекодирует все свои запросы и ответы в кодировку UTF-8 таким образом он поддерживает большой спектр различных знаков и языков.</li>
<li>xAjax был протестирован на различных языках в юникоде включая Испанский, Русский, Арабский. Почти весь javascript динамически подгружается через javascript расширения.</li>
<li>xAjax может быть использован в шаблонном движке Smarty для создания переменной в smarty должен быть следующий код: $smarty-&gt;assign('xAjax_javascript', $xAjax-&gt;getJavascript()); Когда используете xAjax подставляйте в заголовок следующий тег {$xAjax_javascript}.</li>
</ul>
<p ALIGN="right">Источник: <noindex><a HREF="http://www.seotm.com/article/Ajax/CHto_takoe_AJAX.html">www.seotm.com</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/chto-takoe-xajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax-переходы и кнопка Back</title>
		<link>http://allajax.ru/article/ajax-perexody-i-knopka-back/</link>
		<comments>http://allajax.ru/article/ajax-perexody-i-knopka-back/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 08:06:09 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/ajax-perexody-i-knopka-back/</guid>
		<description><![CDATA[Задача в двух словах: нужно фиксировать события, выполняемые JavaScript`ом, в истории браузера.
Исходные данные: есть сайт, переходы между страницами реализованы ajax`ом.
Задача:
а. Заставить кнопки Back и Forward (и все остальное что связано с history бразузера) работать как подобает.
б. Пользователи должны иметь ссылку на ТЕКУЩУЮ страницу, в не зависимости от того, сколько переходов было совершено. Если пользватель зашел [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Задача</strong> в двух словах: нужно фиксировать события, выполняемые JavaScript`ом, в истории браузера.</p>
<p><strong>Исходные данные</strong>: есть сайт, переходы между страницами реализованы ajax`ом.</p>
<p><span id="more-21"></span><strong>Задача:</strong></p>
<p>а. Заставить кнопки Back и Forward (и все остальное что связано с history бразузера) работать как подобает.</p>
<p>б. Пользователи должны иметь ссылку на ТЕКУЩУЮ страницу, в не зависимости от того, сколько переходов было совершено. Если пользватель зашел на страницу А и перешел на странцу Б, он должен иметь ссылку на страницу Б, причем с минимальным включением мозга.</p>
<p><strong>Решение:</strong></p>
<p>Для начала решим вторую задачу:</p>
<p>Просто в лоб менять url в браузере не получится - произойдет переход. Обойти этот пунктик врядли получится - такое поведение жестко зашито в BOM (Browser Object Model) и любое отклонение от него есть баг. Единственная часть URL, которая может быть безболезненно изменна - это якорь. Им и займемся:</p>
<p>При каждом переходе меняем якорь страницы.</p>
<p>Т.е. если человек находится на странице /about/ и переходит на /shop/, то урл должен стать примерно таким: /about/#url=/shop/. Теперь пользователь может копировать ссылку из адресной строки и посылать ее друзьям.</p>
<p>В заголовок страницы (страниц) добавляем JS, который проверяет URL загружаемой страницы и, если в ней есть наш якорь, то осуществляет редирект на нее. Выглядит это примерно так:</p>
<p CLASS="codebox">&lt;script type="text/javascript"&gt;<br />
&lt;!--<br />
if(document.location.hash &amp;&amp; document.location.hash.indexOf('url=') &gt; -1) {<br />
document.location = new String(document.location.hash).replace('#url=','');<br />
}<br />
--&gt;<br />
&lt;/script&gt;</p>
<p>При этом код должен быть в заголовке страницы (между &lt;HEAD&gt; и &lt;/HEAD&gt;) и не должен выноситься в .js-файл - тогда переход будет осуществляться ДО того как начнется прориосвка страницы.</p>
<p>Теперь пользователь, открывая в браузере страницу /about/#url=/shop/ будет перебрасываться на /shop/, т.е. задача б решена.</p>
<p>Теперь займемся основной задачей.</p>
<p>Основная сложность заключается в том, что браузеры по разному отрабатывают движение по history. Если FireFox и Opera воспринимают изменение якоря как отдельное событие в history, то IE их в упор не замечает. Также прибавляет хлопот практически не управляемый объект history.</p>
<p><strong>FireFox и Opera:</strong></p>
<p>При нажатии на Back / Forvard в адресной сторке либо меняется якорь либо осуществляется преход на прошлую страницу. Если переход, то никаких действий не требуется, если же меняется якорь, нужно это изменение отловить и переправить посетителя на нужную страницу.</p>
<p>В JS создаем глобальную переменную, в которую при открытии страницы и каждом ajax-переходе пишем текущий url (с якорем).</p>
<p>Добавляем таймер (setInterval(...)), который через каждую секунду проверяет соответствие этой переменной фактическому URL в браузере. Если не соответствует, осуществляем переход на тот, что указан в браузере.</p>
<p><strong>Internet Explorer:</strong></p>
<p>При нажатии Back/Forward происходит переход на предыдующую страницу, все изменения якоря игнорируются. Нам нужно заставить IE отработать все изменения якоря как отдельные переходы. Для этого:</p>
<p>В JS (или в PHP - не суть) проверяем браузер пользователя и, если это IE, добавляем скрытый IFRAME.</p>
<p>В папку /myajax/ кладем .htaccess, который перенаправляет все запросы несуществующих страниц на файл-обработчик. .htaccess должен содержать примерно следующее:</p>
<p CLASS="codebox">RewriteEngine On<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteCond %{REQUEST_FILENAME} !-l<br />
RewriteRule (.*) index.php?qs=$1 [QSA]</p>
<p>Если mod_rewrite или .htaccess не доступны, можно реализовать аналогичную логику при помощи страницы 404.</p>
<p>При загрузке страницы, а также при каждом ajax-переходе в iframe загружаем URL вида: /myajax/наш_урл (т. е при переходе пользователя на страницу /about/ будет /myajax/about/). Это позволяет нам фиксировать переходы для IE.  Кроме того, при нажатии Back переход осуществится не в основном документе, а в  iframe.<br />
В файле /myajax/index.php нам нужно создать JS-код, который при загрузке страницы будет проверять, соответствует ли его URL (за исключением /myajax/) тому что загружено в основном окне браузера. Если нет - осуществить переход. Реализация может выглядеть примерно так:</p>
<p CLASS="codebox">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />
&lt;html&gt;&lt;head&gt;<br />
&lt;script language="JavaScript" type="text/javascript"&gt;<br />
&lt;!--<br />
function historyGo() {<br />
if(window.parent) {<br />
var parentUrl = '';<br />
var newUrl = '&lt;?=str_replace("/myajax/", "", $_SERVER["REQUEST_URI"]);?&gt;';<br />
var parentLoc = window.parent.location;<br />
if(parentLoc.hash &amp;&amp; parentLoc.hash.indexOf('url=')&gt;-1) {<br />
var sss = new String(parentLoc);<br />
parentUrl = new String(sss.substr(sss.indexOf('url=')+4));<br />
}<br />
else {<br />
parentUrl = new String(parentLoc.href.replace('http://'+parentLoc.hostname, ''));<br />
}<br />
parentUrl = parentUrl.replace('/myajax/', '');<br />
if(parentUrl != newUrl) {<br />
if(window.parent.document.changePage) {<br />
window.parent.document.changePage(newUrl);<br />
}<br />
else {<br />
window.parent.location.href = newUrl;<br />
}<br />
}<br />
}<br />
}<br />
//--&gt;<br />
&lt;/script&gt;<br />
&lt;/head&gt;&lt;body onload="historyGo()"&gt;&amp;nbsp;&lt;/body&gt;&lt;/html&gt;</p>
<p><strong>Пробуем:</strong></p>
<p>Вот в общем виде и все. Вероятно некоторые куски кода можно было бы и упростить, но в данном случае мне более важен сам принцип работы, а не оптимальность исполнения.<br />
Несколько подводных камней кроется в самой организации якорей (к примеру, при обработке экшнов форм), если интересно, опишу.</p>
<p ALIGN="right">Источник: <noindex><a HREF="http://community.livejournal.com/webdistortion/4188.html">community.livejournal.com</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/ajax-perexody-i-knopka-back/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AJAX-плагины для Smarty</title>
		<link>http://allajax.ru/article/ajax-plaginy-dlya-smarty/</link>
		<comments>http://allajax.ru/article/ajax-plaginy-dlya-smarty/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 07:35:48 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/ajax-plaginy-dlya-smarty/</guid>
		<description><![CDATA[Smarty и AJAX
Сегодня я написал простые плагины для Smarty, поддерживающие AJAX. Я не пытался разработать мощный фреймворк для веб-приложений,- просто хотелось дать идею, как можно интегрировать AJAX-технологию в Smarty. Но если у Вас есть любые предложения по улучшению системы, или Вы просто хотите отправить отзыв, оставьте комментарий на сайте.
На практике мне нужно несколько вещей от [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Smarty и AJAX</strong></p>
<p>Сегодня я написал простые плагины для Smarty, поддерживающие AJAX. Я не пытался разработать мощный фреймворк для веб-приложений,- просто хотелось дать идею, как можно интегрировать AJAX-технологию в Smarty. Но если у Вас есть любые предложения по улучшению системы, или Вы просто хотите отправить отзыв, оставьте комментарий на сайте.</p>
<p><span id="more-20"></span>На практике мне нужно несколько вещей от AJAX: обновить некоторые узлы DOM, отправить форму на сервер без перегрузки страницы, получить некоторые значения или выполнить вычисления на стороне сервера (возможно с использованием базы данных или других серверных ресурсов). Необходимо написать кучу кода JavaScript для реализации этих требований, даже несмотря на использование замечательной библиотеки JavaScript Prototype.</p>
<p>Я решил подружить Smarty и AJAX. Вот три плагина Smarty, которые были созданы: ajax_update, ajax_call, ajax_form. Ниже я опишу все эти плагины.</p>
<p><strong>ajax_update</strong></p>
<p>Эта функция Smarty может быть использована для обновления некоторых частей веб-страницы.<br />
Пример использования:</p>
<p CLASS="codebox">&lt;a href="#" mce_href="#" onclick="{ajax_update update_id='intro_content'<br />
function='update_intro' params='page=about'}"&gt;О нас&lt;/a&gt;</p>
<p>Возможные параметры:</p>
<p><em>url</em> - URL для AJAX-запроса (если не указан URL, будет использован текущий)<br />
<em>method</em> - метод запроса (по умолчанию get, может быть get или post)<br />
<em>update_id</em> - ID элемента HTML для обновления<br />
<em>function</em> - имя функции PHP, которая будет вызвана<br />
<em>params</em> - URL-закодированные параметры</p>
<p><strong>ajax_call</strong></p>
<p>Эта функция Smarty может быть использована для вызова PHP-функции на стороне сервера и получения результатов ее вывода.<br />
Пример использования:</p>
<p CLASS="codebox">&lt;a href="#" mce_href="#" onclick="{ajax_call function='calculate'<br />
params_func='calc_params' callback='calc_cb'}"&gt;Посчитать&lt;/a&gt;</p>
<p>Возможные параметры:</p>
<p><em>url</em> - URL для AJAX-запроса (если не указан URL, будет использован текущий)<br />
<em>method</em> - метод запроса (по умолчанию get, может быть get или post)<br />
<em>function</em> - имя функции PHP, которая будет вызвана<br />
<em>params</em> - URL-закодированные параметры<br />
<em>callback</em> - функция JavaScript, которая будет выполнена по завершении запроса<br />
<em>params_func</em> - функция JavaScript, которая используется для вычисления параметров запроса на стороне клиента</p>
<p><strong>ajax_form</strong></p>
<p>Этот блок Smarty может быть использован для отправки веб-форм на сервер без перезагрузки страницы.</p>
<p>Пример использования:</p>
<p CLASS="codebox">{ajax_form method="post" id="form_register"}</p>
<p>Любой элемент формы может быть размещен здесь</p>
<p>{/ajax_form}</p>
<p>Возможные параметры:</p>
<p><em>url </em>- URL для AJAX-запроса (если не указан URL, будет использован текущий)<br />
<em>method</em> - метод запроса (по умолчанию get, может быть get или post)<br />
<em>params</em> - URL-закодированные параметры<br />
<em>id</em> - ID элемента формы<br />
<em>callback</em> - функция JavaScript, которая будет выполнена по завершении запроса</p>
<p><strong>Примеры</strong></p>
<p>Эти плагины достаточно просты, и я думаю, что любой может создать получше моих. Я всего-лишь хотел показать идею, как можно произвести интеграцию. Рабочие примеры можно найти здесь. Кроме того, Вы можете скачать все исходники.</p>
<p ALIGN="right">Источник: <noindex><a HREF="http://ajaxhelp.net/ajaxpage15.html">ajaxhelp.net</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/ajax-plaginy-dlya-smarty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как заставить AJAX читать между строк?</title>
		<link>http://allajax.ru/article/ak-zastavit-ajax-chitat-mezhdu-strok/</link>
		<comments>http://allajax.ru/article/ak-zastavit-ajax-chitat-mezhdu-strok/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 07:30:10 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/ak-zastavit-ajax-chitat-mezhdu-strok/</guid>
		<description><![CDATA[Начнем...
На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать по ним и получать окно [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Начнем...</strong></p>
<p>На страницах вашего сайта содержится множество специализированных терминов. Когда пользователь просматривает сайт, у него могут возникать вопросы касательно этих терминов. Как сделать так, чтобы посетитель сайта по мере возникновения вопросов мог незамедлительно получать на них ответы? Раньше термины на страницах сайта оформлялись как ссылки и пользователь при желании мог кликать по ним и получать окно с контекстной подсказкой. Это подход достаточно неуклюжий, он отнимает у пользователя слишком много времени - на то, чтобы кликнуть по ссылке, дождаться загрузки окна и затем закрыть окно. В эпоху AJAX мы можем быть ближе к пожеланиям пользователей. <span id="more-19"></span>Мы можем сделать так, чтобы уже при наведении мыши на термин незамедлительно появлялось сообщение с подсказкой и как только курсор мыши сдвинут с термина, сообщение исчезало. Наличие этого сервиса не отразится на объеме страниц сайта. При запросе контекстной подсказки Java Script будет обращаться к внешнему словарю, получать содержание и отображать его.</p>
<p>Метод получения информации по неявному запросу может найти применение не только в словаре терминов. Обращали ли вы внимание на ссылки с двойным подчеркиванием в таких проектах как hotscripts.com и devarticles.com? Это контекстная реклама на основе движка IntelliTXT компании Vibrant Media. При наведении курсора мыши на подобную ссылку появляется окно с рекламным предложением на соответствующую тему. Эта технология уже получила название in-text advertising.</p>
<p>Все чаще и чаще подобный метод применяется и на новостных порталах. Посетители видят на главной странице портала лишь заголовки новостей. Однако при наведении курсора мыши на заголовок новости они получают ее краткое описание. Таким образом, на главной странице портала можно вместить куда как больше новостей. Посетитель портала увидит заголовки и для того, чтобы получить анонсы новостей, ему будет достаточно пробежаться курсором мыши по заголовкам.</p>
<p>Давайте теперь рассмотрим, каким образом реализуется контекстная подсказка с помощью AJAX. Программисту, освоившему этот метод, не составит труда заставить портал комментировать новости по запросу или же написать модуль in-text advertising.</p>
<p>Итак, очевидно нам следует позаботиться об окне сообщения, того самого, которое будет появляться каждый раз, когда посетитель наводит курсор на термин. Для того, чтобы окно появлялось и исчезало мгновенно, следует поместить его на скрытом DIV.</p>
<p CLASS="codebox">&lt;div id="InstantMessage" class="instant_message"&gt; &lt;/div&gt;</p>
<p>Для простоты эксперимента мы можем оформить его в стиле системных сообщений MS Windows.</p>
<p CLASS="codebox">&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;</p>
<p>Окно должно появиться в тот момент, когда посетитель навел курсор мыши на термин и исчезнуть, когда курсор мыши будет за пределами термина. Причем, в тот самый момент окно должно содержать уже не пробел, а текст определения термина. Таким образом, мы должны поместить термины в тексте документа в inline тег, поддерживающий события onMouseOver и onMouseOut. Первому событию следует назначить функцию JavaScript, которая получит определение термина, поместит его в окно сообщения и покажет окно. Второму событию требуется назначить функцию, которая просто скроет окно сообщения.</p>
<p CLASS="codebox">&lt;a onmouseover="getDefinition('термин', event);"<br />
onmouseout="hideMessage();"&gt;термин&lt;/a&gt;</p>
<p>В параметре функции, отображающей окно (getDefenition) сообщения надо указать термин. Этот термин будет использован для запроса текста определения посредством AJAX. Так как при показе окна нам потребуется его позиционировать под курсором мыши для поддержки Gecko-базированых браузеров, в эту функцию также следует передать параметр event. Функция для сокрытия окна (hideMessage) не требует каких-либо параметров. Теперь наша задача - при вызове функции getDefinition заставить JavaScript позиционировать окно сообщения.</p>
<p CLASS="codebox">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 />
}</p>
<p>Итак, мы имеем окно сообщения, рапортующее о загрузке данных. Теперь следует выполнить запрос к контроллеру за определением термина. Вы можете написать собственные функции для обслуживания AJAX запросов. Но если вы только начинаете работать с AJAX, я могу порекомендовать вам готовую библиотеку от Yahoo. В этом случае запрос будет выглядеть так:</p>
<p CLASS="codebox">function getDefinition(term,evt){<br />
adjustMessage(evt);<br />
var request = YAHOO.util.Connect.asyncRequest('POST',<br />
'http://адрес_контроллера', callback, 'term='+term);<br />
}</p>
<p>Раз мы запрашиваем контроллер, очевидно, нам надлежит его написать. В общем случае, это самая простая часть. Задача контроллера - вернуть описание термина, переданного в POST. Каким бы языком программирования мы не пользовались при написании контроллера, нам достаточно выполнить несколько простейших операций. соединиться с базой данных выполнить SQL запрос для получения определения термина отобразить на консоль результат в следующем виде:</p>
<p CLASS="codebox">{<br />
"errormsg" : "в случае ошибки ее код",<br />
"content" : "текст определения"<br />
}</p>
<p>Это структура данных, известная как JSON. Она воспринимается JavaScript в явном виде, как &lt;родная&gt;. В случае использования AJAX-библиотеки YAHOO ответ контроллера обслуживается следующей конструкцией</p>
<p CLASS="codebox">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 />
};</p>
<p>Нам осталось лишь описать функцию showMessage(), которая помещает принятый текст определения в окно сообщения</p>
<p CLASS="codebox">function showMessage(json) {<br />
var respondStructure = eval( '(' + json + ')' );<br />
MessageObj.innerHTML = respondStructure.content;<br />
return false;<br />
}</p>
<p>Как вы понимаете, для сокрытия окна сообщения потребуется лишь изменить атрибут объекта</p>
<p CLASS="codebox">function hideMessage(){<br />
var MessageObj=document.getElementById('InstantMessage');<br />
MessageObj.style.visibility="hidden";<br />
}</p>
<p>Когда вы будете опробовать этот пример, едва ли вы встретитесь с проблемами под браузером MS IE, однако, в FireFox вы можете обнаружить мерцание окна сообщения. Это связано с тем, что FireFox своеобразно обслуживает события onMouseOver/onMouseOut. Впрочем, эту проблему можно решить путем расстановки флагов задержки в функциях обслуживания этих событий.</p>
<p>Скрипты приведенного здесь примера можно загрузить <noindex><a HREF="http://www.phpclasses.org/browse/package/3505.html">здесь</a></noindex>.<br />
Работу примера можно увидеть <noindex><a HREF="http://www.cmsdevelopment.com/thesaurus/">здесь</a></noindex>.</p>
<p ALIGN="right">Источник: <noindex><a HREF="http://ajaxhelp.net/ajaxpage2.html">ajaxhelp.net</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/ak-zastavit-ajax-chitat-mezhdu-strok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cверхдинамичные веб-интерфейсы</title>
		<link>http://allajax.ru/article/verxdinamichnye-veb-interfejsy/</link>
		<comments>http://allajax.ru/article/verxdinamichnye-veb-interfejsy/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 07:24:37 +0000</pubDate>
		<dc:creator>Spryt</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://allajax.ru/article/verxdinamichnye-veb-interfejsy/</guid>
		<description><![CDATA[Начнем
Одно из главных затруднений, с которым сталкиваются разработчики интерфейсов веб-приложений, состоит в том, что после того, как страница оказалась в браузере клиента, связь браузера с сервером заканчивается. Любое действие с элементом интерфейса требует повторного обращения к серверу с повторной загрузкой новой страницы. Из-за этого веб-приложение теряет свою элегантность и медленно работает. В данной статье я [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Начнем</strong></p>
<p>Одно из главных затруднений, с которым сталкиваются разработчики интерфейсов веб-приложений, состоит в том, что после того, как страница оказалась в браузере клиента, связь браузера с сервером заканчивается. Любое действие с элементом интерфейса требует повторного обращения к серверу с повторной загрузкой новой страницы. Из-за этого веб-приложение теряет свою элегантность и медленно работает. В данной статье я расскажу о том, как данную проблему можно решить с помощью JavaScript и объекта XMLHttpRequest.</p>
<p><span id="more-18"></span>Я уверен, что вам знакома традиционная модель интерфейса веб-приложений. Пользователь запрашивает страницу с сервера, которая на сервере создается, а затем пересылается браузеру. У данной страницы есть HTML-элементы, описывающие форму, в которую пользователь вводит данные. После этого пользователь отсылает данные на сервер и получает новую страницу, основанную на введенных данных, и процесс повторяется. Весь этот процесс определяется самой природой HTTP-протокола и отличается от того, как мы работаем с обычными приложениями, интерфейс которых неразрывно связан с программной логикой.</p>
<p>Возьмем простой пример ввода серийного номера в каком-либо Windows-приложении. Согласно правилам, после того, как вы закончите вводить замысловатый набор цифр и букв в поля, рядом с ними появится зеленая "галочка", означающая, что вы ввели правильный номер. Она появляется моментально, как результат логики "вшитой" в интерфейс. Как только вы закончили набирать номер, программа проверяет его и выдает ответ.</p>
<p>В веб-интерфейсе это стандартное поведение выглядит совершенно по-другому. Разумеется, поля, в которые вы вводите серийный номер выглядят точно так же, но по завершении ввода, пользователю надо, нажав кнопку, отправить страницу на сервер, который проверит введенные данные. Обратно пользователю вернется новая страница, где будет выведено сообщение о правильном или неправильном серийном номере. Пользователю в случае неудачи надо вернуться на предыдущую страницу и снова повторить попытку. И так до бесконечности.</p>
<p>Разумеется не часто веб-приложение требует от пользователя ввести серийный номер, но есть бесчисленное множество других примеров, где быстрая реакция интерфейса на действия пользователя очень бы пригодилась. А так как вся программная логика находится на сервере, получить такой результат в традиционном веб-приложении весьма сложно.</p>
<p><strong>На сцене появляется JavaScript</strong></p>
<p>Благодаря JavaScript определенное количество программной логики можно перенести в HTML-страницу, что позволит быстро реагировать на действия пользователя. Однако у этого решения есть один главный недостаток. Первая проблема заключается в том, что как только JavaScript попадает в браузер пользователя вместе со страницей, программная логика доступна для просмотра невооруженным глазом. В случае например с проверкой правильности введенного адреса e-mail это может быть и не страшно, но если проверка связана с серийным номером, алгоритм проверки становится доступным всем, кто скачал страницу, а это неприемлемо.</p>
<p>Вторая проблема заключается в том, что серьезную программную логику в страницу поместить невозможно, так как интерфейс просто не предназначен для этого. Вся логика должна находиться на уровне приложения, а не пользовательского интерфейса, а это значит - мы опять возвращаемся на сервер. Проблема дополняется еще тем, что не всегда с уверенностью можно ожидать наличия JavaScript в браузере клиента. В то время, как большинство пользователей оставляют поддержку JavaScript в своих браузерах включенной, существует значительное количество пользователей, которые этого не делают, или пользуются таким браузером, где JavaScript отсутствует или вообще не нужен как класс. Следовательно всю логику, которую делает JavaScript на стороне клиента, все равно придется проверять на сервере на всякий случай.</p>
<p><strong>Объект XMLHttpRequest</strong></p>
<p>Решением этой проблемы может стать объект XMLHttpRequest. Этот объект впервые был реализован компанией Microsoft в виде объекта ActiveX, но сейчас он доступен как встроенный объект во всех браузерах Mozilla и Safari. Этот объект позволяет JavaScript-у осуществлять HTTP-запросы к удаленному серверу без необходимости перезагружать страницу. По сути HTTP-запросы отправляются и получаются полностью за "кулисами" страницы, а пользователь их даже не замечает.</p>
<p>Это огромный шаг вперед, так как позволяет разработчику веб-приложения достичь той самой желанной цели - создание быстрого пользовательского интерфейса с сохранением при этом программной логики на сервере. С помощью JavaScript-а данные, введенные пользователем, отправляются на сервер, там они обрабатываются и пользователь практически тут же получает ответ на введенные данные.</p>
<p><strong>Начнем с основ</strong></p>
<p>Из-за своей противоречивой истории объект XMLHttpRequest еще не является частью какого-либо стандарта (хотя нечто подобное уже было предложено в спецификации W3C DOM Level 3 Load and Save). Поэтому существует два отличных друг от друга метода вызова этого объекта в коде скрипта. В Internet Explorer объект ActiveX вызывается так:</p>
<p CLASS="codebox">var req = new ActiveXObject("Microsoft.XMLHTTP");</p>
<p>В Mozilla и Safari это делается проще (так как там это объект, встроенный в JavaScript):<br />
var req = new XMLHttpRequest();</p>
<p>Разумеется из-за таких различий вам необходимо создавать в коде ветки, каждая из которых будет выполняться в зависимости от того, в каком браузере загружен скрипт. Существует несколько способов, как сделать это (включая различные мудрёные хаки и метод "условных комментариев"). Но я считаю, что лучше всего просто проверять в коде, поддерживается ли браузером тот или иной объект. Хорошим примером может служить код, взятый с сайта Apple, где выложена документация по этому объекту. Давайте им и будем пользоваться:</p>
<p CLASS="codebox">var req;<br />
function loadXMLDoc(url) {<br />
// branch for native XMLHttpRequest object<br />
if (window.XMLHttpRequest) {<br />
req = new XMLHttpRequest();<br />
req.onreadystatechange = processReqChange;<br />
req.open("GET", url, true);<br />
req.send(null);<br />
// branch for IE/Windows ActiveX version<br />
} else if (window.ActiveXObject) {<br />
req = new ActiveXObject("Microsoft.XMLHTTP");<br />
if (req) {<br />
req.onreadystatechange = processReqChange;<br />
req.open("GET", url, true);<br />
req.send();<br />
}<br />
}<br />
}</p>
<p>В этом коде особенно важно обратить внимание на свойство onreadystatechange.</p>
<p>Посмотрите, как ему присваивается значение функции processReqChange. Это свойство - хендлер события, которое запускается всякий раз, когда меняется состояние объекта req. Состояния обозначаются номерами с 0 (объект неинициализирован) по 4 (запрос выполнен). Важно это потому, что наш скрипт не будет ждать ответа от сервера, чтобы продолжить свою работу. HTTP-запрос будет сформирован и отослан на сервер, но скрипт будет выполняться дальше. Из-за того, что мы выбрали такой вариант поведения, нам нельзя просто в конце функции вернуть результат запроса, так как нам неизвестно, получили мы его к этому времени или нет. Для этого мы и предусмотрели функцию processReqChange, которая будет отслеживать состояние объекта req, и сообщит нам в нужное время, что процесс получения документа закончен, и мы можем идти дальше.<br />
Для этого функции processReqChange требуется проверять две вещи. Первая - ждать, когда состояние объекта req изменится на 4 (означающее, что процесс получения документа с сервера закончен). Второе, это проверить HTTP-статус ответа. Вы знаете, что код 404 означает "файл не найден" и 500 - "произошла ошибка на сервере". Но нам нужен старый добрый код 200 ("все ОК"), который означает, что на сервере наш запрос был успешно выполнен. Если мы получили и состояние 4 и код 200, мы можем продолжать выполнение нашего скрипта и обрабатывать результаты, полученные от сервера. Разумеется в противном случае мы должны обработать все ошибки, например, если код ответа отличается от 200.</p>
<p CLASS="codebox">function processReqChange()<br />
{<br />
// only if req shows "complete"<br />
if (req.readyState == 4) {<br />
// only if "OK"<br />
if (req.status == 200) {<br />
// ...processing statements go here...<br />
} else {<br />
alert("There was a problem retrieving<br />
the XML data:\n" + req.statusText);<br />
}<br />
}<br />
}</p>
<p><strong>На практике</strong></p>
<p>Я собираюсь создать работающий пример для демонстрации вышеизложенных идей. Во многих веб-приложениях есть процедура, когда новый пользователь регистрируется на сервере и требуется выбрать "ник" для регистрации. Очень часто этот "ник" должен быть уникальным, и потому после того, как пользователь выбрал себе "ник", на сервере осуществляется проверка по базе данных пользователей, есть уже такой "ник" или нет. Если вы когда-либо регистрировались на каком-нибудь почтовом веб-сервере, вы помните, как утомительно подыскивать "ник", которым еще никто не пользуется. Было бы очень хорошо, если бы проверка осуществлялась без необходимости всякий раз обновлять страницу.</p>
<p>Для решения мы воспользуемся четырьмя ключевыми элементами: XHTML-формой, функцией JavaScript, специально написанной для данной ситуации, двумя нашими общими функциями, о которых мы говорили выше, и наконец серверным скриптом, который будет обращаться к базе данных.</p>
<p><strong>Форма</strong></p>
<p>Это самая легкая часть работы - простая форма с полем для ввода "ника". К событию onblur мы привязываем наш скрипт проверки. Для того, чтобы вывести пользователю сообщение о результатах проверки, я вставил его в форму и спрятал с помощью CSS. Это более элегантный и вежливый способ, чем стандартное диалоговое окно функции alert().</p>
<p CLASS="codebox">&lt;input id="username" name="username" type="text"<br />
onblur="checkName(this.value,'')" /&gt;<br />
&lt;span class="hidden" id="nameCheckFailed"&gt;<br />
This name is in use, please try another.<br />
&lt;/span&gt;</p>
<p>В CSS объявлены свойства класса hidden, а также еще одного класса error, который служит для вывода сообщений об ошибке.</p>
<p CLASS="codebox">span.hidden{<br />
display: none;<br />
}<br />
span.error{<br />
display: inline;<br />
color: black;<br />
background-color: pink;<br />
}</p>
<p><strong>Обработка введенных данных</strong></p>
<p>Функция checkName служит для проверки данных, введенных пользователем форму. Задача функции - взять данные, решить, какому серверному скрипту эти данные отдать, вызвать другую функцию, которая сделает всю "грязную" работу с HTTP-запросами и ответами, и затем обработать ответ. Эта наша функция будет состоять из двух частей. Одна часть - берет данные из формы, а другая - обрабатывает ответ от сервера. Я объясню, зачем это сделано, чуть позднее.</p>
<p CLASS="codebox">function checkName(input, response)<br />
{<br />
if (response != ''){<br />
// Response mode<br />
message   = document.getElementById('nameCheckFailed');<br />
if (response == '1'){<br />
message.className = 'error';<br />
}else{<br />
message.className = 'hidden';<br />
}<br />
}else{<br />
// Input mode<br />
url  = 'http://localhost/xml/checkUserName.php?q=' \\<br />
+ input;<br />
loadXMLDoc(url);<br />
}<br />
}</p>
<p>Ответ обрабатывается просто - ответ, который мы получим от серверного скрипта, будет либо 1, либо 0. 1 означает, что такой "ник" уже кем-то используется. В зависимости от ответа наша функция меняет название класса сообщения об ошибке - оно либо показывается, либо прячется. Как понятно из кода, работу на сервере выполняет скрипт checkUserName.php.</p>
<p><strong>Формирование HTTP-запроса и ответа</strong></p>
<p>Как вы видели выше, работа с HTTP выполняется двумя функциями: loadXMLDoc и processReqChange. В первом практически ничего менять не надо, а во втором требуется кое-что поменять для работы с DOM-ом. Как вы помните, пока успешный результат выполнения запроса не будет передан функции processReqChange, мы не можем из этой функции вернуть какое-либо значение. Из-за этого нам требуется выполнять явный вызов функции из другого места кода, чтобы воспользоваться результатом. Вот почему функция checkName разбита на две части. Таким образом, главная задача функции processReqChange состоит в том, чтобы обработать XML-ответ, полученный от сервера, и передать определенное значение из этого ответа функции checkName. Мы не хотим вносить в эти функции какой-либо специфический код, так как эти функции могут использоваться и другими элементами страницы для обращения к серверу. Поэтому мы и не вписывали в функцию processReqChange имя функции checkName. Вместо этого мы решили, что сервер сам будет в своем ответе давать название функции, которая к нему обращалась.</p>
<p CLASS="codebox">&lt;?xml version="1.0" encoding="UTF-8"<br />
standalone="yes"?&gt;<br />
&lt;response&gt;<br />
&lt;method&gt;checkName&lt;/method&gt;<br />
&lt;result&gt;1&lt;/result&gt;<br />
&lt;/response&gt;<br />
Разбор этого простого ответа выполняется без каких-либо проблем.<br />
ПросмотретьРаспечатать?<br />
function processReqChange()<br />
{<br />
// only if req shows "complete"<br />
if (req.readyState == 4) {<br />
// only if "OK"<br />
if (req.status == 200) {<br />
// ...processing statements go here...<br />
response = req.responseXML.documentElement;<br />
method = response.getElementsByTagName('method') \\<br />
[0].firstChild.data;<br />
result = response.getElementsByTagName('result') \\<br />
[0].firstChild.data;<br />
eval(method + '(\'\', result)');<br />
} else {<br />
alert("There was a problem retrieving \\<br />
the XML data:\n" + req.statusText);<br />
}<br />
}<br />
}</p>
<p>Обратившись к свойству responseXML объекта XMLHttpRequest, мы получаем XML-ответ, пришедший от сервера, который мы затем разбираем с помощью DOM. Взяв из ответа название функции, которая требовала этот ответ, мы знаем, какой функции надо передать полученное значение. После того, как вы закончите тестирование, уберите условие else, чтобы скрипт не беспокоил пользователей лишним сообщением об ошибке.</p>
<p><strong>Серверный скрипт</strong></p>
<p>Последний элемент нашей мозаики - это серверный скрипт, который будет получать запрос, обрабатывать его и возвращать ответ в виде XML. В нашем примере скрипт будет обращаться к базе данных пользователей, чтобы определить, используется ли уже данный "ник" или нет. Для краткости в моем примере скрипт не использует базу данных, а просто проверяет два имени "Drew" и "Fred".</p>
<p CLASS="codebox">&lt;?php<br />
header('Content-Type: text/xml');<br />
function nameInUse($q)<br />
{<br />
if (isset($q)){<br />
switch(strtolower($q))<br />
{<br />
case  'drew' :<br />
return '1';<br />
break;<br />
case  'fred' :<br />
return '1';<br />
break;<br />
default:<br />
return '0';<br />
}<br />
}else{<br />
return '0';<br />
}<br />
}<br />
?&gt;</p>
<p CLASS="codebox">&lt;?php echo '&lt;?xml version="1.0" encoding="UTF-8"<br />
standalone="yes"?&gt;'; ?&gt;<br />
&lt;response&gt;<br />
&lt;method&gt;checkName&lt;/method&gt;<br />
&lt;result&gt;&lt;?php<br />
echo nameInUse($_GET['q']) ?&gt;<br />
&lt;/result&gt;<br />
&lt;/response&gt;</p>
<p>Разумеется, ту же процедуру проверки надо предусмотреть и в том серверном скрипте, который будет выполняться, когда пользователь нажмет кнопку "Submit" на форме регистрации. Это на тот случай, если у него в браузере был отключен JavaScript, или пользователь намеренно ввел "ник", который уже используется. Кроме того на загруженных сайтах может так случиться, что во время выбора "ника" он был свободен, а на момент подачи его уже кто-то занял.</p>
<p>В качестве следующего шага расширьте сами функциональность скрипта. Например сервер может возвращать варианты альтернативных "ников" на основе "ника", выбранного пользователем, но уже занятого.</p>
<p><strong>В заключение</strong></p>
<p>Этот небольшой пример лишь слегка касается темы использования объекта XMLHttpRequest. Вот лишь некоторые примеры его использования: Google Suggest, где XMLHttpRequest используется для того, чтобы подсказать искомые слова, приложение Ta-da Lists, где данные подаются на сервере опять-таки с помощью XMLHttpRequest благодаря чему интерфейс работает очень быстро. Самое интересное здесь не том, чтобы заставить код работать, а в том, чтобы найти еще какие-либо интересные способы его использования.</p>
<p ALIGN="right">Источник: <noindex><a HREF="http://ajaxhelp.net/ajaxpage5.html">ajaxhelp.net</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://allajax.ru/article/verxdinamichnye-veb-interfejsy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

