<?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; ajax</title>
	<atom:link href="http://www.linkexchanger.su/category/ajax/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Tue, 25 May 2010 08:13:42 +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>AJAX. Программирование для Интернета</title>
		<link>http://www.linkexchanger.su/2009/87.html</link>
		<comments>http://www.linkexchanger.su/2009/87.html#comments</comments>
		<pubDate>Thu, 23 Apr 2009 05:03:33 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[DOM]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/87.html</guid>
		<description><![CDATA[Перед кем еще похвастаться, как не перед читателями своего блога? Тем более, что хвастаться я собираюсь по теме. Несколько дней назад в интернет-магазинах появилась в продаже книга &#171;AJAX. Программирование для Интернета&#187;. Книга вышла в издательстве &#171;БХВ-Петербург&#187;. Написана она преподавателем компьютерных дисциплин СПбГПУ &#8211; Санкт-Петербургского государственного политехнического университета Е. С. Бенкен и мной &#8211; автором этого [...]]]></description>
			<content:encoded><![CDATA[<p>Перед кем еще похвастаться, как не перед читателями своего блога? Тем более, что хвастаться я собираюсь по теме. Несколько дней назад в интернет-магазинах появилась в продаже книга <strong>&laquo;AJAX. Программирование для Интернета&raquo;</strong>. Книга вышла в издательстве &laquo;БХВ-Петербург&raquo;. Написана она преподавателем компьютерных дисциплин СПбГПУ &#8211; Санкт-Петербургского государственного политехнического университета Е. С. Бенкен и мной &#8211; автором этого блога.<span id="more-87"></span></p>
<ul style="float: right; width: 200px">
<li>Елена Бенкен, Геннадий Самков</li>
<li>AJAX. Программирование для Интернета (+ CD-ROM)</li>
<li>Издательство: БХВ-Петербург, 2009 г.</li>
<li>Твердый переплет, 464 стр.</li>
<li>ISBN 978-5-9775-0428-7</li>
<li>Тираж: 2000 экз.</li>
<li>Формат: 70&#215;100/16</li>
</ul>
<p><a href="http://www.ozon.ru/context/detail/id/4385582/" target="_blank"><img src="http://www.linkexchanger.su/wp-content/uploads/2009/04/ajax.jpg" alt="Ajax - программирование для Интернета" style="border: medium none " /></a><br />
<strong>От издателя:</strong><br />
Описана технология AJAX и показаны возможности, которые открываются перед разработчиком с ее применением. Рассмотрена объектная модель документа: DOM в JavaSript и DOM-функции в PHP. Изложены основы языка XML и формат JSON. Показан принцип генерации асинхронных запросов к серверу средствами JavaScript. Сделан обзор основных JavaScript-библиотек: Prototype, Scriptaculous, ExtJS и jQuery. Подробно рассмотрены популярные и перспективные библиотеки ExtJS и jQuery: описана объектная модель языка JavaScript, на которой базируются эти библиотеки; применение AJAX-запросов; обработка событий и др. Приведено большое количество практических примеров.</p>
<p>Компакт-диск содержит дистрибутивы Web-сервера, модуля РНР и сервера MySQL, исходные коды описываемых библиотек, распространяемых на основании лицензии GPL, а также примеры из книги.</p>
<p><strong>Читателям:</strong><br />
В ходе чтения следует выполнять примеры, описываемые в книге. Каждый пример стоит изменять и переделывать самому с тем, чтобы лучше понимать, как он работает или как сделать так, чтобы все перестало работать.</p>
<p><img src="http://www.linkexchanger.su/wp-content/uploads/2009/04/smil.gif" style="margin-left: 100px" /></p>
<p><strong>От себя:</strong><br />
А от себя хочу добавить, что библиотеке jQuery в книге уделено достаточно много внимания &#8211; этот раздел занимает 160 страниц. Естественно, что стояла задача показать именно то, как jQuery помогает при использовании AJAX, но для этого необходимо было объяснить базовые понятия самой библиотеки. Поэтому в раздел о jQuery были включена глава о функциях ядра библиотеки, очень подробно рассмотрены практически все селекторы jQuery, рассмотрена работа с событиями в jQuery и манипуляции элементами. И только после этого подробно рассказывается об использовании AJAX. Абсолютно все сопровождается примерами с довольно подробными пояснениями. В общем этим разделом можно <strong><em>пользоваться как мануалом</em></strong> по вышеупомянутым разделам библиотеки.<br />
Жаль конечно, что не удалось рассказать о всей библиотеке &#8211; но наверное это тема для отдельной книги.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/87.html/feed</wfw:commentRss>
		<slash:comments>69</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>Обработка событий для элементов DOM, загружаемых через ajax.</title>
		<link>http://www.linkexchanger.su/2008/73.html</link>
		<comments>http://www.linkexchanger.su/2008/73.html#comments</comments>
		<pubDate>Fri, 12 Dec 2008 08:00:37 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[DOM]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/73.html</guid>
		<description><![CDATA[На написание этой статьи меня подвигло то обстоятельство, что на один и тот же вопрос приходится отвечать по 5-7 раз в неделю. Вопрос этот обычно звучит примерно так: &#171;Элементы вставляются в страницу из ajax-запроса к серверу и для них не работает ни один обработчик событий! Как это поправить?&#187;.
Начнем пожалуй с того, что поправлять вряд ли [...]]]></description>
			<content:encoded><![CDATA[<p>На написание этой статьи меня подвигло то обстоятельство, что на один и тот же вопрос приходится отвечать по 5-7 раз в неделю. Вопрос этот обычно звучит примерно так: <em>&laquo;Элементы вставляются в страницу из ajax-запроса к серверу и для них не работает ни один обработчик событий! Как это поправить?&raquo;.</em><span id="more-73"></span><br />
Начнем пожалуй с того, что поправлять вряд ли что-то нужно. Скорее надо разобраться с тем, что, и в какой последовательности  происходит. Разберемся на вот таком простом <a href="http://www.linkexchanger.su/jquery_articles/eventHandlingAjax.html" target="_blank">примере</a>. Я приведу HTML, javascript-код и php-код сценария на сервере.</p>
<pre class="brush: xml;">&lt;button&gt;Отправить ajax-запрос&lt;/button&gt;
&lt;span id=&quot;process&quot;&gt;&lt;/span&gt;
&lt;p&gt;Параграф 1&lt;/p&gt;
&lt;p&gt;Параграф 2&lt;/p&gt;</pre>
<p>HTML-код очень прост. Имеем два параграфа, кнопку, с помощью которой будем отправлять ajax-запрос и элемент span, который будет использоваться для вставки в него текстовых сообщений.</p>
<p>Теперь javascript-код:</p>
<pre class="brush: jscript;">$(document).ready(function(){
  // обрабатываем клик на параграфах
  $(&quot;p&quot;).click(function() {
  	alert($(this).text());
  });
  // ajax-запрос
  $(&quot;button&quot;).click(function() {
    $.ajax({
     url: &quot;eventHandlingAjax.php&quot;,
     beforeSend: function(){
       $(&quot;#process&quot;).css(&quot;display&quot;,&quot;inline&quot;)
                    .text(&quot;Отправляю ajax-запрос&quot;);
     },
     success: function(answ){
       $(&quot;#process&quot;).text(&quot;Ответ получен&quot;)
                    .fadeOut(3000);
       $(&quot;body&quot;).append(answ);
     }
    });
  });
});</pre>
<p>Для начала свяжем событие click с элементами p. По событию будем выводить в alert текст, содержащийся в данном параграфе.</p>
<p>Ajax-запрос будем выполнять при клике на элементе button. Сложного тут ничего нет &#8211; запрос будет отправлен к файлу eventHandlingAjax.php, а перед отправкой мы вставим соответствующее сообщение в элемент span, сделав его видимым с помощью CSS (изначально этот элемент был скрыт с помощью того же CSS). При получении ответа от сервера мы вставим сообщение об этом в тот же элемент span и самое главное, добавим в body то, что мы получили в качестве ответа.</p>
<p>А что именно мы получили можно будет узнать, посмотрев код серверного сценария.</p>
<pre class="brush: php;">
&lt;?php
header('Content-Type: text/html; charset=utf-8');
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
    print '&lt;p&gt;Добавленный параграф&lt;/p&gt;;
}
?&gt;
</pre>
<p>Мы добавим в body всего-навсего HTML-код еще одного параграфа.</p>
<p>Если Вы уже успели испытать этот пример, то наверняка отметили то обстоятельство, что обработчик события click действует только для тех двух параграфов, которые присутствовали на странице с самого начала. А для добавленных параграфов этот обработчик не действует. Почему? Давайте разбираться.</p>
<p>Что происходит в момент загрузки HTML-страницы? На экране монитора появляется кнопка и два параграфа. Самое интересное в javascript-коде. В момент готовности DOM наш javascript-код начинает отрабатывать, и первое, что он делает, отбирает в объект jQuery все элементы p на странице и вешает на них обработчик события click. Затем уже вешает обработчик клика и на элемент button, но это нас сейчас интересует в гораздо меньшей степени.</p>
<p>Что происходит дальше? Дальше мы отправляем ajax-запрос к серверу и получаем от него в качестве ответа еще один элемент p, который вставляется в DOM. Вот это и есть самый важный момент &#8211; обработчик события click по сути связан не с какими-то элементами p на странице, а с конкретным объектом jQuery, в котором на данный момент находится только два элемента p, которые присутствовали на странице изначально. Добавленный параграф в этот объект jQuery не мог быть включен, поскольку тогда еще не существовал, поэтому и обработчик события click для него работать не будет.</p>
<h3>Ну а теперь узнаем &laquo;Как это поправить?&raquo;</h3>
<p>Поправить это можно, добавив обработчик события клик в callback-функцию, определенную в опции success ajax-запроса. Я приведу javascript-код и Вы сможете посмотреть, как он изменился.</p>
<pre class="brush: jscript;">$(document).ready(function(){
  // обрабатываем клик на параграфах
  $(&quot;p&quot;).click(function() {
  	alert($(this).text());
  });
  // ajax-запрос
  $(&quot;button&quot;).click(function() {
  	$.ajax({
     url: &quot;eventHandlingAjax.php&quot;,
     beforeSend: function(){
       $(&quot;#process&quot;).css(&quot;display&quot;,&quot;inline&quot;)
                    .text(&quot;Отправляю ajax-запрос&quot;);
     },
     success: function(answ){
       $(&quot;#process&quot;).text(&quot;Ответ получен&quot;)
                    .fadeOut(3000);
       $(&quot;body&quot;).append(answ);
       $(&quot;p&quot;).click(function() {
         alert($(this).text());
       });
     }
    });
  });
});</pre>
<p>Я специально не стал удалять первый обработчик события click, поскольку на <a href="http://www.linkexchanger.su/jquery_articles/eventHandlingAjax2.html" target="_blank">этом примере</a> можно наглядно увидеть разницу между двумя объектами jQuery, которые содержат элементы p. Первый из них был создан в момент загрузки html-страницы и содержит в себе два элемента p, а вот второй объект jQuery создан уже после выполнения ajax-запроса, и содержит все элементы p, которые удалось обнаружить в DOM, т.е. после одного запроса будет три параграфа, после двух &#8211; четыре и так далее. Визуально существование двух объектов jQuery подтверждается тем, что при клике на любом из &laquo;добавленных параграфов&raquo; Вы увидете только одно сообщение в alert&#8217;е, а вот при клике на первом или втором параграфе Вы увидете уже два alert&#8217;а &#8211; соответственно для первого и для второго объекта jQuery. Количество объектов jQuery будет расти вместе с количеством выполненных ajax-запросов.</p>
<p>Можно пойти иным путем и прописать обработчик события непосредственно в файле сценария на сервере &#8211; в этом случае он также будет подгружен и отработает правильно. Принципиальной разницы между этими подходами нет.</p>
<p><strong>Но на самом деле &#8211; это не совсем правильный путь</strong>, хотя в некоторых случаях может выручить и такое решение.</p>
<p>Я хочу рассказать о еще одном возможном способе решения этой задачи, который состоит в использовании плагина <strong>jQuery Listen</strong>. В коде кое-что конечно изменится. Естественно, что для использования этого плагина, его необходимо подключить к странице:</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.6.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.listen.js&quot;&gt;&lt;/script&gt;</pre>
<p>HTML-код остался без изменений, а вот javascript-код изменился:</p>
<pre class="brush: jscript;">$(document).ready(function(){

  jQuery.listen(&quot;click&quot;, &quot;p&quot;, function(){
    alert($(this).text());
  });

  // ajax-запрос
  $(&quot;button&quot;).click(function() {
  	$.ajax({
     url: &quot;eventHandlingAjax.php&quot;,
     beforeSend: function(){
       $(&quot;#process&quot;).css(&quot;display&quot;,&quot;inline&quot;)
                    .text(&quot;Отправляю ajax-запрос&quot;);
     },
     success: function(answ){
       $(&quot;#process&quot;).text(&quot;Ответ получен&quot;)
                    .fadeOut(3000);
       $(&quot;body&quot;).append(answ);
     }
    });
  });
});</pre>
<p>Обратите внимание, что вместо нашего обработчика события click на элементах p, мы используем <strong>плагин jQuery Listen</strong>, передавая ему событие, которое необходимо отслеживать, элементы, с которыми это событие необходимо связать и функцию, которая будет выполнена при наступлении этого события. Можете посмотреть работу плагина &#8211; вот <a href="http://www.linkexchanger.su/jquery_articles/eventHandlingAjax3.html" target="_blank">пример</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/73.html/feed</wfw:commentRss>
		<slash:comments>80</slash:comments>
		</item>
		<item>
		<title>jQuery Validation &#8211; проверка данных в ajax форме</title>
		<link>http://www.linkexchanger.su/2008/46.html</link>
		<comments>http://www.linkexchanger.su/2008/46.html#comments</comments>
		<pubDate>Thu, 13 Mar 2008 05:43:08 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[validator]]></category>
		<category><![CDATA[форма]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/46.html</guid>
		<description><![CDATA[Мы уже пробовали создать ajax-форму, об этом можно было прочитать в статье jQuery Form &#8211; делаем ajax-форму. Но любая форма без проверки данных, вводимых пользователем &#8211; это серьезная брешь в безопасности ресурса.
Важно! Никогда не стоит полагаться на проверки данных на стороне клиента! Обязательно проводите проверку на сервере!
Поэтому сегодня я предлагаю познакомиться с плагином jQuery Validation, [...]]]></description>
			<content:encoded><![CDATA[<p>Мы уже пробовали создать ajax-форму, об этом можно было прочитать в статье <a href="http://www.linkexchanger.su/2008/45.html">jQuery Form &#8211; делаем ajax-форму</a>. Но любая форма без проверки данных, вводимых пользователем &#8211; это серьезная брешь в безопасности ресурса.</p>
<blockquote><p><em>Важно! Никогда не стоит полагаться на проверки данных на стороне клиента! Обязательно проводите проверку на сервере!</em></p></blockquote>
<p>Поэтому сегодня я предлагаю познакомиться с плагином <strong>jQuery Validation</strong>, который позволит производить проверку вводимых данных &laquo;на лету&raquo; и, что немаловажно, очень хорошо взаимодействует с плагином <strong>jQuery Form</strong>. Ну а для начала просто посмотрите пример проверки данных в ajax форме&#8230;<span id="more-46"></span></p>
<p><iframe src="http://www.linkexchanger.su/example_jquery/validate.html" style="border: medium none " width="420" height="530"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery/validate.zip">исходный код</a> примера и воспроизвести этот пример на своем сайте.</p></blockquote>
<p>Ну а теперь начнем разбираться. Сразу скажу, что для того, чтобы подробно рассказать о плагине <strong>jQuery Validation</strong>, не хватит и нескольких статей. Поэтому поставим себе целью по окончании прочтения статьи (и тестирования примера конечно) иметь некий базовый набор знаний, который поможет решить проблемы в самых распространенных случаях. Если же понадобится что-то большее, то подробную информацию Вы сможете найти на странице плагина <a href="http://docs.jquery.com/Plugins/Validation">jQuery Validation</a>.</p>
<p>Как обычно, сначала потребуется подключить библиотеку <strong>jQuery</strong> (<strong>jQuery Validation</strong> работает с версией 1.2.2 и выше). Понятно, что понадобится и <strong>jquery.form.js</strong>, и собственно <strong>query.validate.js</strong> &#8211; все это подключаем в разделе <strong>HEAD</strong> нужной страницы. Можно подключить и файл <strong>additional-methods.js</strong>, содержащий, как ясно из названия, дополнительные методы.</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.3.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.form.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.validate.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/additional-methods.js&quot;&gt;&lt;/script&gt;</pre>
<p>Стилевые таблицы и HTML-код Вы сможете посмотреть в файле примера, там нет ничего необычного. Отмечу только, что стоит следовать следующим рекомендациям по разметке:</p>
<p>Каждый элемент <strong>input</strong> или <strong>select</strong> имеет &laquo;свой&raquo; элемент <strong>label</strong> с атрибутом <strong>for</strong>, значение которого одинаково со<br />
значением атрибута <strong>id</strong> соответствующего элемента <strong>input</strong> или <strong>select</strong>. В общем, лучше на примере:</p>
<pre class="brush: xml;">&lt;label for=&quot;firstname&quot;&gt;Имя&lt;/label&gt;
&lt;input id=&quot;firstname&quot; name=&quot;fname&quot; type=&quot;text&quot; /&gt;</pre>
<p>Теперь приведу javascript-код. Несмотря на то, что выглядит он довольно страшно, ничего особенно сложного в нем нет.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  // готовим опции для метода
  // ajaxSubmit плагина jquery.form.js
  var options = {
  	target: &quot;#output&quot;,
    timeout: 3000 // тайм-аут
  };

  $(&quot;#myForm&quot;).validate({
  	submitHandler: function(form) {
   	  // вызываем метод ajaxSubmit
   	  // плагина jquery.form.js
  	  $(form).ajaxSubmit(options);
    },
    focusInvalid: false,
    focusCleanup: true,
    rules: {
      Name: {
      	required: true,
      	minlength: 2,
      	maxlength: 12
      },
      Email: {
      	required: true,
      	email: true
      },
      // .............
      // еще настройки
      // см. в исх.кодах
      // .............
      Examine: {
      	required: true,
      	equal: 13
      }
    },
    messages: {
      Name: {
        required: &quot;Укажите свое имя!&quot;,
        minlength: &quot;Не менее 2 символов&quot;,
        maxlength: &quot;Не более 12 символов&quot;
      },
      Email: {
        required: &quot;Нужно указать email адрес&quot;,
        email: &quot;Нужен корректный email адрес!&quot;
      },
      // .............
      // еще настройки
      // см. в исх.кодах
      // .............
      Examine: {
      	required: &quot;Надо решить этот пример!&quot;,
      	equal: &quot;Вы в школе учились?&quot;
      }
    },
    errorPlacement: function(error, element) {
      var er = element.attr(&quot;name&quot;);
      error.appendTo( element.parent()
      .find(&quot;label[@for=&quot;&quot; + er + &quot;&quot;]&quot;)
      .find(&quot;em&quot;) );
    }
});
});
&lt;/script&gt;</pre>
<p>Начало кода уже должно быть Вам знакомо по предыдущей статье, а сейчас самое интересное для нас это пожалуй основной метод &#8211; <strong>validate</strong>,</p>
<pre class="brush: jscript;">$(&quot;#myForm&quot;).validate({
  // список опций
});</pre>
<p>который может принимать просто огромное количество опций (набор пар ключ/значение) и в соответствии с ними выполнять проверку выбранной формы. Метод <strong>validate</strong> устанавливает обработчики событий для <strong>submit</strong>, <strong>focus</strong>, <strong>keyup</strong>, <strong>blur</strong> и <strong>click</strong>, чтобы переключиться в проверку всей формы или ее отдельных полей.</p>
<p>Приведу наиболее востребованные опции с пояснениями:</p>
<p><strong>submitHandler</strong> &#8211; когда форма корректно заполнена, вызывает обработчик для передачи формы. Заменяет собой передачу формы по умолчанию. В примере (см.выше) используется передача данных через метод <strong>ajaxSubmit()</strong> плагина <strong>jQuery Form</strong>.</p>
<p><strong>ignore</strong> &#8211; отменяет проверку полей формы с указанным селектором. В примере ниже &#8211; отменяет проверку для всех элементов с классом &laquo;<strong>ignore</strong>&laquo;.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
   ignore: &quot;.ignore&quot;
});</pre>
<p><strong>rules</strong> &#8211; пары ключ/значение, описывающие правила проверки. Ключ &#8211; это значение атрибута <strong>name</strong> элемента (или группы элементов для элементов <strong>checkbox</strong> и <strong>radio</strong>). Значение &#8211; объект (или строка), содержащий пары правило/параметр. Правила могут быть считаны еще и из разметки (классы, атрибуты, метаданные). Эти способы можно комбинировать между собой.</p>
<pre class="brush: jscript;">$(&quot;.selector&quot;).validate({
   rules: {
     // поле name - обязательное
     name: &quot;required&quot;,
     // для поля email
     email: {
       // заполнение обязательно
       required: true,
       // значение д.б. корректным
       email: true
     }
   }
});</pre>
<p><strong>messages</strong> &#8211; пары ключ/значение, описывающие сообщения в процессе проверки. Ключ &#8211; это значение атрибута <strong>name</strong> элемента (или группы элементов для элементов <strong>checkbox</strong> и <strong>radio</strong>). Значение же его будет отображено для соответствующего элемента.</p>
<pre class="brush: jscript;">$(&quot;.selector&quot;).validate({
   rules: {
     name: &quot;required&quot;,
     email: {
       required: true,
       email: true
     }
   },
   messages: {
     // если не заполнено поле name
     // user увидит сообщение
     name: &quot;Пожалуйста, представьтесь!&quot;,
     email: {
       // если не заполнено поле email
       // user увидит сообщение
       required: &quot;Нужно указать e-mail!&quot;,
       // если поле email некорректно
       // user увидит сообщение
       email: &quot;E-mail д.б. корректным!&quot;
     }
   }
});</pre>
<p><strong>onsubmit</strong>, <strong>onfocusout</strong>, <strong>onkeyup</strong>, <strong>onclick</strong> &#8211; отвечают за инициализацию проверки полей формы по  соответствующему событию. По умолчанию все установлены в <strong>true</strong>. Любые из этих опций можно отключить, установив значение <strong>false</strong>.</p>
<p><strong>errorPlacement</strong> &#8211; в качестве значения функция, принимающая два аргумента. Первый &#8211; ошибка как объект <strong>jQuery</strong>, второй &#8211; некорректный элемент как объект <strong>jQuery</strong>. С помощью этой опции сообщение об ошибке может быть выведено в целевой элемент в разметке страницы. Давайте разберем на примере:</p>
<pre class="brush: jscript;">errorPlacement: function(error, element) {
      var er = element.attr(&quot;name&quot;);
      error.appendTo( element.parent()
      .find(&quot;label[@for=&quot;&quot; + er + &quot;&quot;]&quot;)
      .find(&quot;em&quot;) );
    }</pre>
<p>В переменную <strong>er</strong> получаем значение атрибута <strong>name</strong> элемента, в котором обнаружена ошибка. Сообщение об ошибке добавляем куда? Правильно &#8211; в целевой элемент, который еще надо найти. Находим &laquo;родителя&raquo; этого элемента, в нем обнаруживаем элемент <strong>label</strong> с атрибутом <strong>for</strong>, который имеет значение точно такое же, которое у нас уже хранится в переменной <strong>er</strong> (помните рекомендации по разметке?), находим в нем целевой элемент <strong>em</strong>. Вот туда и будет вставлен текст сообщения об ошибке.</p>
<p>А теперь давайте подробнее остановимся на <strong>rules</strong> и <strong>messages</strong>. Ну наверное больше все-таки на <strong>rules</strong>, поскольку правила проверки задаются именно здесь, а в <strong>messages</strong> определяются сообщения, которые будут выводиться в том случае, когда не выполняется требование, определенное в <strong>rules</strong>.</p>
<p><strong>Методы проверки</strong><br />
Плагин <strong>jQuery Validation</strong> предоставляет целый набор стандартных методов проверки.<br />
<strong>required( )</strong> &#8211; делает элемент обязательным для заполнения. Возвращает <strong>false</strong>, если элемент пустой (текстовое поле), не отмечен (radio/checkbox) или ничего не выбрано (для select).</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  // здесь field - идентификатор
  // соответствующего поля ввода
  rules: { field: &quot;required&quot; }
});</pre>
<p><strong>remote(url) </strong>- запрашивает ресурс, расположенный на сервере через <strong>$.ajax</strong> (<strong>XMLHttpRequest</strong>) и передает пару ключ/значение, соответствующую атрибуту <strong>name</strong> проверяемого элемента в GET-запросе. Ответ сервера оценивается как данные в формате JSON и должен вернуть <strong>true</strong> для корректных данных, и <strong>false</strong> &#8211; для некорректных.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    email: {
      required: true,
      email: true,
      remote: &quot;check-email.php&quot;
    }
  }
});</pre>
<p><strong>minlength(length)</strong> &#8211; элемент ввода будет требовать ввести количество символов не менее, чем указано в <strong>length</strong>. Работает с текстовыми полями ввода (в т.ч. с password), c selects и checkbox.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    field: {
      required: true,
      minlength: 3
    }
  }
});</pre>
<p><strong>maxlength(length)</strong> &#8211; элемент ввода будет требовать ввести количество символов не более, чем указано в <strong>length</strong>. Работает с текстовыми полями ввода (в т.ч. с password), c selects и checkbox.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    field: {
      required: true,
      maxlength: 4
    }
  }
});</pre>
<p><strong>rangelength(range)</strong> &#8211; элемент ввода будет требовать ввести количество символов, соответствующее диапазону, указанному в <strong>range</strong>.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    field: {
      required: true,
      rangelength: [2, 6]
    }
  }
});</pre>
<p><strong>min(value), max(value), range(range)</strong> &#8211; смысл тот же, только фигурирует уже не количество символов, а числа.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    field: {
      required: true,
      range: [13, 23]
    }
  }
});</pre>
<p><strong>equalTo(other)</strong> &#8211; требует, чтобы элемент соответствовал (был эквивалентен) другому элементу, указанному в <strong>other</strong>. Возвращает <strong>true</strong>, если это условие выполняется, и <strong>false</strong> в противном случае. Работает с текстовыми полями.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    password: &quot;required&quot;,
    password_again: {
      equalTo: &quot;#password&quot;
    }
  }
});</pre>
<p><strong>email( )</strong> &#8211; делает элемент ввода требующим корректно введенного e-mail адреса. Возвращает <strong>true</strong>, если адрес корректный, и <strong>false</strong> в противном случае. Работает с текстовыми полями.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    field: {
      required: true,
      email: true
    }
  }
});</pre>
<p><strong>url( )</strong> &#8211; делает элемент ввода требующим корректно введенного URL (типа, начните с http://). Возвращает <strong>true</strong>, если URL корректный, и <strong>false</strong> в противном случае. Работает с текстовыми полями.</p>
<pre class="brush: jscript;">$(&quot;#myform&quot;).validate({
  rules: {
    field: {
      required: true,
      url: true
    }
  }
});</pre>
<blockquote><p>Честно говоря, два последних метода из стандартного набора мне не понравились, впрочем как и из дополнительного набора методов в файле additional-methods.js. Метод <strong>url()</strong> например признал валидным http://www.собаказлая.ru, а метод <strong>email( )</strong> также пропускает кириллицу в адресе. Ну да ладно. Можно же дополнить плагин своим методом или доверить проверку валидности сценарию на сервере.</p></blockquote>
<p>Я рассказал далеко не все, и поэтому в заключение хочу привести еще несколько ссылок на примеры:<br />
<a href="http://jquery.bassistance.de/validate/demo/marketo/" target="_blank"> http://jquery.bassistance.de/validate/demo/marketo/</a><br />
<a href="http://jquery.bassistance.de/validate/demo/marketo/step2.htm" target="_blank"> http://jquery.bassistance.de/validate/demo/marketo/step2.htm</a><br />
<a href="http://jquery.bassistance.de/validate/demo/milk/" target="_blank"> http://jquery.bassistance.de/validate/demo/milk/</a><br />
<a href="http://jquery.bassistance.de/validate/demo/multipart/" target="_blank"> http://jquery.bassistance.de/validate/demo/multipart/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/46.html/feed</wfw:commentRss>
		<slash:comments>112</slash:comments>
		</item>
		<item>
		<title>jQuery Form &#8211; делаем ajax-форму</title>
		<link>http://www.linkexchanger.su/2008/45.html</link>
		<comments>http://www.linkexchanger.su/2008/45.html#comments</comments>
		<pubDate>Mon, 10 Mar 2008 21:05:15 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[форма]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/45.html</guid>
		<description><![CDATA[Плагин jQuery Form позволяет не только сделать новые ajax-формы, но и довольно просто &#171;проапгрейдить&#187; уже существующие формы таким образом, чтобы их можно было использовать вместе с Ajax. Основные методы, ajaxForm и ajaxSubmit, собирают информацию из элементов формы, поддерживают многочисленные опции, использование которых даст полный контроль над передачей данных.
Итак, начнем. Нам потребуется подключить к странице два [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин <strong>jQuery Form</strong> позволяет не только сделать новые <strong>ajax-формы</strong>, но и довольно просто &laquo;проапгрейдить&raquo; уже существующие формы таким образом, чтобы их можно было использовать вместе с Ajax. Основные методы, <strong>ajaxForm</strong> и <strong>ajaxSubmit</strong>, собирают информацию из элементов формы, поддерживают многочисленные опции, использование которых даст полный контроль над передачей данных.<span id="more-45"></span></p>
<p>Итак, начнем. Нам потребуется подключить к странице два файла: библиотеку <strong>jQuery</strong> и файл <strong>jquery.form.js</strong>. Сделаем это в разделе <strong>HEAD</strong>.</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.1.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.form.js&quot;&gt;&lt;/script&gt;</pre>
<p>Затем создадим самую простейшую форму, не содержащую какой-либо специальной разметки:</p>
<pre class="brush: xml;">&lt;form id=&quot;myForm&quot; action=&quot;comment.php&quot; method=&quot;post&quot;&gt;
  Имя: &lt;input type=&quot;text&quot; name=&quot;name&quot; /&gt;
  Комментарий: &lt;textarea name=&quot;comment&quot;&gt;&lt;/textarea&gt;
  &lt;input type=&quot;submit&quot; value=&quot;Комментировать&quot; /&gt;
&lt;/form&gt;</pre>
<p>и добавим еще немного javascript:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
   $(&quot;#myForm&quot;).ajaxForm(function() {
     alert(&quot;Спасибо за комментарий!&quot;);
   });
});
&lt;/script&gt;</pre>
<p>Вот так просто, но поспешу Вас разочаровать &#8211; то, что мы сделали, из серии &laquo;пыль в глаза&raquo;. Объясню почему. Когда мы нажмем кнопку &laquo;Комментировать&raquo; значения полей <strong>name</strong> и <strong>comment</strong> будут переданы методом <strong>POST</strong> файлу <strong>comment.php</strong>. Если сервер вернет успешный ответ (т.е. всего лишь код 200) &#8211; пользователь увидит сообщение &laquo;Спасибо за комментарий!&raquo;.</p>
<blockquote><p>Эффектнее было бы не выводить сообщение в <strong>alert()</strong>, а вставить сообщение непосредственно в <strong>DOM</strong>.</p></blockquote>
<p>Так что все, что мы здесь выиграли &#8211; избавились от перезагрузки страницы, в принципе уже неплохо, но хотелось бы большего&#8230;</p>
<p>Но давайте сначала попробуем выяснить, в чем его отличие метода <strong>ajaxForm</strong> от метода <strong>ajaxSubmit</strong>. Оба метода либо не принимают аргументов, либо принимают один аргумент, который может быть или функцией или объектом (в парах ключ/значение могут быть переданы различные опции).</p>
<p>Первое отличие состоит в  том, что метод <strong>ajaxSubmit</strong> отправляет данные из формы, а метод <strong>ajaxForm</strong> &#8211; нет. Когда вызывается метод <strong>ajaxSubmit</strong> он упорядочивает данные формы в строку запроса и отправляет их серверу. Когда же вызывается метод <strong>ajaxForm</strong> &#8211; он только добавляет необходимое событие в форму таким образом, что можно определить, когда пользователь отправил данные.<br />
Второе отличие: при использовании <strong>ajaxForm</strong> передаваемые значения будут включать пару имя/значение для самой кнопки (как в примере, или координаты клика мышью, если используется картинка).<br />
<strong> Вывод:</strong> это не значит, что метод <strong>ajaxForm</strong> &#8211; плохой, а  метод <strong>ajaxSubmit</strong> &#8211; хороший. Просто они разные. И какой именно метод использовать &#8211; надо решать в каждом конкретном случае.</p>
<p>Давайте теперь познакомимся с доступными опциями, которые принимают оба этих метода. Посмотрим фрагмент кода, чтобы увидеть как задаются опции:</p>
<pre class="brush: jscript;">// готовим объект
var options = {
  target: &quot;#divToUpdate&quot;,
  url: &quot;form.php&quot;,
  success: function() {
        alert(&quot;Спасибо за комментарий!&quot;);
  }
};
// передаем опции в  ajaxSubmit
$(&quot;#myForm&quot;).ajaxSubmit(options);</pre>
<p><strong>target</strong> &#8211; идентифицирует тот элемент (или элементы) на странице, который должен быть обновлен при поступлении ответа от сервера. Значение может быть определено как объект или селектор <strong>jQuery</strong> или элемент <strong>DOM</strong>. Значение по умолчанию &#8211; <strong>null</strong>.<br />
<strong>url</strong> &#8211; URL, куда должны быть переданы данные из формы. Значение по умолчанию &#8211; значение атрибута <strong>action</strong> формы.<br />
<strong>type</strong> &#8211; метод, с помощью которого должны быть отправлены данные из формы (<strong>GET</strong> или <strong>POST</strong>). Значение по умолчанию &#8211; значение атрибута <strong>method</strong> формы. Если атрибут не определен, используется метод <strong>GET</strong>.<br />
<strong>beforeSubmit</strong> &#8211; функция, которая будет вызвана до отправки данных из формы. Функция, вызываемая тут, может позволить выполнить какие-либо действия до отправки данных, например проверку введенных данных. И если она возвращает <strong>false</strong> &#8211; данные не будут отправлены на сервер. Принимает три аргумента: массив с данными формы, jQuery-объект формы, объект из опций определенных в <strong>ajaxForm/ajaxSubmit</strong>. Массив данных формы принимает такой вид:</p>
<pre class="brush: jscript;">[ { name: &quot;username&quot;, value: &quot;Vasya&quot; },
 { name: &quot;password&quot;, value: &quot;secret&quot; } ]</pre>
<p>Значение по умолчанию &#8211; <strong>null</strong>.<br />
<strong>success</strong> &#8211; функция, которая будет вызвана после отправки данных серверу и при условии успешного ответа сервера. Полученные данные &#8211; или <strong>responseText</strong> или <strong>responseXML</strong>, в зависимости от значения опции <strong>dataType</strong>. Значение по умолчанию &#8211; <strong>null</strong>.<br />
<strong>dataType</strong> &#8211; определяет ожидаемый тип данных в ответе сервера. Может принимать значения: <strong>null</strong>, &laquo;<strong>xml</strong>&laquo;, &laquo;<strong>script</strong>&laquo;, или &laquo;<strong>json</strong>&laquo;. Опция позволяет точно определить, как именно должен быть обработан ответ сервера.<br />
<strong>- &laquo;xml&raquo;:</strong> if dataType == &laquo;xml&raquo; ответ сервера рассматривается как <strong>XML</strong> и в <strong>success</strong> (если опция определена) отправляется значение <strong>responseXML</strong>;<br />
<strong>- &laquo;json&raquo;:</strong> if dataType == &laquo;json&raquo; ответ сервера будет выполнен и передан в <strong>success</strong> (если опция определена);<br />
<strong>- &laquo;script&raquo;:</strong> if dataType == &laquo;script&raquo; ответ сервера будет выполнен в глобальном контексте;<br />
Значение по умолчанию &#8211; <strong>null</strong>.<br />
<strong>semantic</strong> &#8211; флаг, определяющий должны ли данные передаваться в строгом порядке следования (это происходит медленнее).</p>
<blockquote><p>Упорядочивание данных формы происходит в порядке следования элементов, исключая элементы <strong>input</strong>, имеющие тип <strong>image</strong>.</p></blockquote>
<p>Вы должны всего лишь установить эту опцию в <strong>true</strong>, если Ваш сервер требует строгого порядка следования <strong>И</strong> форма содержит элементы <strong>input</strong> типа <strong>image</strong>. Значение по умолчанию &#8211; <strong>false</strong>.<br />
<strong>resetForm</strong> &#8211; флаг, определяющий должна ли форма быть сброшена если передача данных была успешной.  Значение по умолчанию &#8211; <strong>null</strong>.<br />
<strong>clearForm</strong> &#8211; флаг, определяющий должна ли форма быть очищена если передача данных была успешной.  Значение по умолчанию &#8211; <strong>null</strong>.</p>
<p>Методы <strong>ajaxForm</strong> и <strong>ajaxSubmit</strong> не единственные. Давайте немного познакомимся с остальными.</p>
<p>Метод <strong>formSerialize</strong> &#8211; упорядочивает данные из элементов формы в строку запроса. Метод возвращает строку в формате: name1=value1&amp;name2=value2.</p>
<pre class="brush: jscript;">var qString = $(&quot;#myFormId&quot;).formSerialize();
  // теперь данные могут быть отправлены
  //  через $.get, $.post, $.ajax, и т.д.
$.post(&quot;myscript.php&quot;, qString);</pre>
<p>Метод <strong>fieldSerialize</strong> &#8211; упорядочивает данные из элементов формы в строку запроса. Удобно применять, когда требуется упорядочить в строку запроса только часть данных из формы. Метод возвращает строку в формате: name1=value1&amp;name2=value2</p>
<pre class="brush: jscript;">var qString = $(&quot;#myFormId .myFields&quot;).fieldSerialize();</pre>
<p>Метод <strong>fieldValue</strong> &#8211; возвращает значения выбранных элементов в виде массива. С версии 0.91, метод всегда возвращает именно массив. Если нет корректных данных возвращается пустой массив, в противном случае массив содержит один или более элементов.</p>
<pre class="brush: jscript;">// получаем значения для полей с типом password
var value = $(&quot;#myFormId :password&quot;).fieldValue();
alert(&quot;Пароль: &quot; + value[0]);</pre>
<p>Метод <strong>resetForm</strong> &#8211; сбросит форму в начальное состояние через новый вызов элементов формы из объектной модели документа.</p>
<pre class="brush: jscript;">$(&quot;#myFormId&quot;).resetForm();</pre>
<p>Метод <strong>clearForm</strong> &#8211; очищает элементы формы. Этот метод очистит все элементы ввода с типом text, password, textarea, очистит выбор в элементах select и снимет отметки с элементов radio и checkbox.</p>
<pre class="brush: jscript;">$(&quot;#myFormId&quot;).clearForm();</pre>
<p>Метод <strong>clearFields</strong> &#8211; очищает элементы формы. Удобно применять когда требуется очистить только часть формы.</p>
<pre class="brush: jscript;">$(&quot;#myFormId .myFields&quot;).clearFields();</pre>
<p>Согласен, согласен&#8230; Получилось очень много и довольно нудно. Поэтому вот Вам пример формы, попробуйте его, а при желании посмотрите исходные коды этого примера. Я старался все очень подробно комментировать.</p>
<p><iframe src="http://www.linkexchanger.su/example_jquery/form.html" style="border: medium none " width="420" height="530"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery/form.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Важно! Помните, что любая форма &#8211; потенциальная дыра в безопасности. Никогда не стоит полагаться на проверку данных на стороне клиента. Обязательно производите проверку данных на сервере!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/45.html/feed</wfw:commentRss>
		<slash:comments>84</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>44</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>22</slash:comments>
		</item>
		<item>
		<title>jQuery Autocomplete: автозаполнение</title>
		<link>http://www.linkexchanger.su/2008/39.html</link>
		<comments>http://www.linkexchanger.su/2008/39.html#comments</comments>
		<pubDate>Mon, 25 Feb 2008 21:02:05 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[suggest]]></category>
		<category><![CDATA[автозаполнение]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/39.html</guid>
		<description><![CDATA[Если Вы пробовали что-то найти в Google, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К [...]]]></description>
			<content:encoded><![CDATA[<p>Если Вы пробовали что-то найти в <a href="http://www.google.ru/">Google</a>, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К тому же с библиотекой jQuery это не так уж и сложно&#8230;<span id="more-39"></span></p>
<p>Как обычно, для начала я приведу пример, а потом мы будем разбирать, как он работает.</p>
<blockquote><p>Поскольку это всего лишь пример, поясню, что в левом текстовом поле доступен выбор российских городов, которые начинаются на букву &laquo;М&raquo;, а в правом &#8211; список поселков городского типа (пгт) с численностью населения более 10 тыс. жителей (по данным Всероссийской переписи населения на 9 октября 2002 года).</p></blockquote>
<p>Кроме того, используются разные настройки. В общем, попробуйте пример, а потом продолжим&#8230;.<br />
<iframe src="http://www.linkexchanger.su/example_jquery/autocomplete.html" style="border: medium none " height="230" width="420"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery/autocomplete.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Сначала потребуется только подключить библиотеку <a href="http://jquery.com/">jQuery</a> и файл <a href="http://www.linkexchanger.su/example_jquery/js/jquery.autocomplete.js">query.autocomplete.js</a> в разделе <strong>HEAD</strong> нужной страницы.</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.1.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.autocomplete.js&quot;&gt;&lt;/script&gt;</pre>
<p>Если скачаете пример, то легко сможете разобраться и в стилевом оформлении. Учтите, что файл <strong>jquery.autocomplete.js</strong> использует имена классов (начинаются с ac_), но если Вы захотите по каким-то причинам изменить эти имена &#8211; это тоже можно будет довольно легко сделать.</p>
<p>Что касается HTML-кода, то естественно нужно описать поле для ввода текста:</p>
<pre class="brush: xml;">&lt;input id=&quot;example&quot; type=&quot;text&quot; /&gt;</pre>
<p>А вот использовать <strong>jquery.autocomplete.js</strong> можно двумя разными способами.</p>
<p><strong>Способ первый:</strong><br />
Если объем данных не очень большой, и данные не будут изменяться, то их можно поместить непосредственно на странице, как и сделано в примере в текстовом поле слева.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#example&quot;).autocompleteArray([
    &quot;Магадан&quot;,
    &quot;Магас&quot;,
    &quot;Магнитогорск&quot;,
    &quot;Майкоп&quot;,
    ........
    &quot;Муром&quot;,
    &quot;Мценск&quot;,
    &quot;Мыски&quot;,
    &quot;Мытищи&quot;,
    &quot;Мышкин&quot;
    ],
    {
    delay:10,
    minChars:1,
    matchSubset:1,
    autoFill:true,
    maxItemsToShow:10
    }
  );
});
&lt;/script&gt;</pre>
<p><strong>Способ второй:</strong><br />
Если данные большого объема, и/или часто изменяются, то необходимо предусмотреть обработку этих данных на сервере (для примера выбран PHP). <strong>jquery.autocomplete.js</strong> предусматривает отправку GET-запроса с параметром <strong>q</strong>, значением которого являются введенные символы. Именно так в примере работает текстовое поле справа.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#example2&quot;).autocomplete(&quot;autocomplete.php&quot;, {
    delay:10,
    minChars:2,
    matchSubset:1,
    autoFill:true,
    matchContains:1,
    cacheLength:10,
    selectFirst:true,
    formatItem:liFormat,
    maxItemsToShow:10,
    onItemSelect:selectItem
  });
});
&lt;/script&gt;</pre>
<p>В этих примерах, помимо данных (в первом случае) и URL обработчика (во втором случае) мы передаем некоторые опции. Список опций приведен ниже:</p>
<p><strong>autoFill</strong> &#8211; когда Вы начинаете вводить текст, в поле ввода будет подставлено (и выделено) первое подходящее значение из списка. Если Вы продолжаете вводить текст, в поле ввода и далее будет подставляться подходящее значение, но уже с учетом введенного Вами текста. (По умолчанию: false).</p>
<p><strong>inputClass</strong> &#8211; этот класс будет добавлен к элементу ввода. (По умолчанию: &laquo;ac_input&raquo;).</p>
<p><strong>resultsClass</strong> &#8211; класс для UL, который будет содержать элементы результата (элементы LI). (По умолчанию: &laquo;ac_results&raquo;).</p>
<p><strong>loadingClass</strong> &#8211; класс для элемента ввода, в то время, когда происходит обработка данных на сервере. (По умолчанию: &laquo;ac_loading&raquo;).</p>
<p><strong>lineSeparator</strong> &#8211; символ, который разделяет строки в данных, возвращаемых сервером. (По умолчанию: &laquo;\n&raquo;).</p>
<p><strong>cellSeparator</strong> &#8211; символ, который разделяет &laquo;ячейки&raquo; в строках данных, возвращаемых сервером. (По умолчанию: &laquo;|&raquo;).</p>
<p><strong>minChars</strong> &#8211; минимальное число символов, которое пользователь должен напечатать перед тем, как будет активизирван запрос. (По умолчанию: 1).</p>
<p><strong>delay</strong> &#8211; задержка в миллисекундах. Если в течение этого времени пользователь не нажимал клавиши, активизируется запрос. Если используется локальный запрос (к данным, находящимся непосредственно в файле), задержку можно сильно уменьшить. Например до 40ms. (По умолчанию: 400).</p>
<p><strong>cacheLength</strong> &#8211; число ответов от сервера, сохраняемых в кэше. Если установлено в 1 &#8211; кэширование данных отключено. Никогда не устанавливайте меньше единицы. (По умолчанию: 1).</p>
<p><strong>matchSubset</strong> &#8211; использовать ли кэш для уточнения запросов. Использование этой опции может сильно снизить нагрузку на сервер и увеличить производительность. Не забудьте при этом еще и установить для <strong>cacheLength</strong> значение побольше. Например 10. (По умолчанию: 1).</p>
<p><strong>matchCase</strong> &#8211; использовать ли сравнение чувствительное к регистру символов (только если Вы используете кэширование). (По умолчанию: 0).</p>
<p><strong>maxItemsToShow</strong> &#8211; ограничивает число результатов, которые будут показаны в выпадающем списке. Если набор данных содержит сотни элементов, может быть неудобно показывать весь список пользователю. Рекомендованное значение 10. (По умолчанию: -1).</p>
<p><strong>extraParams</strong> &#8211; дополнительные параметры, которые могут быть переданы на сервер. Если Вы напишете {page:4}, то строка запроса к обработчику на сервере будет сформирована следующим образом: my_handler.php?q=foo&amp;page=4 (По умолчанию: {}).</p>
<p><strong>width</strong> &#8211; устанавливает ширину выпадающего списка. По умолчанию ширина выпадающего списка определена шириной элемента ввода. Однако, если ширина элемента ввода небольшая, а строки выпадающего списка содержат большое количество символов &#8211; эта опция вполне может пригодиться. (По умолчанию: 0).</p>
<p><strong>selectFirst</strong> &#8211; если установить в <strong>true</strong>, то по нажатию клавиши Tab или Enter будет выбрано то значение, которое в данный момент установлено в элементе ввода. Если же имеется выбранный вручную (&laquo;подсвеченный&raquo;) результат из выпадающего списка, то будет выбран именно он. (По умолчанию: false).</p>
<p><strong>selectOnly</strong> &#8211; если установить в <strong>true</strong> и в выпадающем списке только одно значение, оно будет выбрано по нажатию клавиши Tab или Enter, даже если этот пункт не был выбран пользователем с помощью клавиатуры или указателя мыши. Заметьте, что эта опция отменяет действие опции <strong>selectFirst</strong>. (По умолчанию: false).</p>
<p><strong>formatItem</strong> &#8211; JavaScript функция, которая поможет обеспечить дополнительную разметку элементов выпадающего списка. Функция будет вызываться для каждого элемента<strong> LI</strong>. Возвращаемые от сервера данные могут быть отображены в элементах <strong>LI</strong> выпадающего списка (см. второй пример). Принимает три параметра: строка результата, позиция строки в списке результатов, общее число элементов в списке результатов. (По умолчанию: none).</p>
<p><strong>onItemSelect</strong> &#8211; JavaScript функция, которая будет вызвана, когда элемент списка выбран. Принимает единственный параметр &#8211; выбранный элемент <strong>LI</strong>. Выбранный элемент будет иметь дополнительный атрибут &laquo;extra&raquo;, значением которого будет являться массив всех ячеек строки, которая была получена в качестве ответа от сервера. (По умолчанию: none).</p>
<p>Последние две опции весьма важны, если Вы хотите сделать действительно удобный и полезный элемент интерфейса, поэтому приведу примеры.</p>
<pre class="brush: jscript;">function liFormat (row, i, num) {
  var result = row[0] + &quot;&lt;em class=&quot;qnt&quot;&gt;&quot; +
  row[1] + &quot; тыс.чел.&lt;/em&gt;&quot;;
  return result;
}</pre>
<p>В опции <strong>formatItem</strong> мы определили имя вызываемой функции &#8211; <strong>liFormat</strong>, а сама функция просто формирует строку, которая будет вставлена в соответствующий элемент <strong>LI</strong>. Строка содержит название поселка и элемент <strong>em</strong>, в который выводится количество проживающих там, в тысячах человек. Элемент <strong>em</strong> имеет класс <strong>qnt</strong>, с помощью которого, используя <strong>CSS</strong>, мы сдвигаем этот элемент вправо, немного уменьшаем размер шрифта и делаем сам шрифт зеленого цвета.</p>
<p>Следующий пример для опции <strong>onItemSelect</strong>:</p>
<pre class="brush: jscript;">function selectItem(li) {
  if( li == null ) var sValue = &quot;Ничего не выбрано!&quot;;
  if( !!li.extra ) var sValue = li.extra[2];
  else var sValue = li.selectValue;
  alert(&quot;Выбрана запись с ID: &quot; + sValue);
}</pre>
<p>Здесь видно как можно работать со значениями атрибута <strong>&laquo;extra&raquo;</strong> выбранного элемента <strong>LI</strong>. В примере мы выводим в <strong>alert</strong> значение идентификатора для записи из нашей тестовой базы.</p>
<p>Нам осталось только разобрать те действия, которые будут выполняться на стороне сервера. Как Вы наверное помните, мы выбрали для этого <strong>PHP</strong>. Вспомним также, что на сервер передается <strong>GET-запрос</strong> с параметром <strong>q</strong>, содержащим уже введенные пользователем символы. Сам код Вы сможете посмотреть, скачав файл примера.</p>
<p>Весь код мы будем выполнять только в случае существования <strong>XMLHttpRequest</strong>,  только если передан GET-запрос с параметром <strong>q</strong>. Для примера используется текстовый файл, в котором содержится база данных. Вот фрагмент этого файла:</p>
<pre class="brush: xml;">1:Пашковский:Краснодарский край:43,0
2:Горячеводский:Ставропольский край:34,4
3:Калинино:Краснодарский край:34,1
4:Приволжский:Саратовская область:32,0
. . . . . . . . . . . . . . . . . . .
268:Залари:Иркутская область:10,0
269:Октябрьский:Пермский край:10,0
270:Ишеевка:Ульяновская область:10,0
271:Жешарт:Республика Коми:10,0
272:Прохоровка:Белгородская область:10,0</pre>
<p>Мы читаем этот файл в массив, а затем в цикле перебираем все строки, в свою очередь разбивая каждую из них в массив, к элементу под номером один (название поселка) которого обращаемся для поиска соответствия с переданным GET-запросом. Если соответствие будет найдена выводим информацию, правда в несколько ином порядке, чем она хранилась в файле.</p>
<blockquote><p>Такой подход выбран во-первых, потому что это пример, который должен быть очень просто воспроизведен на любом другом сайте, и во-вторых, чтобы при очень небольшом объеме данных дать почувствовать тот момент, когда запрос выполняется.</p></blockquote>
<p>Вот собственно и все, обращу разве Ваше внимание на то, что для работы со строками использую <a href="http://ru2.php.net/manual/ru/ref.mb-string.php">мультибайтовые строковые функции</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/39.html/feed</wfw:commentRss>
		<slash:comments>99</slash:comments>
		</item>
		<item>
		<title>jQuery и Ajax: разное</title>
		<link>http://www.linkexchanger.su/2008/37.html</link>
		<comments>http://www.linkexchanger.su/2008/37.html#comments</comments>
		<pubDate>Fri, 15 Feb 2008 05:53:00 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery документация]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/37.html</guid>
		<description><![CDATA[Нам осталось познакомиться еще с несколькими возможностями работы с Ajax, которые предоставляет javascript-библиотека jQuery&#8230;
jQuery.ajaxSetup( options ) &#8211; позволяет выполнить установку глобальных настроек для выполнения ajax-запросов. Принимает один аргумент в виде набора пар ключ/значение чтобы сконфигурировать настройки ajax-запросов по умолчанию. Все настройки опциональны.
Не буду повторять еще раз описания всех доступных опций, поскольку их можно посмотреть в [...]]]></description>
			<content:encoded><![CDATA[<p>Нам осталось познакомиться еще с несколькими возможностями работы с Ajax, которые предоставляет javascript-библиотека jQuery&#8230;<span id="more-37"></span></p>
<p><strong>jQuery.ajaxSetup( options )</strong> &#8211; позволяет выполнить установку глобальных настроек для выполнения ajax-запросов. Принимает один аргумент в виде набора пар ключ/значение чтобы сконфигурировать настройки ajax-запросов по умолчанию. Все настройки опциональны.</p>
<p>Не буду повторять еще раз описания всех доступных опций, поскольку их можно посмотреть в статье <a href="http://www.linkexchanger.su/2008/34.html">jQuery и Ajax: запросы</a>, а приведу только небольшой поясняющий пример:</p>
<pre class="brush: jscript;">$.ajaxSetup({
  url: &quot;/handler.php&quot;,
  timeout: 3000,
  type: &quot;POST&quot;
});
$.ajax({ data: myData });</pre>
<p>Настройки по умолчанию определяют отправку ajax-запроса к url &laquo;/handler.php&raquo;, устанавливают тайм-аут 3 секунды и определяют использование POST-запроса вместо GET для всех ajax-запросов (если настройки не будут переопределены для конкретного запроса).<br />
Следующий же ajax-запрос содержит только некоторые данные, которые передает, руководствуясь глобальными настройками.</p>
<p><strong>serialize( )</strong> &#8211; упорядочивает набор элементов input в строку данных. Начиная с версии jQuery 1.2 корректно работает с формами.<br />
<strong>Пример:</strong><br />
Упорядочиваем данные из формы в строку запроса, которая может быть передана на сервер с помощью ajax-запроса.<br />
<iframe src="http://www.linkexchanger.su/example_jquery_ajax/misc.html" style="border: medium none " height="140" width="420"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery_ajax/misc.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Не буду приводить HTML и CSS для этого примера, тем более, что его можно скачать. Посмотрим только javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  function showValues() {
    var str = $(&quot;form&quot;).serialize();
    $(&quot;#results&quot;).text(str);
  }
  $(&quot;:checkbox, :radio&quot;).click(showValues);
  $(&quot;select&quot;).change(showValues);
  showValues();
});
&lt;/script&gt;</pre>
<p>Функция <strong>showValues()</strong> &#8211; в переменную <strong>str</strong> пишем строку запроса, которую получаем с помощью <strong>serialize()</strong> для jQuery-селектора <strong>form</strong>. Вторая строка там добавлена только для того, чтобы показать эту самую упорядоченную строку запроса в элементе <strong>#results</strong>, т.е. только для примера.</p>
<p>Более интересны следующие строки:</p>
<pre class="brush: jscript;">$(&quot;:checkbox, :radio&quot;).click(showValues);</pre>
<p>Выбираем все элементы <strong>input</strong> типа <strong>checkbox</strong> и <strong>radio</strong> и по клику на любом из них вызываем функцию <strong>showValues()</strong>.</p>
<pre class="brush: jscript;">$(&quot;select&quot;).change(showValues);</pre>
<p>То же самое проделываем для элементов <strong>select</strong>, только с той разницей, что вызовать функцию <strong>showValues()</strong> будем в случае изменений в элементах <strong>select</strong>.</p>
<pre class="brush: jscript;">showValues();</pre>
<p>Просто вызываем функцию <strong>showValues()</strong> в момент готовности объектной модели документа.</p>
<p><strong>serializeArray( )</strong> &#8211; упорядочивает все формы и элементы форм (очень похоже на .serialize() метод), но возвращает данные в виде, который можно использовать для их представления в структуре <strong>JSON</strong>.</p>
<p>Пример очень похожий. Мы получаем данные из форм, прогоняем через цикл, добавляя их в элемент <strong>#result</strong> (для наглядности).<br />
<iframe src="http://www.linkexchanger.su/example_jquery_ajax/misc2.html" style="border: medium none " height="140" width="420"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery_ajax/misc2.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Так же не буду приводить HTML и CSS, а рассмотрим только javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  function showValues() {
    var fields = $(&quot;:input&quot;).serializeArray();
    $(&quot;#results&quot;).empty();
    jQuery.each(fields, function(i, field){
      $(&quot;#results&quot;).append(field.value + &quot; &quot;);
    });
  }
  $(&quot;:checkbox, :radio&quot;).click(showValues);
  $(&quot;select&quot;).change(showValues);
  showValues();
});
&lt;/script&gt;</pre>
<p>Последние три строки абсолютно такие же как и в предыдущем примере, изменилась только функция <strong>showValues()</strong>.</p>
<pre class="brush: jscript;">var fields = $(&quot;:input&quot;).serializeArray();</pre>
<p>В переменную <strong>fields</strong> пишем массив, состоящий из значений полей форм. Обратите внимание, jQuery-селектор <strong>:input</strong> отбирает все элементы <strong>input, textarea, select и button</strong>, а не только input.</p>
<pre class="brush: jscript;">$(&quot;#results&quot;).empty();</pre>
<p>Удаляем все содержимое элемента <strong>#results</strong>.</p>
<pre class="brush: jscript;">jQuery.each(fields, function(i, field){
  $(&quot;#results&quot;).append(field.value + &quot; &quot;);
});</pre>
<p>Для каждого элемента массива <strong>fields</strong> выполняем одну и ту же операцию &#8211; добавляем значение этого поля (с пробелом после него) в элемент <strong>#results</strong> (это опять же для примера, а могли бы делать и что-то другое).</p>
<p>Буду рад, если эта информация кому-нибудь пригодится&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/37.html/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>jQuery и Ajax: события</title>
		<link>http://www.linkexchanger.su/2008/35.html</link>
		<comments>http://www.linkexchanger.su/2008/35.html#comments</comments>
		<pubDate>Thu, 14 Feb 2008 05:51:07 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery документация]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/35.html</guid>
		<description><![CDATA[В предыдущей статье мы немного познакомились с запросами Ajax, которые позволяет выполнять библиотека jQuery. Теперь рассмотрим события Ajax и примеры обработки этих событий&#8230;
ajaxComplete( callback ) &#8211; прикрепляет функцию, которая выполняется всякий раз, когда выполненajax-запрос. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.
Пример: показываем сообщение, когда AJAX запрос выполнен.
$(&#34;#msg&#34;).ajaxComplete(function(request, settings){
  [...]]]></description>
			<content:encoded><![CDATA[<p>В предыдущей статье мы немного познакомились с запросами Ajax, которые позволяет выполнять библиотека jQuery. Теперь рассмотрим события Ajax и примеры обработки этих событий&#8230;<span id="more-35"></span></p>
<p><strong>ajaxComplete( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда выполненajax-запрос. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.<br />
<strong>Пример:</strong> показываем сообщение, когда AJAX запрос выполнен.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxComplete(function(request, settings){
   $(this).append(&quot;&lt;span&gt;Request Complete.&lt;/span&gt;&quot;);
});</pre>
<p><strong>ajaxError( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда какой-либо ajax-запрос неудачен. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе. Третий параметр передается, если при обработке запроса произошла ошибка и эта ошибка определена.<br />
<strong>Пример:</strong> показываем сообщение, когда AJAX запрос неудачен.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxError(function(event, request, settings){
   $(this).append(&quot;&lt;span&gt;Error requesting page &quot;
   + settings.url
   + &quot;&lt;/span&gt;&quot;);
});</pre>
<p><strong>ajaxSend( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда какой-либо ajax-запрос отправлен. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.<br />
<strong>Пример:</strong> показываем сообщение, когда AJAX запрос отправлен.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxSend(function(evt, request, settings){
   $(this).append(&quot;&lt;span&gt;Starting request at &quot;
   + settings.url
   + &quot;&lt;/span&gt;&quot;);
});</pre>
<p><strong>ajaxStart( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда ajax-запрос начат (и нет выполняющихся запросов).<br />
<strong>Пример:</strong> показываем сообщение о загрузке.</p>
<pre class="brush: jscript;">$(&quot;#loading&quot;).ajaxStart(function(){
   $(this).show();
});</pre>
<p><strong>ajaxStop( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда ajax-запросы закончены.<br />
<strong>Пример:</strong> скрываем сообщение о загрузке после того, как все AJAX-запросы окончены.</p>
<pre class="brush: jscript;">$(&quot;#loading&quot;).ajaxStop(function(){
   $(this).hide();
});</pre>
<p><strong>ajaxSuccess( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда ajax-запрос выполнен успешно. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.<br />
<strong>Пример:</strong> показываем сообщени, когда AJAX-запрос выполнен успешно.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxSuccess(function(evt, request, settings){
   $(this).append(&quot;&lt;span&gt;Successful Request!&lt;/span&gt;&quot;);
});</pre>
<p>Чтобы все это было немного понятнее, придумаем, напишем и испытаем какой-нибудь вполне реальный пример, в котором используем некоторые из перечисленных выше событий. Вот сам пример:<br />
<iframe src="http://www.linkexchanger.su/example_jquery_ajax/events.html" style="border: medium none " height="20" width="420"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery_ajax/events.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Итак создадим два файла: <strong>events.html</strong> &#8211; где будут размещен элемент (например обычная ссылка), щелчок мышью на которой будет инициировать <strong>ajax запрос</strong>, и файл <strong>events.php</strong> &#8211; обработчик ajax-запросов.<br />
Понятно, что в раздел <strong>HEAD</strong> файла events.html необходимо подключить библиотеку jQuery.</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.1.js&quot;&gt;&lt;/script&gt;</pre>
<p>Затем простенький HTML-код:</p>
<pre class="brush: xml;">
&lt;ul&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://www.linkexchanger.su/wp-admin/#&quot; id=&quot;a1&quot;&gt;Выполнить Ajax-запрос&lt;/a&gt;
    &lt;span id=&quot;loading&quot;&gt;Выполняется Ajax-запрос...&lt;/span&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;span id=&quot;message&quot;&gt;Ajax-запрос выполнен.&lt;/span&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>кусочек из таблицы стилей:</p>
<pre class="brush: css;">
#loading {
  display:none;
  padding-left:10px;
}
#message {
  display:none;
  padding-left:10px;
}</pre>
<p>и полностью javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#a1&quot;).click(
    function () {
      $.ajax({
        type: &quot;POST&quot;,
        data: &quot;n=3&quot;,
        url: &quot;events.php&quot;
      });
    });  

  $(&quot;#loading&quot;).ajaxStart(function(){
   $(this).show();
   $(&quot;#message&quot;).hide();
  });
  $(&quot;#loading&quot;).ajaxStop(function(){
   $(this).hide();
  });
  $(&quot;#message&quot;).ajaxComplete(function(){
   $(this).show();
 });  

});
&lt;/script&gt;</pre>
<p>Теперь давайте все это попробуем разобрать по шагам и отталкиваться будем от javascript-кода.<br />
По клику на элементе а с идентификатором <strong>а1</strong> будет выполнен <strong>ajax-запрос</strong> к файлу <strong>events.php</strong> (его код чуть позже). Тип запроса мы определим как <strong>POST</strong> и в качестве данных передадим некий параметр <strong>n=3</strong>.<br />
Затем займемся &laquo;развешиванием&raquo; событий на HTML-элементы. По событию <strong>ajaxStart</strong> будет показан элемент с идентификатором <strong>#loading</strong>, изначально скрытый с помощью CSS. Элемент <strong>#message</strong> по этому же событию будет скрыт (он скрыт и изначально, но мы делаем это для того, чтобы скрыть его, если раньше выполнялись запросы и этот элемент был показан). Далее, по событию <strong>ajaxStop</strong> надо будет скрыть элемент <strong>#loading</strong>, а по событию <strong>ajaxComplete</strong> показать элемент <strong>#message</strong>.</p>
<p>А теперь приведу код <strong>обработчика ajax-запроса</strong> &#8211; файл <strong>events.php</strong></p>
<pre class="brush: php;">
&lt;?php
if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') {
  if ($_POST) {
  	for($i=0;$i&lt;count($_POST['n']);$i++) sleep(1);
  } else {
  	echo &quot;Не передан параметр!&quot;;
  }
}
?&gt;</pre>
<p>Для начала мы проверяем существование объекта <strong>XMLHttpRequest</strong> и выполняем код только в том случае, если он существует. Сам по себе этот код только прогоняет цикл из 3 итераций, каждый раз &laquo;засыпая&raquo; на секунду (эта задержка сделана для того, чтобы сам процесс запроса можно было &laquo;почувствовать&raquo;).</p>
<p>Пример получился, естественно простейший, без дальнейшей обработки возвращаемых сервером данных, но его целью было только продемонстрировать работу с <strong>событиями Ajax</strong>, а для более реальных примеров еще будет время&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/35.html/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
	</channel>
</rss>
