<?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>AJAX Planet &#187; AJAX</title>
	<atom:link href="http://www.ajaxplanet.ru/tag/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxplanet.ru</link>
	<description></description>
	<lastBuildDate>Thu, 13 Oct 2011 13:00:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Ajax для профессионалов</title>
		<link>http://www.ajaxplanet.ru/ajax-dlya-professionalov/</link>
		<comments>http://www.ajaxplanet.ru/ajax-dlya-professionalov/#comments</comments>
		<pubDate>Thu, 05 Apr 2007 05:45:54 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Книги]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ajax-для-профессионалов]]></category>
		<category><![CDATA[рецензия]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/ajax-dlya-professionalov/</guid>
		<description><![CDATA[Ajax обширная тема, и описать все важные аспекты данного понятия в одной книге очень тяжело, но авторам книги «Ajax для профессионалов» это, как мне кажется, удалось. Издателями в России выступили «Символ-Плюс», что означает (повторюсь за Борисом) высокое качество перевода. Также меня очень порадовала работа научного редактора, который добавил большое количество сносок поясняющих некоторые тонкие моменты, [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="http://www.books.ru/shop/books/477695?partner=celarent"><img src="http://www.books.ru/img/477695.jpg" alt="Ajax для профессионалов" style="float: left; margin: 3px; border: none;" /></a></noindex><br />
Ajax обширная тема, и описать все важные аспекты данного понятия в одной книге очень тяжело, но авторам книги <noindex><a href="http://www.books.ru/shop/books/477695?partner=celarent">«Ajax для профессионалов»</a></noindex> это, как мне кажется, удалось.</p>
<p>Издателями в России выступили «Символ-Плюс», что означает (повторюсь за Борисом) высокое качество перевода. Также меня очень порадовала работа научного редактора, который добавил большое количество сносок поясняющих некоторые тонкие моменты, на которых авторы не сделали акцента. Аннотацию можно почитать <noindex><a href="http://www.books.ru/shop/books/477695?partner=celarent">тут</a></noindex>, но она ничем не отличается от аннотаций <noindex><a href="http://www.ozon.ru/?context=search&#038;text=ajax&#038;partner=ferio">других книг по Ajax</a></noindex>. Я же попробую подробнее описать, какие аспекты рассмотрены в данном издании, для этого пробежимся по содержанию.</p>
<ul>
<li><strong>Глава 1. Что такое Ajax?</strong> В этой главе рассматривается история термина Ajax, примеры сайтов, использующих эту технологию. Кстати, даже я, читавший ни одну статью с таким названием, нашел для себя несколько новых фактов</li>
<li><strong>Глава 2. Основы Ajax</strong> представляет собой введение в основы Ajax, описываются методы реализации с использованием iframe’ов  и XMLhttp, их преимущества и недостатки, варианты применения. Большое внимание уделяется такому важному аспекту как юзабилити. Также показывается удобства работы с кросс-браузерной библиотекой zXMLhttp, разработанной авторами книги (нужно отметить, что действительно удобная вещь для небольших проектов)</li>
<li><strong>Глава 3. Шаблоны проектирования.</strong> Очень важная, на мой взгляд, глава. Мало того, что в ней описываются наиболее часто используемые паттерны Ajax, она дает задуматься о важности глубокого анализа своего проекта на предмет построения более правильного взаимодействия частей отвечающих за реализацию Ajax.</li>
<li><strong>Глава 4. XML, XPath и XSLT.</strong> Это небольшое введение в технологии сопутствующие Ajax, большое внимание уделено кросс-браузерности.</li>
<li><strong>Глава 5. Синдицирование с использованием RSS и Atom.</strong> Описываются история появления и развития  технологий распространения информации через Веб, включая RSS и Atom, а также процесс создания и реализации веб-агрегатора RSS/Atom</li>
<li><strong>Глава 6. Веб-службы.</strong> Для меня глава оказалась действительно полезной, так как четко определяет понятия SOAP, REST, WSDL. Также из этого раздела можно узнать о создании веб-службы с помощью ASP.NET и C#, и способ решения проблемы междоменных запросов.</li>
<li><strong>Глава 7.  JSON.</strong> Наличие этой главы очень меня порадовало, так как многие авторы, освещающие Ajax тему считают, что XML это единственный формат общения серверной и клиентской частей. Но даже в одном из документов Googl’a по Ajax API, говорится о том насколько удобнее применять JSON в среде работы с JavaScript. Итак, в этой главе будет рассмотрен пример работы Ajax приложения с использованием формата JSON для реализации поля ввода с авто-дополнением (auto-suggestion)</li>
<li><strong>Глава 8. Виджеты на веб-сайте.</strong> Рассмотрены примеры реализации виджета со сводкой новостей, виджета с информацией о погоде, виджета поиска в Сети и поиска по сайту. </li>
<li><strong>Глава 9. AjaxMail. </strong>Самая интересная и полезная глава, рассказывающая о создании законченного веб-приложения с использованием всех приведенных сведений из предыдущих глав (надо сказать, достаточно мощное приложение получается)</li>
<li><strong>Глава 10. Интегрированные системы Ajax.</strong> В этой главе описывается три интегрированных системы: JSPAN для работы c PHP, DWR для работы с Java и Ajax.NET, каждая из которых автоматизирует какую-то часть процесса разработки в Ajax.</li>
</ul>
<p>К плюсам <noindex><a href="http://www.ozon.ru/context/detail/id/3163637/&#038;partner=ferio">книжки</a></noindex> еще нужно отнести актуальность версий описываемых продуктов, к минусам – большое количество опечаток. Также меня разочаровала последняя глава так как, на мой взгляд, в ней рассматриваются не очень удачные интегрированные системы.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/ajax-dlya-professionalov/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/ajax-dlya-professionalov/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/knigi/" title="Просмотреть все записи в рубрике &laquo;Книги&raquo;" rel="category tag">Книги</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/ajax-dlya-professionalov/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Секрет SearchMash.com</title>
		<link>http://www.ajaxplanet.ru/sekret-searchmashcom/</link>
		<comments>http://www.ajaxplanet.ru/sekret-searchmashcom/#comments</comments>
		<pubDate>Tue, 06 Mar 2007 05:27:17 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[SearchMash.com]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/sekret-searchmashcom/</guid>
		<description><![CDATA[Все знают что Google предоставляет API для получения результатов поиска. Но на сайте SearchMash.com существует неофициальное API для получения результатов в формате JSON (неофициальное потому что гугл о нем не заявлял) Итак чтобы воспользоваться API нужно перейти по урлу http://www.searchmash.com/results/[query], где [query] нужно заменить на интересующий вас запрос. Если задать урл в следующем формате http://www.searchmash.com/results/[query]?i=11&#38;n=10, [...]]]></description>
			<content:encoded><![CDATA[<p>Все знают что Google предоставляет <noindex><a href="http://code.google.com/apis/ajaxsearch/">API</a></noindex> для получения результатов поиска. Но на сайте <noindex><a href="http://www.searchmash.com/">SearchMash.com</a></noindex> существует неофициальное API для получения результатов в формате JSON (неофициальное потому что гугл о нем не заявлял)</p>
<p>Итак чтобы воспользоваться API нужно перейти по урлу <strong>http://www.searchmash.com/results/[query]</strong>, где [query] нужно заменить на интересующий вас запрос. Если задать урл в следующем формате http://<strong>www.searchmash.com/results/[query]?i=11&amp;n=10</strong>, то вы получите десять результатов запроса начиная с одиннадцатого. Также можно получить результаты по изображениям, видео и блогам:</p>
<p><strong>http://www.searchmash.com/results/images:[query]<br />
http://www.searchmash.com/results/blogs:[query]</p>
<p>http://www.searchmash.com/results/video:[query]</strong></p>
<p>Если вы захотите использовать это API через AJAX, то возможно вам потребуется <noindex><a href="http://developer.yahoo.net/javascript/howto-proxy.html">веб-прокси</a></noindex> для создания междоменых запросов.</p>
<p>В PHP можно получить результаты, воспользовавшись библиотекой <noindex><a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198">pear.php.net/pepr/pepr-proposal-show.php?id=198</a></noindex>:</p>
<p><code><br />
$request = 'статьи о AJAX'<br />
require_once("JSON.php");<br />
$json = new Services_JSON();<br />
$full_json_return = $json-&gt;decode(implode('',file('http://www.searchmash.com/results/'.urlencode(iconv('cp1251','UTF-8',$request)).'?n=10')));<br />
print_r($full_json_return-&gt;result);<br />
</code></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/sekret-searchmashcom/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/sekret-searchmashcom/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/uncategorized/" title="Просмотреть все записи в рубрике &laquo;Без рубрики&raquo;" rel="category tag">Без рубрики</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/sekret-searchmashcom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Галерея AJAX библиотек и фреймворков</title>
		<link>http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/</link>
		<comments>http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/#comments</comments>
		<pubDate>Mon, 05 Mar 2007 05:15:08 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[miniajax]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/</guid>
		<description><![CDATA[Автор сайта miniajax попытался собрать наиболее эффектные и красивые примеры работ всевозможных AJAX скриптов и библиотек, каждая ссылка на сайте снабжена картинкой и кратким описанием, что делает серфинг по блогу очень приятным. Возможно, вы скажете, что script.aculo.us дает достаточные количество интересных эффектов, но я думаю посетив данную страничку вы убедитесь в обратном. &#169; AJAX Planet, [...]]]></description>
			<content:encoded><![CDATA[<p>Автор <noindex><a href="http://www.miniajax.com/">сайта miniajax</a></noindex> попытался собрать наиболее эффектные и красивые примеры работ всевозможных AJAX скриптов и библиотек, каждая ссылка на сайте снабжена картинкой и кратким описанием, что делает серфинг по блогу очень приятным. Возможно, вы скажете, что script.aculo.us дает достаточные количество интересных эффектов, но я думаю посетив данную страничку вы убедитесь в обратном.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>, <a href="http://www.ajaxplanet.ru/category/uncategorized/" title="Просмотреть все записи в рубрике &laquo;Без рубрики&raquo;" rel="category tag">Без рубрики</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>И снова ASP.NET AJAX 1.0</title>
		<link>http://www.ajaxplanet.ru/i-snova-aspnet-ajax-10/</link>
		<comments>http://www.ajaxplanet.ru/i-snova-aspnet-ajax-10/#comments</comments>
		<pubDate>Wed, 31 Jan 2007 07:39:06 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[atlas]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>
		<category><![CDATA[cheat-sheet]]></category>
		<category><![CDATA[безопасность]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/i-snova-aspnet-ajax-10/</guid>
		<description><![CDATA[Как и было обещано после выхода ASP.NET AJAX 1.0 (codename Atlas), были выпущены и исходники всего пакета. Исходники включают и код серверной интеграции с ASP.NET (в том числе такие базовые контролы, как UpdatePanel, UpdateProgress и ScriptManager). ASP.NET AJAX JavaScript library (она же &#8221;Microsoft AJAX Library&#8221;) выпущена под лицензией Microsoft Permissive (Ms-PL). Исходники всех контролов, входящих в ASP.NET AJAX Control Toolkit и [...]]]></description>
			<content:encoded><![CDATA[<p>Как и было <noindex><a href="http://weblogs.asp.net/scottgu/archive/2007/01/23/asp-net-ajax-1-0-released.aspx">обещано после выхода ASP.NET AJAX 1.0</a></noindex> (codename Atlas), были <noindex><a href="http://weblogs.asp.net/scottgu/archive/2007/01/30/asp-net-ajax-1-0-source-code-released.aspx">выпущены и исходники</a></noindex> всего пакета. Исходники включают и код серверной интеграции с ASP.NET (в том числе такие базовые контролы, как UpdatePanel, UpdateProgress и ScriptManager).</p>
<p>ASP.NET AJAX JavaScript library (она же &#8221;Microsoft AJAX Library&#8221;) выпущена под лицензией <noindex><a href="http://www.microsoft.com/resources/sharedsource/licensingbasics/permissivelicense.mspx">Microsoft Permissive (Ms-PL)</a></noindex>. Исходники всех контролов, входящих в ASP.NET AJAX Control Toolkit и разрабатываемые в рамках <a target="_blank" href="http://www.codeplex.com/AtlasControlToolkit">CodePlex Project</a></noindex> были доступны и ранее.</p>
<p>К выходу итогового релизы приурочено и появление <noindex><a href="http://www.aspnetresources.com/blog/ms_ajax_cheat_sheets_batch2.aspx">Microsoft AJAX Library cheat sheets </a></noindex>(как бы корректнее перевести &#8220;cheat sheet&#8221;? ну не &#8220;шпаргалка&#8221; же!).</p>
<p>Кроме того, рекомендую почитать <noindex><a href="http://smarx.com/posts/asp-net-ajax-security-webcasts-miss-the-point.aspx">очень любопытную статью, касающуюся безопасности в ASP.NET AJAX</a></noindex> и еще одну <noindex><a href="http://smarx.com/posts/ajax-enabled-vista-sidebar-gadgets.aspx">про использование ASP.NET AJAX в Vista sidebar</a></noindex></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/i-snova-aspnet-ajax-10/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/i-snova-aspnet-ajax-10/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/i-snova-aspnet-ajax-10/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google Web Toolkit. Небольшое руководство</title>
		<link>http://www.ajaxplanet.ru/google-web-toolkit-manual/</link>
		<comments>http://www.ajaxplanet.ru/google-web-toolkit-manual/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 05:35:17 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JAXA]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/google-web-toolkit-manual/</guid>
		<description><![CDATA[0. О статье. Это перевод статьи Джоана Хуртадо (Juan Hurtado) &#8220;GWT Small Guide&#8221;. Оригинал доступен на испанском и английском. Возможно перевод получится грубым, так как я очень торопился, буду рад узнать ваше мнение насчет качества перевода. Потапов Геннадий (TermiT) 1. Введение. 1.1. Презентация Я написал это небольшое руководство для людей, которые хотят научится создавать динамические [...]]]></description>
			<content:encoded><![CDATA[<p><strong>0.  О статье.</strong></p>
<blockquote><p>Это перевод статьи <noindex><a href="http://angel.hurtado.googlepages.com/">Джоана Хуртадо (Juan Hurtado)</a></noindex> &#8220;GWT Small Guide&#8221;. Оригинал доступен на <noindex><a href="http://angel.hurtado.googlepages.com/tutorialgwt">испанском</a></noindex> и <noindex><a href="http://angel.hurtado.googlepages.com/tutorialgwt2">английском</a></noindex>. Возможно перевод получится грубым, так как я очень торопился, буду рад узнать ваше мнение насчет качества перевода.</p>
</blockquote>
<p style="text-align: right;"><noindex><a href="http://toodoo.ru/user/4530/profile">Потапов Геннадий (TermiT)</a></noindex></p>
<div>
<p><strong>1. Введение.</strong></p>
<p><strong>1.1. Презентация</strong><br />
Я написал это небольшое руководство для людей, которые хотят научится создавать динамические приложения пользуясь <noindex><a href="http://code.google.com/webtoolkit/">GWT</a></noindex> (Google Web Toolkit) в AMP (Apache MySQL PHP)  среде. Основная идея в том, чтобы написать небольшой и очень простое приложение с использованием <noindex><a href="http://www.php.net/">PHP</a></noindex> и <noindex><a href="http://www.mysql.com/">MySQL</a></noindex> на стороне сервера, GWT для реализации интерфейса, <noindex><a href="http://www.json.org/">JSON</a></noindex> для обмена данными между клиентской и северной частями.</p>
<p><strong>1.2. О JSON</strong><br />
JSON (JavaScript Object Notation) &#8211; это легкий и удобный формат обмена данными. Отличительной чертой является то, что он прост и понятен для человека. Этот формат легко обрабатывается и генерируется программами. Он основан на языке <noindex><a href="http://www.crockford.com/javascript" title="JavaScript">JavaScript</a></noindex>, <noindex><a href="http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf" title="ECMA-262" rel="nofollow">Standard ECMA-262 3rd Edition — December 1999</a></noindex>. JSON — это текстовый формат, не зависящий от языка программирования. JSON использует соглашения близкие к Си-подобным языкам, включая C, C++, C#, Java, JavaScript, Perl, Python, и много других. Все это делает JSON идеальным языком для обмена данными. Вы можете найти много полезной информации о JSON здесь <noindex><a href="http://www.json.org/" title="JSON">www.json.org</a></noindex> (и тут: <noindex><a href="http://ru.wikipedia.org/wiki/JSON">ru.wikipedia.org/wiki/JSON</a></noindex>)</p>
<p><strong>1.3. О GWT</strong><br />
GWT (Google Web Toolkit) &#8211; это инструмент позволяющий легко создавать AJAX (<noindex><a href="http://ru.wikipedia.org/wiki/AJAX">ru.wikipedia.org/wiki/AJAX</a></noindex>) приложения на языке JAVA, проще говоря, GWT &#8220;переводит&#8221; ваш JAVA код в HTML и JavaScript. Подробнее о GWT  можно прочесть по адресу <noindex><a href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a></noindex></p>
<p><strong>1.4. Об этом руководстве</strong><br />
Мы сделаем небольшое приложение для поиска информации по сотрудникам в базе данных MySQL, используя в качестве параметра поиска имя сотрудника.</p>
<p><strong>2. Работа над серверной частью.</strong></p>
<p><strong>2.1. База данных</strong><br />
Нам нужна всего одна таблица, которая будет называться &#8216;directory&#8217;, и которую мы заполним информацией о сотрудниках:</p>
<p><noindex><a href="http://angel.hurtado.googlepages.com/database.png/database-full.jpg"><img src="http://angel.hurtado.googlepages.com/database.png/database-full.jpg" src="http://angel.hurtado.googlepages.com/database.png/database-full.jpg" alt="" width=470 border="0" /></a></noindex><br />
<strong>2.2. PHP скрипт</strong><br />
Для доступа к данным базы напишем PHP скрипт. Он будет выбирать данные и преобразовывать в JSON формат. Для этого будем использовать JSON PHP class, который можно скачать отсюда <noindex><a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198">http://pear.php.net/pepr/pepr-proposal-show.php?id=198</a></noindex>. Этот класс позволяет преобразовывать значения из PHP в JSON формат и отправлять их браузеру. Файл &#8216;index.php&#8217; будет содержать следующий код:</p>
<p><code lang="php"><br />
< ?</p>
<p>// вызов JSON.php<br />
require_once(”JSON.php”);</p>
<p>// коннект к базе</p>
<p>$conector = mysql_connect(’localhost’, ‘root’, ‘juan’) or die(mysql_error());<br />
mysql_select_db(’JSONPHP’) or die(mysql_error());</p>
<p>//формируем запрос</p>
<p>$sqlQuery = “SELECT * FROM directory WHERE name LIKE ‘”. $_REQUEST[’tosearch’]. “%’”;<br />
$dataReturned = mysql_query($sqlQuery) or die(mysql_error());<br />
$i = 0;</p>
<p>while($row = mysql_fetch_array($dataReturned)){</p>
<p>// заполняем массив $value данными.</p>
<p>$value{”item”}{$i}{”Employe Number”}= $row[’enumber’];<br />
$value{”item”}{$i}{”Name”}= $row[’name’];<br />
$value{”item”}{$i}{”Position”}= $row[’position’];<br />
$value{”item”}{$i}{”Phone Number”}= $row[’phnumber’];<br />
$value{”item”}{$i}{”Location”}= $row[’location’];<br />
$i++;<br />
}</p>
<p>// использую JSON.php конвертируем данные в JSON формат и отправляем в браузер</p>
<p>$json = new Services_JSON();<br />
$output = $json->encode($value);<br />
print($output);<br />
?>
</p>
<p></code></p>
<p>И это весь код. Вывод этого php скрипта должен быть похож на следующие:<code>{"item":[{<br />
"Employe Number":"110009",<br />
"Name":"Juan Hurtado",<br />
"Position":"System Analist",<br />
"Phone Number":"81001121",<br />
"Location":"Monterrey City"}]<br />
} </code>Теперь пора заняться интерфейсом и GWT.</p>
<p><strong>3. Работа над клиентской частью.</strong></p>
<p><strong>3.1 Пример с JSON RPC</strong><br />
На сайте http://code.google.com/webtoolkit/ есть несколько примеров использования GWT. Один из них показывает, как использовать GWT  в связке с JSON для доступа к сервису <noindex><a href="http://www.yahoo.com/">Yahoo</a></noindex>.  Мы возьмем за основу нашего интерфейса пример JSON RPC, который можно скачать <noindex><a href="http://code.google.com/webtoolkit/documentation/examples/jsonrpc/">тут</a></noindex>.</p>
<p><strong>3.2 Создание нового приложения</strong><br />
Используя  projectCreator.cmd (этот файл находится в дистрибутиве GWT) создадим новый проект:<br />
<code>C:\&gt;projectCreator.cmd -eclipse PHPJSON -out PHPJSON<br />
Created directory PHPJSON\src<br />
Created file PHPJSON\.project<br />
Created file PHPJSON\.classpath</code><br />
Теперь создадим новый проект для eclipse с помощью <noindex><a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.Fundamentals.CommandLineTools.applicationCreator.html">applicationCreator.cmd</a></noindex>:<br />
C:\&gt;applicationCreator.cmd -eclipse PHPJSON -out PHPJSON com.juan.client.PHPJSON</p>
<p>Created directory PHPJSON\src\com\juan<br />
Created directory PHPJSON\src\com\juan\client<br />
Created directory PHPJSON\src\com\juan\public<br />
Created file PHPJSON\src\com\juan\PHPJSON.gwt.xml<br />
Created file PHPJSON\src\com\juan\public\PHPJSON.html<br />
Created file PHPJSON\src\com\juan\client\PHPJSON.java<br />
Created file PHPJSON\PHPJSON.launch<br />
Created file PHPJSON\PHPJSON-shell.cmd<br />
Created file PHPJSON\PHPJSON-compile.cmd</p>
<p>Пример JSON RPC содержит классы, которые позволяют обрабатывать иформацию в формате JSON. (Тут говорится о старой версии примера JSON RPC; в новой версии примера JSON RPC эти файлы не идут в дистрибутиве примера, так как эти классы стали стандартными в новой версии GWT. Но никто не мешает вам следовать примеру, все это будет работать и с новой версией GWT)  Скопируем из примера следующие файлы в папку PHPJSON\src\com\juan\client:</p>
<ul>
<li>JSONArray.java
</li>
<li>JSONBoolean.java
</li>
<li>JSONException.java
</li>
<li>JSONNumber.java
</li>
<li>JSONObject.java
</li>
<li>JSONParser.java
</li>
<li>JSONString.java
</li>
<li>JSONValue.java</li>
</ul>
<p>Во всех файлах нужно заменить строчку с данными о пути пакета. (в нашем случае нужно заменить package com.google.gwt.sample.json.client; на package com.juan.client;) Также исправьте пути в файле JSONParser.java. Затем импортируем наш проект в Eclipse как написано в <noindex><a href="http://code.google.com/webtoolkit/gettingstarted.html#NewEclipse">документации по GWT</a></noindex>. Запустите Eclipse и кликните в меню File -&gt; Import. В появившемся окне выберите пункт &#8216;Existing Projects into Workspace&#8217;, укажите путь к файлу .project в следующем окне. После этого вы должны увидеть ваш GWT проект:</p>
<p><noindex><a href="http://photos1.blogger.com/blogger2/2623/301412589031540/1600/eclipse.jpg"><img src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/eclipse.jpg" src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/eclipse.jpg" alt="" border="0" /></a></noindex><br />
Создадим класс JSONRequester и опишем следующие метод:</p>
<p><code lang="JavaScript"><br />
public Widget initializeMainForm() {<br />
/*<br />
* Иницилизация и установка панели, которая будет содержать<br />
* поисковую форму и вывод результата<br />
*/</code></p>
<p>FocusPanel fpn = new FocusPanel();<br />
Grid gd = new Grid(1,2);</p>
<p>b1.setText(”Search”);<br />
b1.addClickListener(new SearchButtonClickListener());</p>
<p>gd.setWidget(0, 0, txtBox);<br />
gd.setWidget(0, 1, b1);</p>
<p>gdOut.setWidget(0,0,gd);</p>
<p>gdOut.setBorderWidth(1);<br />
gdOut.setWidth(”500px”);</p>
<p>childGrid.setCellPadding(0);<br />
childGrid.setCellSpacing(0);<br />
childGrid.setWidth(”490px”);</p>
<p>fpn.add(gdOut);</p>
<p>return fpn;<br />
}</p>
<p>Как вы видете создается элемент <noindex><a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.user.client.ui.FocusPanel.html">FocusPanel</a></noindex>, затем мы прикрепляем эелемент <noindex><a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.user.client.ui.Grid.html">Grid</a></noindex>(Сетка), на этой сетке располагаем все нужные элементы. В обработчике клика по кнопке создается класс SearchButtonClickListener, которые будет содержать следующие строки:</p>
<p><code lang="JavaScript"><br />
private class SearchButtonClickListener implements ClickListener {</code></p>
<p>public void onClick(Widget sender) {<br />
/*<br />
* Когда пользователь нажимает кнопку мы получаем URL.<br />
*/<br />
itemNumber = 0;<br />
doFetchURL();<br />
}</p>
<p>private void doFetchURL() {<br />
/*<br />
* Получаем URL и вызываем обработчик<br />
*/<br />
b1.setText(”Searching …”);<br />
if (!HTTPRequest.asyncGet(DEFAULT_SEARCH_URL + “?tosearch=” + txtBox.getText(),</p>
<p>new JSONResponseTextHandler())) {</p>
<p>b1.setText(”Search”);<br />
}<br />
}<br />
}</p>
<p>Этот класс содержит метод doFetchURL(), с помощью которого находится URL и вызывается класс JSONResponseTextHandler() для выполнения операций над JSON документом:</p>
<p><code lang="JavaScript"><br />
private class JSONResponseTextHandler implements ResponseTextHandler {</code></p>
<p>public void onCompletion(String responseText) {<br />
/*<br />
* После того, как полученны данные в формате JSON мы<br />
* обрабатываем их и выводим результат<br />
*/ </p>
<p>JSONObject jsonObject;<br />
try {<br />
jsonObject = JSONParser.parse(responseText);<br />
displayJSONObject(jsonObject);</p>
<p>} catch (JSONException e) {</p>
<p>}</p>
<p>b1.setText(”Search”);</p>
<p>}</p>
<p>private void displayJSONObject(JSONObject jsonObject) {<br />
/*<br />
* Очищаем Grid(сетку) и заполняем новыми результатами<br />
*/</p>
<p>childGrid.clear();<br />
requestChildrenGrid(jsonObject);<br />
gdOut.setWidget(1,0,childGrid);</p>
<p>}</p>
<p>private void requestChildrenGrid(JSONValue jsonValue){<br />
/*<br />
* Заполнение Grid(сетки)<br />
*/</p>
<p>JSONObject jsonObject;<br />
if(jsonValue.isArray() != null){<br />
for(int i = 0; i < jsonValue.isArray().size();i++){<br />
requestChildrenGrid(jsonValue.isArray().get(i));<br />
childGrid.setWidget(itemNumber,0,new HTML(”<br />
<hr />”));<br />
childGrid.setWidget(itemNumber,1,new HTML(”<br />
<hr />”)); </p>
<p>itemNumber++;<br />
int resizeNumber = itemNumber + 1;<br />
childGrid.resize(resizeNumber,2);<br />
}<br />
} else {</p>
<p>if ((jsonObject = jsonValue.isObject()) != null) {<br />
String[] keys = jsonObject.getKeys();</p>
<p>for (int i = 0; i < keys.length; ++i) {<br />
String key = keys[i];<br />
childGrid.setWidget(itemNumber,0,new HTML(”<b>”+ key +”:”));<br />
childGrid.setWidget(itemNumber,1,new HTML(jsonObject.get(key).toString()));<br />
requestChildrenGrid(jsonObject.get(key));</b></p>
<p>itemNumber++;<br />
int resizeNumber = itemNumber + 1;<br />
childGrid.resize(resizeNumber,2);<br />
}<br />
} else if (jsonValue != null) {<br />
//</p>
<p>} else {<br />
//<br />
}</p>
<p>}<br />
}</p>
<p>} </p>
</p>
<p>Все эти методы из файла JSON.java гугловкого примера <noindex><a href="http://code.google.com/webtoolkit/documentation/examples/jsonrpc/">JSON RPC</a></noindex>.  Метод requestChildrenGrid(JSONValue jsonValue) разбивает JSON документ на ключи и значения, ключи обрамляются тэгами &#8220;&lt;B&gt;&#8221;и прикрепляются к Grid(сетке), которая в свою очередь прикрепляется к FocusPanel. И наконец, в файле PHPJSON.java мы выводим результат на главную панель:</p>
<p><code lang="JavaScript">public void onModuleLoad() {<br />
/*<br />
* Для красоты используем TabPanel<br />
*/<br />
TabPanel tp = new TabPanel();<br />
JSONRequester myJson = new JSONRequester();</code></p>
<p>tp.add(myJson.initializeMainForm() ,”Corporate Directory”);</p>
<p>tp.selectTab(0);</p>
<p>RootPanel.get().add(tp);<br />
}</p>
<p>Вот как должно выглядеть приложение в результате:</p>
<p><noindex><a href="http://photos1.blogger.com/blogger2/2623/301412589031540/1600/web.jpg"><img src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/web.jpg" src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/web.jpg" alt="" border="0" /></a></noindex><br />
Вы можете скачать код клиентской и серверной части <noindex><a href="http://angel.hurtado.googlepages.com/proyecto.tgz">отсюда</a></noindex>. Надеюсь, это небольшой пример вам помог.
</p>
</div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/google-web-toolkit-manual/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/google-web-toolkit-manual/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/google/" title="Просмотреть все записи в рубрике &laquo;Google&raquo;" rel="category tag">Google</a>, <a href="http://www.ajaxplanet.ru/category/java/" title="Просмотреть все записи в рубрике &laquo;Java&raquo;" rel="category tag">Java</a>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/google-web-toolkit-manual/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Выпущен ASP.NET AJAX 1.0</title>
		<link>http://www.ajaxplanet.ru/asp-net-ajax-1-released/</link>
		<comments>http://www.ajaxplanet.ru/asp-net-ajax-1-released/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 07:43:12 +0000</pubDate>
		<dc:creator>darius</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/asp-net-ajax-1-released/</guid>
		<description><![CDATA[Вчера официально зарелизился ASP.NET AJAX 1.0. В принципе, никаких неожиданностей, всё происходит в полном соответствии с давно объявленными планами. Подробно о релизе можно прочесть в блоге Скотта Гатри (Scott Guthrie) &#169; AJAX Planet, 2007. &#124; Постоянная ссылка &#124; Комментарии Интересна эта тема? Посмотрите архив сообщений по теме AJAX, atlas, Microsoft, Библиотеки и фреймворки.]]></description>
			<content:encoded><![CDATA[<p>Вчера официально зарелизился <noindex><a href="http://ajax.asp.net/">ASP.NET AJAX 1.0</a></noindex>. В принципе, никаких неожиданностей, всё происходит в полном соответствии с <noindex><a href="http://www.ajaxplanet.ru/microsoft-atlas-plans/">давно объявленными планами</a></noindex>. Подробно о релизе можно прочесть в <noindex><a href="http://weblogs.asp.net/scottgu/archive/2007/01/23/asp-net-ajax-1-0-released.aspx">блоге Скотта Гатри (Scott Guthrie)</a></noindex></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/asp-net-ajax-1-released/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/asp-net-ajax-1-released/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/asp-net-ajax-1-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP for Microsoft AJAX Library</title>
		<link>http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/</link>
		<comments>http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 07:23:02 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/</guid>
		<description><![CDATA[Как известно, ASP.NET AJAX, ранее известный как Atlas, про который я достаточно много писал, исходно создавался для работы с ASP.Net. Впрочем, сама библиотека Microsoft AJAX Library &#8212; это чистый JavaScript, который можно скачать отдельно и попытаться использовать независимо от ASP.Net. Сегодня появился первый публичный релиз проекта &#8220;PHP for Microsoft AJAX Library, небольшой библиотечки, которая призвана [...]]]></description>
			<content:encoded><![CDATA[<p>Как известно, <noindex><a href="http://ajax.asp.net/">ASP.NET AJAX</a></noindex>, ранее известный как <noindex><a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/">Atlas, про который я достаточно много писал</a></noindex>, исходно создавался для работы с ASP.Net. Впрочем, сама библиотека Microsoft AJAX Library &#8212; это чистый JavaScript, который можно скачать отдельно и попытаться использовать независимо от ASP.Net. </p>
<p>Сегодня появился первый публичный релиз проекта &#8220;<noindex><a href="http://codeplex.com/phpmsajax">PHP for Microsoft AJAX Library</a></noindex>, небольшой библиотечки, которая призвана облегчить использование Microsoft AJAX Library в приложениях, написанных на PHP. Проект открытый, базируется на и выпущен под Microsoft Permissive License.</p>
<p>Пока лишь альфа-релиз, и, при наличии множества конкурирующих библиотек, судьба проекта туманна. В качестве примера приведу код с использованием PHP for Microsoft AJAX Library, работающий с веб-сервисом. По построению на ASP.Net было бы то же самое: </p>
<p><strong>HelloService.php:</strong></p>
<p><code lang="php">< ?php</p>
<p>require_once ‘../../dist/MSAjaxService.php’;</p>
<p>class HelloService extends MSAjaxService<br />
{<br />
function SayHello($name)<br />
{<br />
return "Hello, " . $name . "!";<br />
}<br />
}</p>
<p>$h = new HelloService();<br />
$h->ProcessRequest();</p>
<p>?></p>
<p></code></p>
<p><strong>index.html:</strong></p>
<p><code lang="HTML"><br />
<html><br />
<head></p>
<p><script type="text/javascript" src="../../MicrosoftAjaxLibrary/MicrosoftAjax.js"></script><br />
<script type="text/javascript" src="HelloService.php/js"></script><br />
</head><br />
<body><br />
Name:<br />
<input id="name" type="text" />
<input type="button" value="Say Hello" onclick="button_click(); return false;" />
<br />
Response from server: <span id="response"></span><br />
</body><br />
<script type="text/javascript">
function button_click() {
HelloService.SayHello($get(’name’).value, function (result) {
$get(’response’).innerHTML = result;
});
}
</script><br />
</html></p>
<p></code></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ошибки при работе с Ajax</title>
		<link>http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/</link>
		<comments>http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 09:34:17 +0000</pubDate>
		<dc:creator>2tl</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[Alex-Bosworth]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/</guid>
		<description><![CDATA[Наш читатель Илья Колесников (2tl) перевел и прислал уже достаточно старую, но от того не менее важную и интересную серию заметок Алекса Босворта (Alex Bosworth). Сейчас мы уже несколько свыклись с такой технологией, как AJAX, но всё же зачастую видно его использование просто ради самого использования, или применения без оглядки на удобство для пользователей. Надеюсь, [...]]]></description>
			<content:encoded><![CDATA[<p>Наш читатель Илья Колесников (2tl) перевел и прислал уже достаточно старую, но от того не менее важную и интересную серию <noindex><a href="http://alexbosworth.backpackit.com/pub/67688">заметок Алекса Босворта (Alex Bosworth)</a></noindex>. Сейчас мы уже несколько свыклись с такой технологией, как AJAX, но всё же зачастую видно его использование просто ради самого использования, или применения без оглядки на удобство для пользователей. Надеюсь, что статья будет пусть не нова, но полезна для многих разработчиков. </p>
<p>Ajax &#8212; это опасная для веб-разработчиков технология, она способна создать множество проблем как с пользовательским интерфейсом, так и с серверной составляющей и нагрузкой на сервер. Я составил сводный список ошибок разработчиков, использующих Ajax.</p>
<p>Этот список скопирован из моего блога: <noindex><a href="http://sourcelabs.com/ajb/archives/2005/05/ajax_mistakes.html">Alex Bosworth’s Weblog: Ajax Mistakes</a></noindex></p>
<p>Не согласны? Готовы назвать еще одну ошибку? Что ж, эта статья имеет свою страницу на сайте <noindex><a href="http://swik.net/Ajax/Ajax+Mistakes">SWiK.net</a></noindex></p>
<p>Так же рекомендую посетить страницу wiki  <noindex><a href="http://swik.net/Ajax/Places+To+Use+Ajax">places to use Ajax</a></noindex></p>
<h2>Заметки</h2>
<h3>Использование Ajax ради Ajax.</h3>
<p>Конечно, Ajax это круто, и разработчики любят играть с крутыми технологиями, но Ajax инструмент, а не игрушка. Множество новых Ajax приложений в действительности лишь маленькие игрушки, разработанные не для реальных целей, а всего лишь эксперименты в том, что Ajax может делать, или же попытки использовать Ajax где-нибудь, где он не нужен. Игрушки могут быть интересны короткое время, но игрушки &#8212; это не полезные приложения.</p>
<h3>Поломка кнопки «Назад».</h3>
<p>Кнопка «Назад» – огромная функциональная возможность стандартного пользовательского интерфейса веб-сайта. К сожалению, она плохо работает с JavaScript. Сохранение функциональности кнопки «Назад» – главная причина для того, чтобы не делать веб-приложение только на JavaScript.</p>
<h3>Отсутствие видимого сигнала о происходящем действии.</h3>
<p>Если я кликаю по кнопке, вызывающей Ajax-функцию, вы должны дать мне визуальный сигнал, что что-то происходит. Пример этого – сообщение о загрузке на GMail, расположенное справа вверху. Всякий раз, когда я делаю что-нибудь в GMail, маленький красный прямоугольник в верхнем правом углу показывает, что страница загружается. Он замещает стандартную функцию пользовательского интерфейса браузера &#8211; отображение процесса загрузки новой страницы, т.к. Ajax этого не поддерживает.</p>
<h3>Оставляя офлайн пользователей позади.</h3>
<p>Так как границы применения веб-приложений раздвигаются все шире и шире, вскоре все приложения переместятся в веб. Инициализация, подготовка к работе &#8211; лучше, всемирная модель доступа &#8211; это здорово, эксплуатация и конфигурация &#8211; классная, изучение пользовательского интерфейса &#8211; проще и быстрее.</p>
<p>Тем не менее, люди, имеющие нестабильное соединение с Интернетом, или люди, которые не хотят переходить на веб-приложения, должны иметь те же возможности при работе с новым поколением Ajax приложений, что и все остальные. То, что технология передовая, не означает, что люди готовы и желают работать с ней. При проектировании веб-приложений, в крайнем случае, надо предполагать оффлайн доступ. У GMail это POP, Backpackit имеет интеграцию с SMS. В Enterprise это веб-сервисы.</p>
<h3>Не заставляйте меня ждать Ajax.</h3>
<p><noindex><a href="http://www.spreadfirefox.com/?q=affiliates&amp;id=198986&amp;t=218">Со вкладками FireFox&#8217;а</a></noindex> я могу управлять различным задержками на веб-сайтах и обычно я вынужден ждать только загрузки страницы. В случае AJAX-приложения и плохого соединения с Интернетом я могу получить действительно ужасное время взаимодействия с интерфейсом, потому что каждый раз, когда я что-либо делаю, я должен ждать ответа сервера. Помоги мне Боже, если я должен обратиться к диску сервера, прежде чем продолжить. Такие приложения могут даже <noindex><a href="http://www.lastcraft.com/blog/index.php?p=19">заставить меня думать, что Ajax &#8212; это не круто</a></noindex>.</p>
<h3>Отправление важной информации в открытом виде.</h3>
<p>Безопасность AJAX приложений подчиняется тем же принципам, что и безопасность любого веб-приложения, кроме того, не надо забывать о безопасности при передаче данных при асинхронном запросе. Весь трафик должен проверяться, чтобы удостовериться в его достоверности.</p>
<h3>Разработка AJAX приложений – это разработка для одной платформы.</h3>
<p>Создание Ajax приложений &#8211; это кросс-платформенная разработка. Код Ajax выполняется JavaScript-движком IE, Rhino (JavaScript-движок мозиллы), или другим, менее популярным движком, который, тем не менее, может внезапно стать популярным. То есть, соответствия только со стандартным JavaScript недостаточно, необходимо тестирование для большинства приложений. Большая трудоёмкость создания хорошего Javascript кода вызвана глючностью реализации JavaScript в IE, хотя есть <noindex><a href="http://jgwebber.blogspot.com/2005/05/drip-ie-leak-detector.html">утилиты для облегчения разработки кода JavaScript под IE</a></noindex>.</p>
<h3>Слишком много кода замедляет браузер.</h3>
<p>Ajax представляет возможность сделать JavaScript приложения более интересными. К сожалению, «интересными» часто означает больше выполняющегося кода. Больше кода – больше работы для браузера, а это значит, особенно для некоторых плохо написанных скриптов, что вам нужен более производительный центральный процессор, чтобы функциональность оставалось «живой». Производительность CPU раньше действительно была ограничением функциональности JavaScript, и то, что компьютеры стали быстрее, не означает, что проблема исчезла.</p>
<h3>Отсутствие альтернатив для тех, у кого нет или отключен JavaScript.</h3>
<p>Согласно <noindex><a href="http://www.w3schools.com/browsers/browsers_stats.asp">статистике W3C по использования браузеров</a></noindex>, которая неизбежно показывает перекос в сторону популярных браузеров, у 11 % пользователей JavaScript отключен. Так что, если ваше приложение полностью зависит от JavaScript, вы сразу же теряете десятую часть вашей аудитории.</p>
<h3>Изобретение нового в пользовательском интерфейсе.</h3>
<p>Главная ошибка, которую легко сделать, используя Ajax: &#8220;щелкни по этой непонятной штуке и получи неочевидный результат&#8221;. Конечно, пользователи, которые используют приложение некоторое время, могут выучить, что если по этой области кликнуть и удерживать кнопку нажатой, то эту область можно перетащить и оставить на новом месте. Но пока эта возможность не станет общей для большинства пользователей, вы лишь увеличите сложность и время на изучение вашего приложения, а это большой минус для любой программы.</p>
<h3>Изменение состояний с помощью ссылок (GET запросы).</h3>
<p>Как я отметил в предыдущей заметке, Ajax приложения создают множество проблем для пользователей, который полагают, что GET операции не меняют состояние приложения. Зависимость состояния приложения от ссылки &#8211; проблема не только для поисковых роботов, но и для пользователей, которые привыкли к навигации по ссылкам – они будут озадачены тем, что ссылки используются для смены состояния.</p>
<h3>Неожиданное мигание и изменение элементов страницы.</h3>
<p>Первая буква А в Ajax означает асинхронный. Проблема асинхронных сообщений в том, что вполне можно сбиться с толку, когда они вдруг выскакивают. Изменения на асинхронной странице должны происходить в строго определенном месте, и они должны быть ожидаемы. Вспыхивающие и мигающие сообщения, на которых я не хочу концентрироваться, напоминают о html-теге «blink».</p>
<h3>Отсутствие ссылок, которые я могу послать друзьям или сохранить в закладки.</h3>
<p>Другая великолепная возможность веб-сайтов: я могу переслать ссылки другим людям, и они увидят то же, что вижу я. Ещё я могу сохранить адрес в закладках и позже вернуться к нему. JavaScript и Ajax приложения, могут создать множество проблем при такой схеме использования. Как только JavaScript начинает вместо сервера динамически генерировать страницу, её адрес больше не может использоваться для навигации. Очень нежелательно терять такую возможность, и многие Ajax приложения имеют специально сконструированные ссылки, чтобы избежать этого.</p>
<h3>Не применение локальных изменений к другим частям страницы.</h3>
<p>Так как Ajax/JavaScript дает вам потрясающий контроль над содержанием страницы, то легко можно сфокусироваться на одной области страницы и совсем забыть об общей картине. Например, заголовок на Backpackit. Если вы меняете заголовок страницы в Backpackit, он немедленно заменяется в правой части страницы, но не меняется главный заголовок (тег title). При работе с Ajax вы должны думать о картине в целом, даже когда делаете локальные изменения.</p>
<h3>Асинхронное выполнение групповых операций.</h3>
<p>Конечно, с помощью Ajax вы можете менять значения одновременно во множестве полей формы, но и это может вызвать кучу проблем. Например, если я отмечу несколько чекбоксов, каждый из которых пошлет асинхронный запрос к серверу, я потеряю возможность отслеживать изменения чекбоксов, и этот неупорядоченный процесс будет раздражать и сбивать с толку.</p>
<h3>Прокрутка страницы и потеря места чтения.</h3>
<p>Другая проблема с появляющимся текстом &#8211; он может вызвать прокрутку страницы. Я могу спокойно читать страницу, как вдруг асинхронный JavaScript решит вставить параграф перед моим текстом, опуская мой текст ниже. Разумеется такое поведение раздражает и тратит мое время &#8211; я должен возвращаться туда, где остановился.</p>
<h3>Блокирование поисковых машин.</h3>
<p>Ajax приложения, которые загружают много текста без перезагрузки страницы, могут стать большой проблемой для поисковых машин. Это похожу на проблему с адресами. Если пользователи могут приходить с поисковых машин, некоторый текст приложения должен быть статичным, чтобы поисковые роботы могли его индексировать.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Prototype 1.5</title>
		<link>http://www.ajaxplanet.ru/prototype-15/</link>
		<comments>http://www.ajaxplanet.ru/prototype-15/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 05:47:27 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[документация]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/prototype-15/</guid>
		<description><![CDATA[Пока экологи активно спорили, сколько мегаватт мог бы сберечь Google для  человечества, переключившись на черный дизайн, вышла новая версия, пожалуй, самой популярной AJAX-библиотеки, Prototype. С выходом новой версии разработчики заодно переехали на новый сайт prototypejs.org и, что особенно ценно, выпустили новую документацию, а заодно обратились с просьбой помочь в разработке документации в дальнейшем. Новая документация [...]]]></description>
			<content:encoded><![CDATA[<p>Пока экологи активно <noindex><a href="http://ecoiron.blogspot.com/2007/01/black-google-would-save-3000-megawatts.html">спорили, сколько мегаватт мог бы сберечь Google для  человечества, переключившись на черный дизайн</a></noindex>, вышла новая версия, пожалуй, самой популярной AJAX-библиотеки, Prototype. С выходом новой версии разработчики заодно переехали на новый сайт<a target="_blank" href="http://prototypejs.org/"> prototypejs.org</a></noindex> и, что особенно ценно, выпустили новую документацию, а заодно <a target="_blank" href="http://encytemedia.com/blog/articles/2006/10/31/prototype-a-call-for-documentation">обратились с просьбой помочь в разработке документации в дальнейшем</a></noindex>.</p>
<p>Новая документация включает:</p>
<ul>
<li><a target="_blank" href="http://prototypejs.org/learn">Tips and Tutorials</a></noindex></li>
<li><a target="_blank" href="http://prototypejs.org/api">API Reference</a></noindex></li>
<li><a target="_blank" href="http://prototypejs.org/blog">Blog</a></noindex></li>
</ul>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/prototype-15/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/prototype-15/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/prototype-15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX MVC</title>
		<link>http://www.ajaxplanet.ru/ajax-mvc/</link>
		<comments>http://www.ajaxplanet.ru/ajax-mvc/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 05:30:19 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Stoyan-Stefanov]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/ajax-mvc/</guid>
		<description><![CDATA[Немного вводных&#8230; В последнее время я писал достаточно мало. Особенно мало было материалов по программированию. Да и то, что я писал непосредственно про AJAX в большинстве случаев касалось ASP.Net &#8212; ну что ж поделать, именно на нём я делаю самые большие проекты. Впрочем, это однобокий подход &#8212; не надо забывать и мир LAMP. Итак, сегодня [...]]]></description>
			<content:encoded><![CDATA[<p>Немного вводных&#8230; В последнее время я писал достаточно мало. Особенно мало было материалов по программированию. Да и то, что я писал непосредственно про AJAX в большинстве случаев касалось ASP.Net &#8212; ну что ж поделать, именно на нём я делаю самые большие проекты. Впрочем, это однобокий подход &#8212; не надо забывать и мир LAMP. Итак, сегодня в блоге появляется статья, переведенная Геннадием Потаповым. Надеюсь, статья будет полезна, и Генадий достойно подхватит флаг из моей ныне сломанной руки.</p>
<p><strong>О статье</strong><br />
Автор заметки <noindex><a href="http://www.phpied.com/">Stoyan Stefanov</a></noindex>, он известен своими статьями о PEAR (скорей всего вы сталкивались с его статьей <noindex><a href="http://www.phpied.com/db-2-mdb2/">DB to MDB2</a></noindex>), MySQL и AJAX. Речь пойдет о раскладке AJAX под MVC (казалось бы, вещь элементарная, но на самом деле легко допустить ошибку) и о мини-фреймворке, который предлагает вам автор. Критика по перевод приветствуется.</p>
<p><strong>AJAX MVC<br />
</strong>Это своего рода фреймворк для создания AJAX приложений, основанных на MVC паттерне. Да, я назвал много модных словечек, признаю, но это не должно восприниматься в серьез. Недавно я работал над несколькими небольшими проектами и как-то случайно (это вообще не входило в мои планы), разработал для себя маленький фреймворк. Потом, я заметил, что этот скрипт и его организация схож с MVC. Так как должен быть построен MVC когда мы имеем смесь толстого и тонкого клиента, HTML, JavaScript, XMLHttpRequest, PHP и СSS?<strong><br />
</strong><br />
<strong>Как обычно работают AJAX приложения:</strong></p>
<ol>
<li>у нас есть HTML страничка, оформленная CSS</li>
<li>вы куда ни будь кликаете</li>
<li>JavaScript отправляет запрос на сервер (PHP скрипту)</li>
<li>JavaScript обновляет содержимое HTML страницы</li>
</ol>
<p><strong>Реализуем MVC паттерн</strong><br />
Итак, так какая часть будет отвечать за Model (Модель), View (Вид) и Controller (Контроллер)? С Моделью все просто, это бизнес логика: запись в базу и т.п. Модель &#8211; PHP скрипт. Вид? Очевидно это HTML страница, оформленная CSS. Надо заметить, что JavaScript, который будет обновлять страницу, тоже часть Вида. Неважно как это реализовано: innerHTML в JavaScript’e или DOM, в любом случае это часть HTML. А что насчет Контроллера? У нас будет два контроллера. Один на серверной части, PHP скрипт который будет получать запросы, и запрашивать у Модели данные. Другой на стороне клиента, JavaScript, который решает, что случится по нажатию кнопки и отправляет соответствующий AJAX запрос PHP контролеру. Поэтому я буду рассматривать любые действия JavaScript, включающие отлавливание событий и отправку HTTP запросов как часть Контролера. Схема:<br />
<img align="middle" src="http://www.lovequotes.ru/img/mvc-ajax.png" alt="Схема" /></p>
<p>В действии (пример)<br />
Чтобы оправдать концепцию мы рассмотрим небольшое приложение в качестве примера. Простая HTML страница с кнопкой, оформленная CSS. Она содержит два JavaScript’a отвечающих за события (Контролер) и за обновления страницы (Вид). Также страница будет содержать два вспомогательных JavaScript’а, так как я использую YUI (Yahoo User Interface) библиотеку. JavaScript’овый Контролер будет связан с кнопкой, по нажатию этой кнопки он отправит запрос PHP Контролеру. PHP Контролер (просто switch) разбирает запрос и вызывает соответствующий объект бизнес модели. В нашем случае «объект модели» это простая функция, но вы легко можете ее расширить. Модель возвращает (в JSON формате) ответ, в нашем случае это список установленных расширений PHP. Теперь используя полученные данные, JavaScript Вида обновляет содержимое страницы. Затем Вид вызывает другую функцию из JavaScript’ого Контролера, которая добавляет новые обработчики событий для нового контента. (Оп, тут небольшая ошибочка, было бы лучше, если бы ответы Модели отлавливались JavaScript’овым контролером, который бы активировал обработчики обновления JavaScript’ового вида, в любом случае это легко исправить)</p>
<p><strong>Структура каталогов:</strong><br />
<img src="http://www.phpied.com/wp-content/uploads/2006/09/ajax-mvc-dir.png" alt="Структура каталогов" /></p>
<p><strong>Код для примера</strong><br />
Мы добрались до самого интересного – реализации. Начнем с простого .html страницы, главной части вида.</p>
<p>Index.html:</p>
<p><code lang="html"><br />
< ?xml version=”1.1″ encoding=”iso-8859-1″?><br />
< !DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”<br />
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”></p>
<p><html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en”><br />
<head></p>
<link rel=”stylesheet” href=”../view/styles.css” mce_href=”../view/styles.css” type=”text/css” media=”all” title=”Default styles” />
<script language=”javascript” type=”text/javascript” src=”../_extras/yui/build/yahoo/yahoo-min.js” mce_src=”../_extras/yui/build/yahoo/yahoo-min.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../_extras/yui/build/event/event-min.js” mce_src=”../_extras/yui/build/event/event-min.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../_extras/yui/build/connection/connection-min.js” mce_src=”../_extras/yui/build/connection/connection-min.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../view/updates.js” mce_src=”../view/updates.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../controller/behaviours.js” mce_src=”../controller/behaviours.js”></script><br />
</head><br />
<body></p>
<p>Welcome to my app!<br />
</p>
<form action=”" method=”post”>
<input type=”button” name=”b” id=”thebutton” value=”I’m a button, click me!” />
</form>
<div id=”content”> </div>
<p></body><br />
</html><br />
</code></p>
<p>Это фрагмент из behaviours.js:</p>
<p><code lang="javascript">// класс событий<br />
var behaviours = {<br />
phpcontroller: "../controller/switch.php?request=",<br />
// продолжаются behaviour.methods ….<br />
}</p>
<p>// загрузка страницы, добавляем onload событие<br />
YAHOO.util.Event.addListener(<br />
'thebutton', 'click', behaviours.theButtonClick);<br />
</code></p>
<p>Теперь, когда пользователь кликнет по кнопке, вызовется метод behaviours.theButtonClick(), что в свою очередь отправит запрос PHP контролеру и сообщит ему тип запроса: &#8220;loadSomething&#8221;:</p>
<p><code lang="javascript">theButtonClick: function(e) {<br />
alert('Ouch! nnOK, I'll make a request for ya, buddy!');<br />
YAHOO.util.Connect.asyncRequest (<br />
'GET',<br />
behaviours.phpcontroller + 'loadSomething',<br />
{success: updates.writeContent}<br />
);<br />
},</code></p>
<p>PHP контроллер (controller/switch.php) получит запрос, пройдет switch (проверит тип запроса) и вызовет соответствующую (в нашем случае простую) функцию из бизнес модели. Полный код switch.php:</p>
<p><code lang="php"><br />
< ?php<br />
// если это запрос<br />
if (empty($_GET[’request’])) {<br />
die();<br />
}<br />
// получить бизнес-логику<br />
include_once ‘../model/business.php’;</p>
<p>// разбор запроса<br />
// и вызов объекта логики<br />
switch ($_GET[’request’])<br />
{<br />
case ‘loadSomething’:<br />
echo loadSomething();<br />
break;<br />
case ‘loadSomeMore’: // не используется, только для примера<br />
echo loadSomeMore();<br />
break;<br />
}<br />
?><br />
</code></p>
<p>Функция loadSomething() из PHP модели получает список установленных PHP расширений, кодируем в JSON и отправляем назад. Полный листинг ../model/business.php:</p>
<p><code lang="php">< ?php<br />
function loadSomething() {<br />
$extensions = get_loaded_extensions();<br />
return ‘[”‘. implode(’”,”‘, $extensions) . ‘”]’;<br />
}<br />
?></code></p>
<p>Если вернуться назад и взглянуть на AJAX запрос, можно увидеть, что в случае успеха, я вызываю метод updates.writeContent(). В ../view/updates.js содержится код обновления исходной html страницы, который создает HTML таблицу с результатами (списком расширений PHP). Потом я хотел прикрепить листенер к новой таблице, но это уже работа JavaScript’ового Контролера. Полный листинг updates.js:</p>
<p><code lang="javascript">var updates = {<br />
writeContent: function (xmlhttp) {<br />
if (!xmlhttp.responseText) {<br />
alert("I got nothing from the server");<br />
}<br />
var data = eval(xmlhttp.responseText);<br />
var write_to = document.getElementById('content');<br />
write_to.innerHTML = '';</p>
<p>var html2dom_root = write_to;<br />
var table = document.createElement("table");<br />
var table_1_tbody = document.createElement("tbody");<br />
for (var i in data) {<br />
table_1_tbody_2_tr = document.createElement("tr");<br />
table_1_tbody_2_tr_1_td = document.createElement("td");<br />
num = 1 + parseInt(i);<br />
table_1_tbody_2_tr_1_td_1_text = document.createTextNode(num);<br />
table_1_tbody_2_tr_1_td.appendChild(table_1_tbody_2_tr_1_td_1_text);<br />
table_1_tbody_2_tr.appendChild(table_1_tbody_2_tr_1_td);<br />
table_1_tbody_2_tr_2_td = document.createElement("td");<br />
table_1_tbody_2_tr_2_td_1_text = document.createTextNode(data[i]);<br />
table_1_tbody_2_tr_2_td.appendChild(table_1_tbody_2_tr_2_td_1_text);<br />
table_1_tbody_2_tr.appendChild(table_1_tbody_2_tr_2_td);<br />
table_1_tbody.appendChild(table_1_tbody_2_tr);<br />
}<br />
table.appendChild(table_1_tbody);<br />
html2dom_root.appendChild(table);</p>
<p>behaviours.updateTableBehaviour();<br />
}<br />
}<br />
</code></p>
<p>(Кстати, чтобы облегчить себе жизнь, при работе с DOM, я использовал свою небольшую утилиту <noindex><a href="http://www.html2dom.com/">html2dom</a></noindex>)</p>
<p>И, наконец, оставшаяся часть JavaScript’ового Контролера (behaviours.js): метод behaviours.updateTableBehaviour(), который добавляет листенер к новой таблице и метод trClick(), который отлавливает клики по этой таблице. По клику просто меняется цвет выбранной строки.</p>
<p><code lang="javascript">trClick: function (e) {<br />
var target = (e.srcElement) ?<br />
e.srcElement.parentNode : e.target.parentNode;<br />
if (target.tagName == 'TR') {<br />
if (target.className == 'tr-on') {<br />
target.className = '';<br />
} else {<br />
target.className = 'tr-on';<br />
}<br />
}<br />
},<br />
updateTableBehaviour: function () {<br />
var el = document.getElementById('content').firstChild;<br />
YAHOO.util.Event.addListener(<br />
el, 'click', behaviours.trClick);<br />
}</p>
<p></code></p>
<p><strong>Демо и исходники</strong><br />
• <noindex><a href="http://www.phpied.com/files/ajax-mvc/view/">Demo</a></noindex> – on-line демонстрация<br />
• <noindex><a href="http://www.phpied.com/files/ajax-mvc/ajaxmvc.zip">Zipped demo</a></noindex> – весь исходный код этого примера<br />
• <noindex><a href="http://www.phpied.com/files/ajax-mvc/ajax-core.zip">Template</a></noindex> – исходный код примера, но часть кода закомментирована, так что вы можете использовать его в качестве шаблона для ваших будущий AJAX проектов. Единственное, что нужно сделать &#8211; кинуть <noindex><a href="http://sourceforge.net/projects/yui">YUI</a></noindex> в папку _extras/yui.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/ajax-mvc/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/ajax-mvc/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/ajax-mvc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
