<?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>jQuery и другое... &#187; json</title>
	<atom:link href="http://www.linkexchanger.su/category/json/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Sun, 08 Jan 2012 13:25:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Официальные плагины jQuery: Templates plugin</title>
		<link>http://www.linkexchanger.su/2010/619.html</link>
		<comments>http://www.linkexchanger.su/2010/619.html#comments</comments>
		<pubDate>Mon, 01 Nov 2010 13:13:03 +0000</pubDate>
		<dc:creator>Андрей</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery документация]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[jQuery Plugins]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/?p=619</guid>
		<description><![CDATA[4 октября 2010 года была опубликована запись в официальном блоге jQuery об анонсе трёх плагинов jQuery, созданных при поддержке команды Microsoft. Эти плагины &#8211; плагин шаблонов (the jQuery Templates plugin), плагин привязки данных (the jQuery Data Link plugin) и плагин глобализации (the jQuery Globalization plugin) &#8211; получили статус “Официальные плагины проекта jQuery” (officially supported plugins [...]]]></description>
			<content:encoded><![CDATA[<p>4 октября 2010 года была опубликована <a href="http://blog.jquery.com/2010/10/04/new-official-jquery-plugins-provide-templating-data-linking-and-globalization/">запись в официальном блоге jQuery</a> об анонсе трёх плагинов jQuery, созданных при поддержке команды Microsoft. Эти плагины &#8211; <strong>плагин шаблонов (the jQuery Templates plugin)</strong>, <strong>плагин привязки данных (the jQuery Data Link plugin)</strong> и <strong>плагин глобализации (the jQuery Globalization plugin)</strong> &#8211; получили статус “Официальные плагины проекта jQuery” (officially supported plugins of the jQuery project).</p>
<p>Плагин шаблонов используется при необходимости вывести объект данных или массив объектов в разметку страницы. Плагин привязки данных нужен для связи объектов с элементами страницы и синхронного изменения значений. Плагин глобализации позволяет выводить такие данные, как числа, дата и время, сумма денег и т.п., на страницу в соответствии с форматом текущего языка.</p>
<p>Следует отметить, что команда Microsoft использовала свои немалые наработки в этих направлениях, как и команда проекта jQuery, и при хорошо сложившемся взаимодействии получились, на мой взгляд, отличные инструменты для разработчиков. В подтверждение моего мнения могу добавить, что разработчики jQuery анонсировали включение плагинов шаблонов и привязки данных в ядро библиотеки jQuery уже версии 1.5, а плагина глобализации &#8211; в соответствующую версию jQuery UI. Плагины пока ещё не получили статус релиза, но уже активно ведется написание документации на сайте <a href="http://api.jquery.com/">http://api.jquery.com</a>. К слову, команда Microsoft последовала традициям разработки jQuery и разместила материалы по разработке плагинов на github.com, где доступны описание и исходники плагинов.</p>
<p>В этой статье я расскажу немного о плагине шаблонов.<br />
<span id="more-619"></span></p>
<h2>jQuery Templates plugin</h2>
<p>Начнём с простенького примера:</p>
<pre class="brush: xml;">&lt;script id=&quot;movieTemplate&quot; type=&quot;text/x-jquery-tmpl&quot;&gt;
  &lt;li&gt;&lt;b&gt;${Name}&lt;/b&gt; (${ReleaseYear})&lt;/li&gt;
&lt;/script&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
var movies = [
  { Name: &quot;The Red Violin&quot;, ReleaseYear: &quot;1998&quot; },
  { Name: &quot;Eyes Wide Shut&quot;, ReleaseYear: &quot;1999&quot; },
  { Name: &quot;The Inheritance&quot;, ReleaseYear: &quot;1976&quot; }
];

$( &quot;#movieTemplate&quot; ).tmpl( movies )
    .appendTo( &quot;#movieList&quot; );
&lt;/script&gt;

&lt;ul id=&quot;movieList&quot;&gt;&lt;/ul&gt;</pre>
<p>Итак, в примере разработчик страницы описал шаблон для вывода объектов в виде разметки (первый элемент <strong><em>script</em></strong>), потом получил откуда-то массив объектов <strong><em>movies </em></strong>и вызвал инструкцию сгенерировать нужную разметку по шаблону, взяв данные из предоставленного массива объектов, а результат добавить в конец списка <strong><em>#movieList</em></strong>.<br />
В результате работы плагина мы получим такую разметку:</p>
<pre class="brush: xml;">&lt;ul id=&quot;movieList&quot;&gt;
  &lt;li&gt;&lt;b&gt;The Red Violin&lt;/b&gt; (1998)&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;Eyes Wide Shut&lt;/b&gt; (1999)&lt;/li&gt;
  &lt;li&gt;&lt;b&gt;The Inheritance&lt;/b&gt; (1976)&lt;/li&gt;
&lt;/ul&gt;</pre>
<p>А теперь по сути вопроса.<br />
<strong> Что делает плагин?</strong><br />
Плагин получает на вход строку шаблона и множество объектов (или один объект), которые нужно вывести в строку (или разметку) с форматированием.<br />
<strong> Где это применяется?</strong><br />
В основном этот плагин полезен при динамическом выводе объектов JS на страницу, объекты могут быть получены самыми разными способами, например, при разчётах или по результатам каких-то действий пользователя и, конечно самый часто приводимый пример, в виде JSON в ответе сервера на AJAX запрос.</p>
<h3>Методы плагина</h3>
<p><strong><span style="text-decoration: underline">.tmpl( [ data ], [ options ] )</span></strong><br />
Получает содержимое первого выбранного элемента и использует его в качестве шаблона для форматированного вывода указанных данных.<br />
<strong><em> data </em></strong> &#8211; данные для вывода в шаблон (объект или массив объектов).<br />
<strong><em> options </em></strong> &#8211; опционально, определённое пользователем расширение в виде пар ключ-значение для объекта вывода в шаблон.<br />
<strong><span style="text-decoration: underline"> jQuery.tmpl(template, [ data ], [ options ])</span></strong><br />
Использует указанный шаблон для форматированного вывода указанных данных.<br />
<strong><em> template </em></strong> &#8211; шаблон для форматирования данных, может быть одного из следующих типов: строка с разметкой, HTML-элемент (в том числе и в jQuery-обёртке), строка, соответствующая имени ранее скомпилированного шаблона.<br />
<strong><em> data, options</em></strong> &#8211; имеют то же значение, что и выше<br />
<strong><span style="text-decoration: underline"> .tmplItem()</span></strong><br />
Возвращает для первого выбранного элемента структуру (объект) с результатами работы шаблонизатора. Возвращаемый методом объект обеспечивает доступ к:</p>
<ul>
<li> HTML-частям, из которых состоит шаблон</li>
<li> ассоциированной единице переданных данных</li>
<li> родительскому шаблону, если текущий шаблон является вложенным</li>
<li> текущему шаблону, использованному для вывода</li>
<li> определённому пользователем расширению (полям и методам), переданным в параметр options метода tmpl()</li>
</ul>
<p>Этот метод используется, напрмер, когда после проведенного форматирования данных требуется узнать, а какие же данные были использованы при формировании некоторого куска разметки, или для обновления куска разметки с использованием новых данных.<br />
<strong><span style="text-decoration: underline"> jQuery.tmplItem( element )</span></strong><br />
Аналогичен методу .tmplItem, только структура с результатами работы шаблонизатора ищется для элемента <strong><em>element </em></strong> (HTML-элемент, в том числе и в jQuery-обёртке).<br />
<strong><span style="text-decoration: underline"> .template( [ name ] )</span></strong><br />
Метод делает из содержимого первого выбранного элемента скомпилированную версию шаблона форматирования.<br />
<strong><em> name </em></strong> &#8211; необязательно имя шаблона, если имя указано, то потом можно использовать его для обращения к этому шаблону в методе <strong><em>jQuery.tmpl(name, data, options)</em></strong><br />
<strong><span style="text-decoration: underline"> jQuery.template( [ name, ] template )</span></strong><br />
Метод аналогичен описанному выше, только здесь шаблон передаётся в качестве параметра <strong><em>template </em></strong> &#8211; это может быть строка, строка с разметкой, HTML-элемент (в том числе и в jQuery-обёртке).</p>
<h3>Синтаксис шаблона</h3>
<p>Я вкратце приведу описание нескольких самых основных элементов шаблона, остальное надеюсь более подробно описать в следующей статье (если будет положительный отклик на эту статью)<br />
<strong><span style="text-decoration: underline"> ${fieldNameOrExpression} и {{= fieldNameOrExpression}}</span></strong><br />
Позволяет вставить в шаблон значение поля (свойства) объекта данных, может быть также использовано для вставки результата метода или js-выражения. Напрмер, <strong><em>&laquo;${Name}&raquo;</em></strong> &#8211; вставит в шаблон значение поля obj.Name, а при том, что Languages &#8211; это поле объекта, которому присвоен массив, <strong><em>&laquo;${Languages.length}&raquo;</em></strong> &#8211; вставит в шаблон длину этого массива, и наконец, если у объекта есть метод getLanguages с двумя параметрами, то <strong><em>&laquo;${getLanguages(Languages, &#8216; &#8211; &#8216;)}&raquo;</em></strong> &#8211; вставит в шаблон результат работы этого метода.<br />
<strong><span style="text-decoration: underline"> {{html fieldNameOrExpression}}</span></strong><br />
Элемент шаблона ${field} (или {{= field}}) вставляет в результат значение указанного поля в виде текста, т.е. если в строке будут HTML-теги, то они будут закодированы, а не преобразованы в разметку. Если вам требуется вставить данные в шаблон именно в виде HTML-разметки, то надо использовать синтаксис <strong><em>{{html &lt;что нужно вставить&gt;}}</em></strong>.<br />
Для начала работы с плагином уже достаточно рассказано, могу лишь добавить, что синтаксис шаблонов позволяет вставлять вложенные шаблоны, условные инструкции, обращаться к некоторым объектам JS и jQuery и ещё кое-что&#8230; Остальное &#8211; материал будущей статьи.</p>
<h3>Источники</h3>
<p>Статья написана по материалам, найденным во всемирной паутине. В основном это перевод официальной документации. Оригиналы можно посмотреть по следующим ссылкам:</p>
<ul>
<li> <a href="http://blog.jquery.com/2010/10/04/new-official-jquery-plugins-provide-templating-data-linking-and-globalization/"> Сообщение в блоге jQuery</a> и <a href="http://weblogs.asp.net/scottgu/archive/2010/10/04/jquery-templates-data-link-and-globalization-accepted-as-official-jquery-plugins.aspx"> в блогах MS</a></li>
<li> <a href="http://api.jquery.com/category/plugins/templates/"> Страница документации плагина</a> (примеры взяты оттуда)</li>
</ul>
<h3>Об авторе</h3>
<p>Зовут меня Зайцев Андрей, <a href="http://blog.zalab.net/">мой маленький блог</a>, профиль на форуме <a href="http://linkexchanger.su/forum/memberlist.php?mode=viewprofile&amp;u=106">zandroid</a></p>
<p>Это моя первая статья в этом блоге, надеюсь, и не последняя <img src='http://www.linkexchanger.su/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Большое спасибо Геннадию за возможность публикации и за полезные советы по написанию и оформлению материала.</p>
<h3>Примеры</h3>
<p><strong>Пример 1: Динамическое переключение применяемого шаблона</strong></p>
<pre class="brush: xml;">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;style&gt;
    table { cursor:pointer; border-collapse:collapse; border:2px solid blue; width:300px; margin:8px; }
    table tr { border:1px solid blue; color:blue; background-color:#f8f8f8; } table td { padding:3px; } table tr:hover { color:red; }
    .movieDetail { background-color:yellow; } .movieDetail.row1 { border-bottom:none; } .movieDetail.row2 { border-top:none; }
  &lt;/style&gt;
  &lt;script src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;
  &lt;script src=&quot;http://nje.github.com/jquery-tmpl/jquery.tmpl.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;script id=&quot;summaryTemplate&quot; type=&quot;text/x-jquery-tmpl&quot;&gt;
  &lt;tr class='movieSummary'&gt;&lt;td colspan='2'&gt;${Name}&lt;/td&gt;&lt;/tr&gt;
&lt;/script&gt;

&lt;script id=&quot;detailTemplate&quot; type=&quot;text/x-jquery-tmpl&quot;&gt;
  &lt;tr class='movieDetail row1'&gt;&lt;td colspan='2'&gt;${Name}&lt;/td&gt;&lt;/tr&gt;&lt;tr class='movieDetail row2'&gt;&lt;td&gt;${ReleaseYear}&lt;/td&gt;&lt;td&gt;Director: ${Director}&lt;/td&gt;&lt;/tr&gt;
&lt;/script&gt;

Click for details:
&lt;table&gt;&lt;tbody id=&quot;movieList&quot;&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
var movies = [
  { Name: &quot;The Red Violin&quot;, ReleaseYear: &quot;1998&quot;, Director: &quot;François Girard&quot; },
  { Name: &quot;Eyes Wide Shut&quot;, ReleaseYear: &quot;1999&quot;, Director: &quot;Stanley Kubrick&quot; },
  { Name: &quot;The Inheritance&quot;, ReleaseYear: &quot;1976&quot;, Director: &quot;Mauro Bolognini&quot; }
];
var selectedItem = null;

/* Render the summaryTemplate with the &quot;movies&quot; data */
$( &quot;#summaryTemplate&quot; ).tmpl( movies ).appendTo( &quot;#movieList&quot; );

/* Add onclick handlers for movie template items
using the summary or details template */
$(&quot;#movieList&quot;)
  .delegate( &quot;.movieSummary&quot;, &quot;click&quot;, function () {
    if (selectedItem) {
      // Set the template on the previously selected item
      // back to the summary template
      selectedItem.tmpl = $( &quot;#summaryTemplate&quot; ).template();
      selectedItem.update();
    }
    /* Get the data structure for the template item
       which this clicked element belongs to, and make
       it the selected item */
    selectedItem = $.tmplItem(this);

    /* Set the template on this item to the detail template */
    selectedItem.tmpl = $( &quot;#detailTemplate&quot; ).template();
    selectedItem.update();
  })
  .delegate( &quot;.movieDetail&quot;, &quot;click&quot;, function () {
    /* Set the template on this item to the summary template */
    selectedItem.tmpl = $( &quot;#summaryTemplate&quot; ).template();
    selectedItem.update();
    selectedItem = null;
  });
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Довольно сложный и объемный, в нём используются сразу несколько методов плагина, взят с <a href="http://api.jquery.com/jquery.tmplitem/"> этой страницы</a>.</p>
<p><strong>Пример 2: Вставка данных с разметкой в шаблон</strong></p>
<pre class="brush: xml;">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;style&gt;
    .role {font-weight:bold;font-style: italic;} #movieContainer {padding-left: 8px;}
  &lt;/style&gt;
  &lt;script src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;
  &lt;script src=&quot;http://nje.github.com/jquery-tmpl/jquery.tmpl.js&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;script id=&quot;movieTemplate&quot; type=&quot;text/x-jquery-tmpl&quot;&gt;
  &lt;h4&gt;${Name}&lt;/h4&gt;
  &lt;p&gt;{{html Synopsis}}&lt;/p&gt;
&lt;/script&gt;

&lt;div id=&quot;movieContainer&quot;&gt;&lt;/div&gt;

&lt;script&gt;
/* The Synopsis data field contains HTML markup. */
var movie = {
  Name: &quot;Meet Joe Black&quot;,
  Synopsis: &quot;The &lt;span class='role'&gt;grim reaper&lt;/span&gt; (&lt;a href='http://www.netflix.com/RoleDisplay/Brad_Pitt/73919'&gt;Brad Pitt&lt;/a&gt;) visits &lt;span class='role'&gt;Bill Parrish&lt;/span&gt; (&lt;a href='http://www.netflix.com/RoleDisplay/Anthony_Hopkins/43014'&gt;Anthony Hopkins&lt;/a&gt;)...&quot;
};

/* Render the template with the movie data.
   The template uses the {{html}} template tag
   to  insert the Synopsis HTML markup data. */
$( &quot;#movieTemplate&quot; ).tmpl( movie )
  .appendTo( &quot;#movieContainer&quot; );
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
<p>В этом примере в шаблон добавляются как простые строковые значения полей, так и значения с разметкой, взято вот с <a href="http://api.jquery.com/template-tag-html/"> этой страницы</a>.</p>
<h3>P.S.</h3>
<p>Примеры не стал расписывать, если аудитория поддержит мои начинания, то можно пошагово расписать что, как и почему, и привести ещё несколько примерчиков.</p>
<p>Вопросы по плагину прошу задавать на <a href="/forum/">форуме</a>, если есть комменты именно по статье &#8211; то комментируйте ниже.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2010/619.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Каскад раскрывающихся списков</title>
		<link>http://www.linkexchanger.su/2009/82.html</link>
		<comments>http://www.linkexchanger.su/2009/82.html#comments</comments>
		<pubDate>Fri, 06 Feb 2009 09:00:42 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[список]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/82.html</guid>
		<description><![CDATA[При создании приложений для Web часто бывает необходимо установить в элементе select варианты выбора, значения которых зависят от параметров другого элемента select. Простой пример &#8211; выбор страны в одном раскрывающемся списке приводит к загрузке в следующий такой список перечня автомобилей, производимых в этой стране. А при выборе марки автомобиля, в следующий список загружаются модели этого [...]]]></description>
			<content:encoded><![CDATA[<p>При создании приложений для Web часто бывает необходимо установить в элементе <strong>select</strong> варианты выбора, значения которых зависят от параметров другого элемента <strong>select</strong>. Простой пример &#8211; выбор страны в одном раскрывающемся списке приводит к загрузке в следующий такой список перечня автомобилей, производимых в этой стране. А при выборе марки автомобиля, в следующий список загружаются модели этого авто. Вот и давайте попробуем вместе решить эту задачу, создав <strong>каскад раскрывающихся списков</strong>.<span id="more-82"></span></p>
<p>Для начала определим задачу: первый список будет содержать предварительно загруженные названия стран и всегда находиться в активном состоянии. Два оставшихся списка &#8211; выбора авто и выбора модели, пустые и находятся в неактивном состоянии. После того, как в первом списке будет выбрана страна необходимо заполнить второй список названиями автомобилей и перевести его в активное состояние. А после выбора названия автомобиля &#8211; заполнить список названиями моделей именно этого автомобиля и тоже активировать список. Кроме того, мы должны гарантировать, что пользователь никогда не сможет выбрать автомобиль &laquo;HONDA Vectra произведеный в Ю.Корее&raquo;. Для обмена данными с сервером будем использовать популярный нынче формат JSON.</p>
<p>Итак, задача определена. Поехали?</p>
<p>Начнем с чего-нибудь очень простого. Например с подключения библиотеки jQuery и создания HTML-разметки:</p>
<p>В HEAD страницы подключаем библиотеку:</p>
<pre class="brush: xml;">&lt;script src=&quot;js/jquery-1.3.1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>В BODY создаем HTML-разметку:</p>
<pre class="brush: xml;">
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Страна&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;country&quot;&gt;
    &lt;option value=&quot;&quot;&gt;Выбрать страну&lt;/option&gt;
    &lt;option value=&quot;1&quot;&gt;Германия&lt;/option&gt;
    &lt;option value=&quot;2&quot;&gt;Ю.Корея&lt;/option&gt;
    &lt;option value=&quot;3&quot;&gt;Япония&lt;/option&gt;
  &lt;/select&gt;
&lt;/div&gt;
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Автомобиль&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;auto&quot; disabled=&quot;disabled&quot;&gt;&lt;/select&gt;
&lt;/div&gt;
&lt;div class=&quot;border&quot;&gt;
  &lt;label&gt;Модель&lt;/label&gt;&lt;br /&gt;
  &lt;select id=&quot;model&quot; disabled=&quot;disabled&quot;&gt;&lt;/select&gt;
&lt;/div&gt;
</pre>
<p>Легко и просто! Каждому списку &#8211; по id. Первый раскрывающийся список заполняем названиями стран. Два других ничем не заполняем и мало того, устанавливаем в неактивное состояние с помощью атрибута disabled. Описания стилей я приводить не буду &#8211; это дело вкуса каждого и не в тему этой статьи.</p>
<p>Что дальше? Задача оказалась не так уж и проста, как казалось в начале. Поэтому предлагаю пораскинуть мозгами и решить, какие  общие действия мы будем производить над всеми списками. Я придумал два &#8211; заполнение списка и очистка списка. Давайте оформим  эти операции в виде методов jQuery, чтобы иметь возможность в любой момент вызвать этот метод в цепочке команд jQuery.</p>
<blockquote><p>Расширение для jQUery может быть либо методом, оперирующим с набором элементов, либо вспомогательной функцией, которая определяется непосредственно в $. Простой пример: в составе библиотеки есть метод <strong>each(callback)</strong>, который работает как раз с набором элементов, выполняя функцию, определенную в параметре callback в контексте каждого элемента набора и вспомогательная функция <strong>$.each(object,callback)</strong>, которая применяется для обхода массива или объекта, переданного в первом параметре с выполнением функции callback для каждого элемента массива(объекта). Почувствовали разницу?</p></blockquote>
<pre class="brush: jscript;">(function($){
  // очищаем select
  $.fn.clearSelect = function() {
    return this.each(function(){
      if(this.tagName=='SELECT') {
        this.options.length = 0;
        $(this).attr('disabled','disabled');
      }
    });
  }
  // заполняем select
  $.fn.fillSelect = function(dataArray) {
    return this.clearSelect().each(function(){
      if(this.tagName=='SELECT') {
        var currentSelect = this;
        $.each(dataArray,function(index,data){
          var option = new Option(data.text,data.value);
          if($.support.cssFloat) {
            currentSelect.add(option,null);
          } else {
            currentSelect.add(option);
          }
        });
      }
    });
  }
})(jQuery);</pre>
<p>Итак, что мы тут написали?</p>
<p>При написании метода <strong>clearSelect()</strong> мы воспользовались методом <strong>each(callback)</strong> для того, чтобы произвести необходимые операции над каждым элементом, переданным в наборе jQuery. Сначала производим проверку &#8211; если <strong>tagName</strong> переданного элемента действительно SELECT, то удаляем все элементы option и устанавливаем атрибуту disabled значение disabled.</p>
<p>Метод <strong>fillSelect(dataArray)</strong> несколько сложнее. Он получает в качестве параметра массив dataArray, содержащий данные, которыми необходимо заполнить выпадающий список. Правда перед тем, как заполнять список, мы вызовем метод <strong>clearSelect</strong>, чтобы очистить список от возможно оставшихся там данных. С помощью метода <strong>each(callback)</strong> мы перебираем все элементы, переданные в наборе jQuery, проверяем, действительно ли это элемент select и, если да, то сначала запоминаем его в переменной currentSelect. Затем воспользуемся вспомогательной функцией <strong>$.each(object,callback)</strong> для обхода массива dataArray. В каждой итерации создаем элемент options, заполняем его соответствующими данными и добавляем в select.</p>
<p>При добавлении option мы вынуждены учитывать различия между браузерами. К счастью и тут поможет jQuery. Здесь используем новую вспомогательную функцию <strong>$.support</strong>, которая появилась в jQuery с версии 1.3 взамен <strong>$.browser</strong>. Проверим значение свойства <strong>cssFloat</strong> &#8211; false укажет нам на IE, а true на FF, Opera, Safari. Вы можете применить свой способ проверки.</p>
<blockquote><p>Обратите внимание: при написании метода <strong>fillSelect(dataArray)</strong> мы использовали метод <strong><a href="http://docs.jquery.com/Core/each#callback">each(callback)</a></strong> и вспомогательную функцию <strong><a href="http://docs.jquery.com/Utilities/jQuery.each#objectcallback">$.each(object,callback)</a></strong> &#8211; это разные вещи.</p></blockquote>
<p>Теперь оба наших новых метода могут работать с набором элементов jQuery, который им будет передан. Этот код можно было бы вынести в отдельный файл &#8211; к тому же эти методы могут пригодиться и в других приложениях, а использовать их можно проще простого:</p>
<pre class="brush: jscript;">
// очищаем select
$('select').clearSelect();
// заполняем select
$('select').fillSelect(dataArray);</pre>
<p>Двигаемся дальше. Теперь мы напишем пару функций, которые будут обслуживать списки выбора автомобиля и выбора модели.</p>
<pre class="brush: jscript;">
// выбор автомобиля
function adjustAuto(){
  var countryValue = $('#country').val();
  var tmpSelect = $('#auto');
  if(countryValue.length == 0) {
    tmpSelect.attr('disabled','disabled');
    tmpSelect.clearSelect();
    adjustModel();
  } else {
    $.getJSON(
      'cascadeSelectAuto.php',
      {country:countryValue},
      function(data) {
        tmpSelect.fillSelect(data).attr('disabled','');
        adjustModel();
    });
  }
};</pre>
<p>Здесь мы сначала запоминаем в переменной <strong>countryValue</strong> значение, выбранное в списке стран <strong>#country</strong>. В переменной <strong>tmpSelect</strong> будем хранить ссылку на элемент select с идентификатором <strong>#auto</strong> &#8211; список выбора автомобиля. Далее следует проверка:</p>
<p>Если страна не выбрана, то мы устанавливаем атрибуту disabled элемента select с идентификатором <strong>#auto</strong> значение &#8216;disabled&#8217; и вызываем метод <strong>clearSelect()</strong> для очистки этого списка от возможно находящихся там значений. Также мы вызовем функцию <strong>adjustModel()</strong> (про нее чуть позже).</p>
<p>Иначе, мы отправляем с помощью вспомогательной функции <strong>$.getJSON</strong> запрос к файлу <strong>cascadeSelectAuto.php</strong>, передавая в качестве данных значение, сохраненное в переменной <strong>countryValue</strong>. При получении ответа сервера вызываем функцию, в которой определена нужная нам последовательность действий. А именно &#8211; к переменной <strong>tmpSelect</strong> (не забыли &#8211; это список с идентификатором <strong>#auto</strong>) применяем нами же написанный метод <strong>fillSelect(data)</strong>, который заполнит список данными, которые получены от сервера и наконец переводим элемент в активное состояние с помощью атрибута disabled. Остается не забыть вызвать функцию <strong>adjustModel()</strong>, чтобы обработать выпадающий список моделей.</p>
<p>Функция <strong>adjustModel()</strong>, которая обрабатывает список моделей, очень похожа на <strong>adjustAuto()</strong>, поэтому нет смысла ее детально рассматривать. Обратите внимание разве на то, что теперь мы запоминаем значение из списка не только выбранной страны, но и выбранного автомобиля. И еще в <strong>if &#8211; else</strong> не вызываем что-то похожее на <strong>adjustModel()</strong>, поскольку список выбора модели у нас последний &#8211; дальше обрабатывать просто нечего.</p>
<pre class="brush: jscript;">
// выбор модели
function adjustModel(){
  var countryValue = $('#country').val();
  var autoValue = $('#auto').val();
  var tmpSelect = $('#model');
  if(countryValue.length == 0||autoValue.length == 0) {
    tmpSelect.attr('disabled','disabled');
    tmpSelect.clearSelect();
  } else {
    $.getJSON(
      'cascadeSelectModel.php',
      {country:countryValue,auto:autoValue},
      function(data) {
        tmpSelect.fillSelect(data).attr('disabled','');
    });
  }
};</pre>
<p>Поздравляю! Самая сложная часть пути уже позади! Остались сущие пустяки.</p>
<pre class="brush: jscript;">$('#country').change(function(){
  adjustAuto();
}).change();</pre>
<p>Связываем с выпадающим списком стран событие <strong>change(fn)</strong>, при наступлении которого вызываем <strong>adjustAuto()</strong> &#8211; функцию, которая заполнит выпадающий список автомобилей. В цепочке команд вызываем <strong>change()</strong>, чтобы вызвать событие при начальной загрузке страницы.</p>
<pre class="brush: jscript;">$('#auto').change(adjustModel);</pre>
<p>С выпадающим списком автомобилей связываем событие <strong>change(fn)</strong>, при наступлении которого будет выполнена функция <strong>adjustModel()</strong>, которая заполнит список моделей.</p>
<pre class="brush: jscript;">$('#model').change(function(){
  if($(this).val().length != 0) {
    alert('Выбор сделан!');
  }
});</pre>
<p>И наконец, при изменении списка моделей выполним небольшую проверку &#8211; если действительно выбрана какая-либо модель, выведем в <strong>alert</strong> сообщение. Ну а в действительности тут можно придумать все, что угодно. Например вывести подробную информацию о технических характеристиках, красивую фотографию авто, чтобы его захотелось купить и конечно цену&#8230;</p>
<p>Ах, да! Совсем забыл &#8211; работающий пример:<br />
<iframe src="http://www.linkexchanger.su/jquery_articles/cascadeSelect.html" style="border: medium none " width="420" height="100"></iframe></p>
<blockquote><p>Вы можете открыть <strong><a href="http://www.linkexchanger.su/jquery_articles/cascadeSelect.html" target="_blank">пример</a></strong> в новом окне, чтобы посмотреть исходный код. Вы можете <strong><a href="http://www.linkexchanger.su/jquery_articles/cascadeSelect.zip">скачать</a></strong> архив, который содержит файлы примера (в том числе cascadeSelectAuto.php и cascadeSelectModel.php).</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/82.html/feed</wfw:commentRss>
		<slash:comments>104</slash:comments>
		</item>
		<item>
		<title>Как работать с JSON?</title>
		<link>http://www.linkexchanger.su/2008/41.html</link>
		<comments>http://www.linkexchanger.su/2008/41.html#comments</comments>
		<pubDate>Mon, 03 Mar 2008 05:50:06 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/41.html</guid>
		<description><![CDATA[Вероятно Вы уже прочитали статью &#171;Что такое JSON?&#171;. Если нет, то я рекомендую сначала ознакомиться именно с ней, чтобы понять все с самого начала. А здесь мы поговорим о преобразованиях объектов JavaScript в формат JSON и обратных преобразованиях строки ответа от сервера в формате JSON в объект JavaScript, а также рассмотрим средства для работы с [...]]]></description>
			<content:encoded><![CDATA[<p>Вероятно Вы уже прочитали статью &laquo;<a href="http://www.linkexchanger.su/2008/40.html">Что такое JSON?</a>&laquo;. Если нет, то я рекомендую сначала ознакомиться именно с ней, чтобы понять все с самого начала. А здесь мы поговорим о преобразованиях объектов JavaScript в формат <strong>JSON</strong> и обратных преобразованиях строки ответа от сервера в формате <strong>JSON</strong> в объект JavaScript, а также рассмотрим средства для работы с <strong>JSON</strong> на стороне сервера.<span id="more-41"></span></p>
<p>Дуглас Крокфорд (Douglas Crockford), который собственно и предложил <strong>формат JSON</strong> в качестве альтернативы XML при передаче данных от сервера клиенту, в рамках этого проекта разработал специальную утилиту, предназначенную для упомянутых выше преобразований. Исходник можно найти по адресу <a href="http://www.json.org/js.html" target="_blank">http://www.json.org/js.html.</a></p>
<p>В предыдущей статье о <strong>JSON</strong> мы уже немного коснулись преобразования строки данных в объект JavaScript с помощью функции <strong>eval()</strong>, но все-таки нельзя забывать о том, что функция эта не только поможет интерпретировать данные в формат JSON, но и выполнит любой JavaScript-код, который будет ей передан. Так как это обстоятельство может представлять собой потенциальную угрозу, логичнее воспользоваться утилитой Дугласа Крокфорда.</p>
<p>Но давайте обо всем по порядку. Для начала подключим утилиту к нужному файлу:</p>
<pre class="brush: jscript;">&lt;script src=&quot;json.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Создадим объект <strong>oAuto</strong> обычным способом, забыв о литеральной нотации.</p>
<pre class="brush: jscript;">var oAuto = new Object();
oAuto.firm = &quot;Audi&quot;;
oAuto.model = &quot;A6&quot;;
oAuto.year = 2008;
oAuto.price = 78000;
oAuto.sellers = new Array(
  &quot;Фирма А&quot;,
  &quot;Фирма Б&quot;,
  &quot;Фирма В&quot;
);</pre>
<p>Передадим объект методу <strong>JSON.stringify()</strong></p>
<pre class="brush: jscript;">document.write(JSON.stringify(oAuto));</pre>
<p>и в результате работы этого небольшого кусочка кода будет выведена <strong>строка в формате JSON</strong>, которую можно передавать по любому адресу.</p>
<pre class="brush: jscript;">{&quot;firm&quot;:&quot;Audi&quot;,&quot;model&quot;:&quot;A6&quot;,&quot;year&quot;:2008,
&quot;price&quot;:78000,&quot;sellers&quot;:[&quot;Фирма А&quot;,&quot;Фирма Б&quot;,&quot;Фирма В&quot;]}</pre>
<p>Предположим теперь, что эту самую строку мы получили в качестве ответа от сервера и ее надо преобразовать в объект JavaScript. Так нет ничего проще. Передаем строку методу <strong>JSON.parse()</strong></p>
<pre class="brush: jscript;">var oAuto = JSON.parse(sAuto);</pre>
<p>и получаем объект JavaScript.</p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_json/json.zip">исходный код</a> примера, и испытать его на своем сайте.</p></blockquote>
<p>Необходимо упомянуть также, что метод <strong>JSON.parse()</strong> может принимать опционально еще один параметр.</p>
<pre class="brush: jscript;">var myObject = JSON.parse(myJSONtext, filter);</pre>
<p>Более полную информацию Вы всегда можете найти на сайте <a href="http://www.json.org/json-ru.html">http://www.json.org/</a>.</p>
<p>Мы вкратце познакомились с тем, как можно работать с данными в формате <strong>JSON</strong> на стороне клиента, а как обстоит дело при работе на стороне сервера? Оказывается существует довольно много программного обеспечения для работы с <strong>JSON</strong> в языках на которых пишутся серверные сценарии. <strong>JSON</strong> может применяться в <strong>Pyton</strong>, <strong>C#/.NET</strong>, <strong>PHP</strong>, <strong>ColdFusion</strong>, <strong>Perl</strong>, <strong>Java</strong> и т.д. Полный список можно найти на <a href="http://www.json.org/json-ru.html">http://www.json.org/</a>, а я для примера выбрал <strong>PHP</strong>, как наиболее близкий мне.</p>
<p>Утилита <strong>JSON-PHP</strong> написана Михалем Мигурски (Michal Migurski). Сама утилита &#8211; это один файл JSON.PHP, но для работы с утилитой требуется библиотека <strong>PEAR</strong> (PHP Extension and Application Repository). Скачать утилиту можно отсюда <a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198" target="_blank">http://pear.php.net/pepr/pepr-proposal-show.php?id=198</a>.</p>
<blockquote><p>Если Ваш хостер не удосужился включить библиотеку PEAR &#8211; не расстраивайтесь. Вы вполне можете сделать все самостоятельно. Не обязательно даже иметь права администратора сервера. Я приведу ссылки. Кому очень понадобится &#8211; тот обязательно разберется.<br />
<a href="http://pear.php.net/manual/en/installation.getting.php" target="_blank">http://pear.php.net/manual/en/installation.getting.php</a> &#8211; см. раздел &laquo;PEAR in hosting environments&raquo;.<br />
В принципе нужно только получить инсталляционный файл, загрузить его на свой сервер, вызвать в адресной строке браузера и далее только следовать инструкциям.<br />
А <a href="http://subscribe.ru/archive/inet.webbuild.php5whatsnew/200512/30010819.html" target="_blank">здесь</a> посмотрите раздел &laquo;Динамическая коррекция пути к включаемым файлам&raquo;.</p></blockquote>
<p>Разберем все на примере. Пусть имеем такое определение класса (для PHP5)</p>
<pre class="brush: php;">
class Auto {
  public $firm;
  public $model;
  public $year;
  public $price;
  public $sellers;

  function Auto($firm,$model,$year,$price) {
    $this-&gt;firm = $firm;
    $this-&gt;model = $model;
    $this-&gt;year = $year;
    $this-&gt;price = $price;
    $this-&gt;sellers = array();
  }
}</pre>
<p>Используем этот класс так:</p>
<pre class="brush: php;">
$oAuto = new Auto(&quot;Audi&quot;, &quot;A6&quot;, 2008, 78000);
$oAuto-&gt;sellers[0] = &quot;Фирма А&quot;;
$oAuto-&gt;sellers[1] = &quot;Фирма Б&quot;;
$oAuto-&gt;sellers[2] = &quot;Фирма В&quot;;
</pre>
<p>Теперь то, что нас интересует больше всего. Подключаем утилиту <strong>JSON-PHP</strong>, создаем новый экземпляр объекта <strong>Services_JSON</strong> и передаем объект <strong>$oAuto</strong> методу <strong>encode()</strong>:</p>
<pre class="brush: php;">require_once(&quot;JSON.php&quot;);
$json = new Services_JSON();
$sJSONText = $json-&gt;encode($oAuto);</pre>
<p>В результате переменная <strong>$sJSONText</strong> будет содержать строку в формате <strong>JSON</strong>:</p>
<pre class="brush: jscript;">{&quot;firm&quot;:&quot;Audi&quot;,&quot;model&quot;:&quot;A6&quot;,&quot;year&quot;:2008,&quot;price&quot;:78000,
&quot;sellers&quot;:[&quot;\u0424\u0438\u0440\u043c\u0430 \u0410&quot;,&quot;\u0424\u0438\u0440\u043c\u0430 \u0411&quot;,&quot;\u0424\u0438\u0440\u043c\u0430 \u0412&quot;]}</pre>
<blockquote><p>Здесь хочу обратить Ваше внимание на то, что утилита <strong>JSON-PHP</strong> понимает строки или в <strong>ASCII</strong>, или в <strong>UTF-8</strong>. Поэтому существенный выигрыш можно получить при использовании латинских символов, тогда как использование кириллицы в кодировке windows-1251 может привести к увеличению объема данных. Обратите внимание на то место в строке, где должны передаваться Фирма А, Фирма Б, Фирма В.</p></blockquote>
<p>Но цели мы достигли &#8211; объект <strong>$oAuto</strong> готов к передаче в сценарий на языке JavaScript.</p>
<p>Разберем обратную операцию &#8211; преобразование строки текста в формате <strong>JSON</strong> в объект <strong>PHP</strong>. Все, что для этого нужно сделать, это передать строку методу <strong>decode()</strong>:</p>
<pre class="brush: php;">$value = $json-&gt;decode($sJSONText);</pre>
<p>Если теперь использовать например <strong>print_r()</strong>, то мы сможем убедиться, что объект был создан:</p>
<pre class="brush: php;">
( [firm] =&gt; Audi [model] =&gt; A6
[year] =&gt; 2008 [price] =&gt; 78000
[sellers] =&gt; Array ( [0] =&gt; Фирма А [1] =&gt; Фирма Б [2] =&gt; Фирма В ) )</pre>
<p>Все это есть в примере, который Вы сможете скачать. Пример включает и утилиту <strong>JSON-PHP</strong>. Естественно, Вам придется немного поправить пример в той части, где корректируются пути к библиотеке <strong>PEAR</strong>, либо удалить этот фрагмент кода, если библиотека у Вас уже подключена.</p>
<blockquote><p>Архив с примером можно <a href="http://www.linkexchanger.su/example_json/json2.zip">скачать</a> здесь.</p></blockquote>
<p>Что можно еще сказать? Разве что упомянуть о том, что утилита <strong>JSON-PHP</strong> не единственная для работы с <strong>JSON</strong> на стороне сервера. Существует расширение PHP &#8211; <strong>php-json</strong> (написано на C Омаром Килани (Omar Kilani)), однако для его установки потребуется умение устанавливать модули расширения PHP. Вот и все, пожалуй.</p>
<p>Буду рад, если найдете время для того, чтобы оставить свои отзывы&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/41.html/feed</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
		<item>
		<title>Что такое JSON?</title>
		<link>http://www.linkexchanger.su/2008/40.html</link>
		<comments>http://www.linkexchanger.su/2008/40.html#comments</comments>
		<pubDate>Thu, 28 Feb 2008 05:46:28 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/40.html</guid>
		<description><![CDATA[JSON (JavaScript Object Notation &#8211; представление объектов JavaScript) &#8211; легкий формат представления данных, основанный на подмножестве синтаксиса JavaScript, а точнее на литералах массивов и объектов. JSON &#8211; это альтернатива традиционным форматам (обычный текст или XML), которые используются при обмене данными между сервером и клиентом. В отличие от XML и XML-совместимых языков, которые требуют синтаксического анализа, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>JSON</strong> (JavaScript Object Notation &#8211; представление объектов JavaScript) &#8211; легкий формат представления данных, основанный на подмножестве синтаксиса JavaScript, а точнее на <strong>литералах</strong> массивов и объектов. JSON &#8211; это альтернатива традиционным форматам (обычный текст или XML), которые используются при обмене данными между сервером и клиентом. В отличие от XML и XML-совместимых языков, которые требуют синтаксического анализа, определения JSON могут быть просто включены в сценарии JavaScript. Формат JSON предложен программистом Дугласом Крокфордом (Douglas Crockford).<span id="more-40"></span></p>
<p>Может я зайду издалека, но для того чтобы действительно понять JSON, сначала поймем (вспомним) синтаксис массивов и объектов в литеральной нотации JavaScript.</p>
<p><strong>Массивы как литералы</strong><br />
Массив в JavaScript можно определить с помощью конструктора Array, например так:</p>
<pre class="brush: jscript;">var aData = new Array(&quot;строка&quot;, true, 43, null);</pre>
<blockquote><p>В JavaScript массивы нетипизированные, поэтому в них можно хранить различные типы данных. В примере массив содержит строку, логическое значение, число и значение null.</p></blockquote>
<p>Массив же, описываемый как литерал, можно определить с помощью квадратных скобок, внутри &#8211; значения элементов массива, через запятую. Вот как будет выглядеть тот же самый массив, но в литеральной нотации:</p>
<pre class="brush: jscript;">var aData = [&quot;строка&quot;, true, 43, null];</pre>
<p>Обращаться к отдельным элемента массива можно указывая имя массива и номер элемента:</p>
<pre class="brush: jscript;">alert(aData[0]);
alert(aData[1]);</pre>
<p><strong>Объекты как литералы</strong><br />
Объекты в JavaScript определяются с помощью конструктора Object, например так:</p>
<pre class="brush: jscript;">var oAuto = new Object();
oAuto.firm = &quot;Audi&quot;;
oAuto.model = &quot;A6&quot;;
oAuto.year = 2008;
oAuto.price = 78000;</pre>
<p>Тот же самый код, но в литеральной нотации будет выглядеть так:</p>
<pre class="brush: jscript;">var oAuto = {
  &quot;firm&quot;:&quot;Audi&quot;,
  &quot;model&quot;:&quot;A6&quot;,
  &quot;year&quot;:2008,
  &quot;price&quot;:78000
};</pre>
<p>Этот код создает объект со свойствами firm, model, year и price и обращаться к ним можно таким образом:</p>
<pre class="brush: jscript;">alert(oAuto.model);
alert(oAuto.year);</pre>
<p>но можно использовать и синтаксис массивов обращаясь к свойствам объекта таким образом:</p>
<pre class="brush: jscript;">alert(oAuto[&quot;model&quot;]);
alert(oAuto[&quot;year&quot;]);</pre>
<p>В литеральной нотации описания массивов и объектов можно вкладывать друг в друга, создавая таким образом <strong>объект массивов</strong> или <strong>массив объектов</strong>. Посмотрите этот код:</p>
<pre class="brush: jscript;">var aAuto = [
  {
    &quot;firm&quot;:&quot;BMW&quot;,
    &quot;model&quot;:&quot;X5&quot;,
    &quot;year&quot;:2007,
    &quot;price&quot;:99000
  },
  {
    &quot;firm&quot;:&quot;Audi&quot;,
    &quot;model&quot;:&quot;A6&quot;,
    &quot;year&quot;:2008,
    &quot;price&quot;:78000
  },
  {
    &quot;firm&quot;:&quot;Volkswagen&quot;,
    &quot;model&quot;:&quot;Touareg 7L&quot;,
    &quot;year&quot;:2006,
    &quot;price&quot;:45000
  }
];</pre>
<p>Мы создали массив aAuto, который содержит три объекта. Комбинируя синтаксис обращения к массивам с синтаксисом обращения к объектам попробуем получить год выпуска второго автомобиля:</p>
<pre class="brush: jscript;">alert(aAuto[1].year); // получаем 2008</pre>
<p>Можно сделать наоборот, и описать объект массивов:</p>
<pre class="brush: jscript;">var oAuto = {
  &quot;firm&quot;:[&quot;BMW&quot;, &quot;Audi&quot;, &quot;Volkswagen&quot;],
  &quot;model&quot;:[&quot;X5&quot;, &quot;A6&quot;, &quot;Touareg 7L&quot;],
  &quot;year&quot;:[2007, 2008, 2006],
  &quot;price&quot;:[99000, 78000, 45000]
};</pre>
<p>в этом случае обращаемся сначала к объекту, а затем к массиву внутри него:</p>
<pre class="brush: jscript;">alert(oAuto.year[1]); // получаем 2008</pre>
<p>Вот такое длинное получилось предисловие, но зато теперь будет гораздо понятнее при чем здесь вообще <strong>JSON</strong>&#8230;</p>
<p><strong>JSON</strong> &#8211; комбинация массивов и объектов и предназначен только для хранения данных. Как следствие, <strong>JSON</strong> не может иметь переменных и не допускает никаких операций над ними. Давайте попробуем записать предыдущий пример, используя синтаксис <strong>JSON</strong>:</p>
<pre class="brush: jscript;">{
  &quot;firm&quot;:[&quot;BMW&quot;, &quot;Audi&quot;, &quot;Volkswagen&quot;],
  &quot;model&quot;:[&quot;X5&quot;, &quot;A6&quot;, &quot;Touareg 7L&quot;],
  &quot;year&quot;:[2007, 2008, 2006],
  &quot;price&quot;:[99000, 78000, 45000]
}</pre>
<p><strong>Обратите внимание</strong>, что пропали имя переменной и точка-запятая. Передача такого объекта с использованием HTTP-протокола будет происходить очень быстро, поскольку содержит минимум символов. Получив такие данные на стороне клиента и записав ее в какую-либо переменную (например sData) мы получаем строку информации.<br />
<strong>Обратите внимание</strong>: именно строку, а совсем не объект или объект с вложенными в него массивами. Преобразуем строку в объект, используя функцию <strong>eval()</strong>.</p>
<pre class="brush: jscript;">var oAuto = eval(&quot;(&quot; + sData + &quot;)&quot;);</pre>
<p>В результате этого получится объект, который мы описали чуть выше.</p>
<p><strong>Преимущество JSON перед XML</strong><br />
Так в чем же все-таки состоит преимущество JSON перед XML?</p>
<blockquote><p>Здесь речь идет исключительно о преимуществах и недостатках только лишь с точки зрения организации обмена данными в Сети.</p></blockquote>
<p>В том, что язык XML оказывается очень избыточным при сравнении с JSON. Давайте убедимся в этом на простом примере. Одни и те же данные представим в формате XML и в формате JSON.</p>
<pre class="brush: xml;">&lt;general&gt;
  &lt;cars&gt;
    &lt;car&gt;
      &lt;firm&gt;BMW&lt;/firm&gt;
      &lt;model&gt;X5&lt;/model&gt;
      &lt;year&gt;2007&lt;/year&gt;
      &lt;price&gt;99000&lt;/price&gt;
    &lt;/car&gt;
    &lt;car&gt;
      &lt;firm&gt;Audi&lt;/firm&gt;
      &lt;model&gt;A6&lt;/model&gt;
      &lt;year&gt;2008&lt;/year&gt;
      &lt;price&gt;78000&lt;/price&gt;
    &lt;/car&gt;
    &lt;car&gt;
      &lt;firm&gt;Volkswagen&lt;/firm&gt;
      &lt;model&gt;Touareg 7L&lt;/model&gt;
      &lt;year&gt;2006&lt;/year&gt;
      &lt;price&gt;45000&lt;/price&gt;
    &lt;/car&gt;
  &lt;/cars&gt;
&lt;/general&gt;</pre>
<p>так это выглядит в формате XML, а ниже &#8211; в формате JSON:</p>
<pre class="brush: jscript;">{ &quot;general&quot;:
  {
    &quot;cars&quot;:[
      {
        &quot;firm&quot;:&quot;BMW&quot;,
        &quot;model&quot;:&quot;X5&quot;,
        &quot;year&quot;:2007,
        &quot;price&quot;:99000
      },
      {
        &quot;firm&quot;:&quot;Audi&quot;,
        &quot;model&quot;:&quot;A6&quot;,
        &quot;year&quot;:2008,
        &quot;price&quot;:78000
      },
      {
        &quot;firm&quot;:&quot;Volkswagen&quot;,
        &quot;model&quot;:&quot;Touareg 7L&quot;,
        &quot;year&quot;:2006,
        &quot;price&quot;:45000
      }
    ]
  }
}</pre>
<p>При использовании формата JSON выигрыш составит 42 байта, а без учета пробелов и вовсе 86 байт. А если вспомнить еще и о том, что данные в формате JSON не требуют дополнительного синтаксического анализа на стороне клиента &#8211; преимущество JSON перед XML в аспекте передачи данных от сервера клиенту становится очевидным&#8230;</p>
<p>По этой теме могу порекомендовать прочитать переводную статью <a href="http://habrahabr.ru/blog/webdev/23779.html" target="_blank"><strong>JSON и XML. Что лучше?</strong></a> на Хабрахабре, а я надеюсь, что мне удастся в ближайшем будущем подробнее рассказать о утилитах для работы с JSON как на стороне клиента, так и на стороне сервера.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/40.html/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
	</channel>
</rss>

