<?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>JSToolbox - все о JavaScript &#187; jQuery</title>
	<atom:link href="http://www.jstoolbox.com/category/jquery/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jstoolbox.com</link>
	<description>Блог о программировании вообще и о JavaScript в частности, уроки, статьи, заметки, база знаний.</description>
	<lastBuildDate>Mon, 07 Mar 2011 18:19:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Как создать плагин для jQuery</title>
		<link>http://www.jstoolbox.com/2009/10/03/kak-sozdat-plagin-dlya-jquery/</link>
		<comments>http://www.jstoolbox.com/2009/10/03/kak-sozdat-plagin-dlya-jquery/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 13:11:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Уроки]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=501</guid>
		<description><![CDATA[<p>Чаще всего мне приходится писать скрипты под jQuery, и иногда очень удобно реализовывать функциональность путем создания плагина. В этой статье я покажу как это можно сделать. Пример будет тривиальный, но надеюсь понятный. Фунцкиональнось учебного плагина аналогична hover эффекту - при наведении указателя мыши на элемент, его фон меняется, если убрать указатель, то фон меняется на первоначальный (этого можно достичь при помощи CSS, но не забывайте, что это всего-лишь пример).</p>]]></description>
			<content:encoded><![CDATA[<p>Чаще всего мне приходится писать скрипты под jQuery, и иногда очень удобно реализовывать функциональность путем создания плагина. В этой статье я покажу как это можно сделать. Пример будет тривиальный, но надеюсь понятный. Фунцкиональнось учебного плагина аналогична hover эффекту &#8211; при наведении указателя мыши на элемент, его фон меняется, если убрать указатель, то фон меняется на первоначальный (этого можно достичь при помощи CSS, но не забывайте, что это всего-лишь пример).</p>
<p>В основе библиотеки jQuery лежит класс с аналогичным названием <em>jQuery</em> (у него есть псевдоним $). Подобно тому, как классы в JavaScript можно расширять, используя свойство <em>prototype</em>, точно также мы можем расширить функциональность класса <em>jQuery</em>. Именно таким образом и создаются плагины. Поскольку в jQuery для свойства <em>prototype</em> есть псевдоним <em>fn</em>, то он чаще всего и используется для этой цели.</p>
<p><span id="more-501"></span></p>
<p>Наш плагин начинаем следующим образом:</p>
<pre class="prettyprint">
(function($){
    $.fn.backgroundHover = function(options) {
       return this.each(function () {
          // Код плагина
       });
    };
})(jQuery);
</pre>
<p>Первая и последняя строка этого блока представляют собой вызов анонимной функции, единственным аргументом которого будет объект <em>jQuery</em>. В результате, мы получим еще одну область определения переменных (scope), то есть, все переменные и функции, объявленные внутри этой анонимной функции будут недоступны извне (не распространяются на глобальную область видимости <em>window</em>). Поскольку плагин выполняет действия над некоторым множеством элементов DOM в одном вызове, то мы должны обрабатывать все эти элементы в одном цикле. Это делается при помощи функции <em>each</em> в строке 3.</p>
<p>Все плагины способны принимать некоторое количество параметров, выполним эту функциональность следующим образом:</p>
<pre class="prettyprint">
$.fn.backgroundHover = function(options) {
      options = $.extend({
         background: 'red',
      }, options);
</pre>
<p>Все параметры хранятся в переменной <em>options</em>. Для инициализации этой переменной мы используем фунцию <em>$.extend()</em>, первым аргументом которой указываем объект, с параметрами по умолчанию, второй аргумент &#8211; параметры, указанные пользователем. В нашем случае, имеем всего лишь один параметр &#8211; цвет фона (background), по умолчанию он имеет значение red.</p>
<p>Ну и последний шаг &#8211; добавляем функциональность плагина внутрь функции <em>each</em>:</p>
<pre class="prettyprint">
var self = $(this);
   self.mouseover(function() {
      self.oldBG = self.css('backgroundColor');
      self.css('backgroundColor',options.background);
   });

   self.mouseout(function() {
      self.css('backgroundColor',self.oldBG);
   });
</pre>
<p>В первой строке мы создаем переменную <em>self</em>, которая будет ссылаться на текущий элемент DOM. Для всех выбранных элементов будут добавлены два обработчика событий &#8211; mouseover и mouseout, которые будут менять цвет фона в соответсвии с параметром <em>options.background</em>.</p>
<p>На этом создание плагина закончено, используется он следующим образом:</p>
<pre class="prettyprint">
$('.someNodes').backgroundHover({background: "#fce"});
</pre>
<p>Исходный код плагина можно посмотреть здесь: <a href="http://www.jstoolbox.com/js/background.jquery.js" rel="nofollow">background.jquery.js</a>.</p>
<p><a href="http://www.jstoolbox.com/demo/jqplugin/" class="demo">Демо пример</a><a href="http://blog.slackers.se/2009/09/how-to-create-jquery-plugin.html" class="external">Источник</a></p>
<div class="postLinks"><strong>При поддержке:</strong><br/><br />
<a href="http://majkop.job.ru/">http://majkop.job.ru/</a> &#8211; работа в Майкопе<br/><a href="http://foreign.domania.ru/">http://foreign.domania.ru/</a> &#8211; зарубежная недвижимость<br/><a href="http://obninsk.domania.ru/">http://obninsk.domania.ru/</a> &#8211; недвижимость в обнинске</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/10/03/kak-sozdat-plagin-dlya-jquery/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>jQuery на Microsoft CDN</title>
		<link>http://www.jstoolbox.com/2009/09/30/jquery-na-microsoft-cdn/</link>
		<comments>http://www.jstoolbox.com/2009/09/30/jquery-na-microsoft-cdn/#comments</comments>
		<pubDate>Wed, 30 Sep 2009 18:37:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CDN]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=495</guid>
		<description><![CDATA[Компания Microsoft по всей видимости идет шагами Google в вопросе размещения популярных JavaScript библиотек на своем CDN. Вместо того, чтобы размещать библиотеку jQuery на своем сайте, вы можете указывать напрямую на URL CDN-а.]]></description>
			<content:encoded><![CDATA[<p>Компания Microsoft по всей видимости идет шагами Google в вопросе размещения популярных JavaScript библиотек на своем CDN (<a href="http://en.wikipedia.org/wiki/Content_delivery_network">Content Delivery Network</a>). Вместо того, чтобы размещать библиотеку jQuery на своем сайте, вы можете указывать напрямую на URL CDN-а. Например для jQuery используйте следующие адреса:</p>
<pre class="prettyprint">
http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js
http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.min.js
http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2-vsdoc.js
http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.min-vsdoc.js
</pre>
<p><span id="more-495"></span></p>
<p>Помимо основной библиотеки, на CDN можно также найти и плагин для валидации форм <a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/" title="jQuery Validate Plugin">jQuery Validate</a>, статью о котором я писал <a href="http://www.jstoolbox.com/2008/03/19/proverka-dannyx-form-jquery-validation-plugin/" title="Проверка данных форм – jQuery Validation Plugin">ранее</a>:</p>
<pre class="prettyprint">
http://ajax.microsoft.com/ajax/jquery.validate/1.5.5/jquery.validate.js
http://ajax.microsoft.com/ajax/jquery.validate/1.5.5/jquery.validate.min.js
http://ajax.microsoft.com/ajax/jquery.validate/1.5.5/jquery.validate-vsdoc.js
</pre>
<p>Ну и уж совершенно очевидно, что на своем CDN-е Microsoft также разместил свою библиотеку Microsoft Ajax, полный список файлов которой, вы можете просмотреть здесь: <a href="http://www.asp.net/ajax/cdn/">http://www.asp.net/ajax/cdn/</a>.</p>
<div class="postLinks"><strong>При поддержке:</strong><br/><br />
<a href="http://www.vladivostok.automania.ru/">http://www.vladivostok.automania.ru/</a> &#8211; автомобили владивосток<br/><a href="http://7ls.ru/browse.php?cat=51">http://7ls.ru/browse.php?cat=51</a> &#8211; как писать стихи<br/><a href="http://ad-auto.ru/">http://ad-auto.ru/</a> &#8211; подержанные автомобили</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/09/30/jquery-na-microsoft-cdn/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>YAHOO Query Language</title>
		<link>http://www.jstoolbox.com/2009/07/23/yahoo-query-language/</link>
		<comments>http://www.jstoolbox.com/2009/07/23/yahoo-query-language/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 20:14:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JSON]]></category>
		<category><![CDATA[YQL]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[YAHOO]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=464</guid>
		<description><![CDATA[<p>В последнее время мне все больше нравятся различные новинки от <a href="http://yahoo.com" title="YAHOO Search Engine">YAHOO</a> и в частности то, что предназначено для разработчиков веб приложений. Одной из таких полезных новинок является <a href="http://developer.yahoo.com/yql/" title="YAHOO Query Language">YQL</a> - YAHOO Query Language, такой себе аналог языка SQL для баз данных. По сути он выполняет ту же задачу, что и SQL, однако источником данных являются не обычные базы данных, а различные ресурсы интернета. Например, можно получить последние новости из разных источников, ссылки из <a href="http://delicious.com">delicious</a>, записи из <a href="http://twitter.com">twitter-а</a>, выполнить поиск по изображениям на <a href="http://flickr.com">Flickr</a> и многое другое. Кроме того с недавнего времени YQL позволяет не только делать выборки данные, но также и выполнять вставки, удаление и обновление (CRUD).</p>]]></description>
			<content:encoded><![CDATA[<p>В последнее время мне все больше нравятся различные новинки от <a href="http://yahoo.com" title="YAHOO Search Engine">YAHOO</a> и в частности то, что предназначено для разработчиков веб приложений. Одной из таких полезных новинок является <a href="http://developer.yahoo.com/yql/" title="YAHOO Query Language">YQL</a> &#8211; YAHOO Query Language, такой себе аналог языка SQL. По сути он выполняет ту же задачу, что и SQL, однако источником данных являются не обычные базы данных, а различные ресурсы интернета. Например, можно получить последние новости из разных источников, ссылки из <a href="http://delicious.com">delicious</a>, записи из <a href="http://twitter.com">twitter-а</a>, выполнить поиск по изображениям на <a href="http://flickr.com">Flickr</a> и многое другое. Кроме того с недавнего времени YQL позволяет не только делать выборки данных, но также и выполнять добавление, удаление и обновление (CRUD).</p>
<p><span id="more-464"></span></p>
<p>Чтобы вам было более понятно, с чем мы имеем дело, покажу некоторые примеры запросов.</p>
<h4>Получение последних записей из твиттера</h4>
<p>Этот запрос просто выбирает последние записи пользователя, id которого указывается в условии <em>where</em> (в данном случае аккаунт твиттера мой &#8211; <a href="http://twitter.com/ischenko" title="Мой твиттер">http://twitter.com/ischenko</a> <img src='http://www.jstoolbox.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ):</p>
<pre class="prettyprint">
select * from twitter.user.timeline where id='ischenko'
</pre>
<h4>Пост в твиттер</h4>
<p>В начале запроса мы подключаем таблицу twitter.status.xml, которая позволяет добавлять записи в твиттер &#8211; это так называемая <strong>Открытая таблица данных</strong> (Open Data Table). Кроме того для выполнения запросов CRUD нужно использовать защищенное соединение (https):</p>
<pre class="prettyprint">
use 'http://www.yqlblog.net/samples/twitter.status.xml';
insert into twitter.status (status,username,password) values ("Playing with INSERT UPDATE and DELETE in YQL", "ischenko","****************")
</pre>
<h4>Поиск в Flickr изображений, содержащих в названии &quot;Cat&quot;</h4>
<pre class="prettyprint">
select * from flickr.photos.search where text="Cat" limit 10
</pre>
<h4>Выборка пяти последних новостей BBC</h4>
<p>Здесь нужные данные выбираются при помощи <em>xpath</em> из веб страницы с указанным <em>url</em> (в данном случае это news.bbc.co.uk). Количество возвращаемых данных ограничиваем при помощи команды LIMIT:</p>
<pre class="prettyprint">
SELECT * FROM html WHERE url='http://news.bbc.co.uk' AND xpath="//*[@id='livestats200']//ul[contains(@class,'popstoryList')]/li/a" LIMIT 5
</pre>
<p><br/></p>
<p>Теперь о том, где и как эти запросы выполнить и как получать результат. Выполнить запрос можно по следующему адресу: <em>http://query.yahooapis.com/v1/public/yql</em>. В качестве параметров нужно указать следующее: <strong>q</strong> &#8211; запрос, <strong>format</strong> &#8211; тип возвращаемых данных &#8211; XML, JSON, JSONP, <strong>callback</strong> &#8211;  функция, в которую будут &#8220;обернуты&#8221; возвращаемые данные (для работы с JavaScript), причем это касается не только JSON, но и XML. Также для некоторых таблиц необходимо указывать параметр <strong>env</strong> (в том случае, если вы явно не используете директиву USE) &#8211; в этом параметре указвыется среда выполнения, например: <em>env=http://datatables.org/alltables.env</em>.</p>
<p>Пример запроса, который выполняет выборку из <a href="http://delicious.com" rel="nofollow">Delicious</a> последних записей с тегом <em>JavaScript</em>:<br/><a href="http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20delicious.feeds.popular%20where%20tag%3D%27javascript%27&#038;format=xml&#038;env=http%3A%2F%2Fdatatables.org%2Falltables.env">http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20delicious.feeds.popular%20where%20tag%3D%27javascript%27&#038;format=xml&#038;env=http%3A%2F%2Fdatatables.org%2Falltables.env</a>.</p>
<p>Также запросы можно выполнять в <a href="http://developer.yahoo.com/yql/console/" title="YQL console">специальной консоли</a>. В ней очень удобно проверять выполнение запросов, также там содержится множество примеров и большой список доступных таблиц данных.</p>
<p>Теперь остановимся на вопросе использования YQL из JavaScript. Мне кажется, что самый простой вариант это использование <a href="http://www.jstoolbox.com/2009/03/18/chto-takoe-jsonp/" title="Что такое JSONP">JSONP</a>, ибо, как я уже писал выше, YQL запрос поддерживает параметр <strong>callback</strong>, в который вставляется результат. Реализацию такого подхода я нашел на сайте <a href="http://james.padolsey.com/javascript/using-yql-with-jsonp/" rel="nofollow">Джеймса Пэдолси</a>:</p>
<pre class="prettyprint">
// YQL serves JSONP (with a callback) so all we have to do
// is create a script element with the right 'src':
function YQLQuery(query, callback) {
    this.query = query;
    this.callback = callback || function(){};
    this.fetch = function() {

        if (!this.query || !this.callback) {
            throw new Error('YQLQuery.fetch(): Parameters may be undefined');
        }

        var scriptEl = document.createElement('script'),
            uid = 'yql' + +new Date(),
            encodedQuery = encodeURIComponent(this.query.toLowerCase()),
            instance = this;

        YQLQuery[uid] = function(json) {
            instance.callback(json);
            delete YQLQuery[uid];
            document.body.removeChild(scriptEl);
        };

        scriptEl.src = 'http://query.yahooapis.com/v1/public/yql?q='
                     + encodedQuery + '&#038;format=json&#038;callback=YQLQuery.' + uid;
        document.body.appendChild(scriptEl);

    };
}
</pre>
<p>Используйте его так:</p>
<pre class="prettyprint">
// Составлям запрос
var query = "select * from rss where url='feeds2.feedburner.com/ajaxian' limit 1";

// Создаем обработчик
var callback = function(data) {
    var post = data.query.results.item;
    alert(post.title);
};

// Создаем экземпляр класса
var ajaxianPosts = new YQLQuery(query, callback);

// Выполняем запрос
ajaxianPosts.fetch();
</pre>
<p>Если вы любите работать с <a href="http://jquery.com">jQuery</a>, то можете воспользоваться следующим простым плагином:</p>
<pre class="prettyprint">
$.YQL = function(query, callback) {

    if (!query || !callback) {
        throw new Error('$.YQL(): Parameters may be undefined');
    }

    var encodedQuery = encodeURIComponent(query.toLowerCase()),
        url = 'http://query.yahooapis.com/v1/public/yql?q='
            + encodedQuery + '&#038;format=json&#038;callback=?';

    $.getJSON(url, callback);
};

// Использование
$.YQL("select * from rss where url='feeds2.feedburner.com/ajaxian' limit 1", function(data) {
    var post = data.query.results.item;
    alert(post.title);
});
</pre>
<p>Ну и как обычно, напоследок <a href="http://jstoolbox.com/demo/yql.php" title="Пример работы с YQL">демо пример</a>, в котором я использую показанный выше плагин для получения и обработки RSS потока сайта <a href="href="http://ajaxian.com" rel="nofollow">Ajaxian</a>. Надеюсь вам понравится такой способ работы с данными <img src='http://www.jstoolbox.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="postLinks"><strong>При поддержке:</strong><br/><a href="http://www.trucklist.ru/">http://www.trucklist.ru/</a> &#8211; продажа спецтехники<br/><a href="http://www.automania.ru/audi/">http://www.automania.ru/audi/</a><br/><a href="http://irr.ru/cars/">http://irr.ru/cars/</a>продажа подержанных автомобилей</div>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/07/23/yahoo-query-language/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Реализация бесконечной прокрутки на jQuery</title>
		<link>http://www.jstoolbox.com/2009/04/18/realizaciya-beskonechnoj-prokrutki-na-jquery/</link>
		<comments>http://www.jstoolbox.com/2009/04/18/realizaciya-beskonechnoj-prokrutki-na-jquery/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 21:44:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[бесконечная прокрутка]]></category>
		<category><![CDATA[юзабилити]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=428</guid>
		<description><![CDATA[<p>Всем вам должны быть хорошо известны интерфейсы просмотра лент новостей, записей блогов, в которых новые записи подгружаются по мере чтения. Новые данные подгружаются в тот момент, когда полоса прокрутки достигает самого низа. Хорошим примером такого интерфейса является <a href="http://reader.google.com" rel="nofollow">Google Reader</a>, а также сайт <a href="http://dzone.com" rel="nofollow">DZone</a>. Сегодня я покажу, как можно сделать такой интерфейс при помощи jQuery. Приложение будет имитировать работу блога, в котором при загрузке страницы, посредством AJAX будут загружаться первые 10 записей, а остальные будут подгружаться по мере чтения.</p>]]></description>
			<content:encoded><![CDATA[<p>Всем вам должны быть хорошо известны интерфейсы просмотра лент новостей, записей блогов, в которых новые записи подгружаются по мере чтения. Новые данные подгружаются в тот момент, когда полоса прокрутки достигает самого низа. Хорошим примером такого интерфейса является <a href="http://reader.google.com" rel="nofollow">Google Reader</a>, а также сайт <a href="http://dzone.com" rel="nofollow">DZone</a>. Сегодня я покажу, как можно сделать такой интерфейс при помощи jQuery. Приложение будет имитировать работу блога, в котором при загрузке страницы, посредством AJAX будут загружаться первые 10 записей, а остальные будут подгружаться по мере чтения.</p>
<p><span id="more-428"></span><br />
<br/></p>
<p>Начнем с создания простой HTML страницы, в теле которой имеется всего лишь один <em>div</em> &#8211; в него будут подгружаться записи. В этот div добавим элемент <em>&lt;div id=&#8221;loader&#8221;&gt;</em>, для того, чтобы использовать его как индикатора ожидания.</p>
<pre class="prettyprint">
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
&lt;html>
&lt;head>
	&lt;script type="text/javascript" src="jquery.js">&lt;/script>

	&lt;style type="text/css">
	#blog {border:1px solid #aaf;background:#f9f9f9;padding:4px}
	.post {border:1px solid #aaa;background:#fff;padding:4px;margin: 2px 0}
	#loading {height: 40px}
	&lt;/style>
&lt;/head>

&lt;body id="hello_body">

	&lt;div id="blog">
		&lt;div id="loading" style="display:none">Loading....&lt;/div>
	&lt;/div>
&lt;/body>
&lt;/html>
</pre>
<p>Здесь также подключаем скрипт <em>jquery.js</em>, а также стили для блога и записей.</p>
<p>Далее переходим к созданию скрипта, вся функциональность которого будет заключена в объект <em>engine</em>:</p>
<pre class="prettyprint">
var engine = {
	posts : [],
	target : null,
	busy : false,
	count : 5
}
</pre>
<p>В переменных объекта <em>engine</em> хранятся различные параметры работы скрипта &#8211; количество подгружаемых за один раз записей (<strong>count</strong>), элемент, в который эти записи должны добавляться (<strong>target</strong>), состояние скрипта (<strong>busy</strong>), и массив записей (<strong>post</strong>).</p>
<p>Инициализация скрипта будет производиться функцией <strong>init</strong>:</p>
<pre class="prettyprint">
init : function(posts, target){
	if (!target)
		return;

	this.target = $(target);

	this.append(posts);

	var that = this;
	$(window).scroll(function(){
		if ($(document).height() - $(window).height() <= $(window).scrollTop() + 50) {
			that.scrollPosition = $(window).scrollTop();
			that.get();
		}
	});
}
</pre>
<p>Функция принимает два параметра - массив записей и элемент, в который записи должны быть добавлены. В конце функции добавляется обработчик события <em>onscroll</em> для объекта <em>window</em>. Его задача - определять положение полосы прокрутки, и если она находится в крайнем нижнем положении, то вызывать функцию подгрузки записей <strong>get()</strong>. Фунция <strong>get()</strong> отправляет AJAX запрос на сервер и, получая в ответ записи блога, добавляет их в элемент <em>target</em>:</p>
<pre class="prettyprint">
get : function() {
	if (!this.target || this.busy) return;

	if (this.posts &#038;&#038; this.posts.length) {
		var lastId = this.posts[this.posts.length-1].id;
	} else {
		var lastId = 0;
	}

	this.setBusy(true);

	var that = this;
	$.getJSON('getposts.php', {count:this.count, last:lastId},
		function(data){
			if (data.length > 0) {
				that.append(data);
			}
			that.setBusy(false);
		}
	);
}
</pre>
<p>Данные о всех записях, которые загружаются с сервера, хранятся в переменной <em>engine.posts</em>. Перед отправкой очередного запроса на сервер, функция <strong>get()</strong> получает id последнего элемента в этом списке (<em>lastId</em>), для того чтобы передать его в параметрах запроса. Это нужно для того, чтобы серверный скрипт знал, какие записи уже получены, и какие элементы нужно отправить.</p>
<p>Как в функции <strong>init()</strong>, так и в функции <strong>get()</strong>, для отображения записей используется функция <strong>append()</strong>, которая в связке с <strong>render()</strong> создает HTML код записи и добавляет его в целевой элемент (target):</p>
<pre class="prettyprint">
append : function(posts){
	posts = (posts instanceof Array) ? posts : [];
	this.posts = this.posts.concat(posts);

	for (var i=0, len = posts.length; i < len; i++) {
		this.target.append(this.render(posts[i]));
	}

	if (this.scrollPosition !== undefined &#038;&#038; this.scrollPosition !== null) {
		$(window).scrollTop(this.scrollPosition);
	}
},

render : function(obj){
	var xhtml = '&lt;div class="post" id=post_'+obj.id+'>';
	if (obj.title) {
		xhtml += '&lt;h2>'+obj.title+'&lt;/h2>';
	}
	if (obj.posted_at) {
		xhtml += '&lt;div class="posted_at">Posted on: '+obj.posted_at+'&lt;/div>';
	}
	if (obj.comments_count) {
		xhtml += '&lt;div class="comments_count">Comments: ' + obj.comments_count + '&lt;/div>';
	}
	xhtml += '&lt;div class="content">' + obj.content + '&lt;/div>';
	xhtml += '&lt;/div>';

	return xhtml;
}
</pre>
<p>Еще стоит упомянуть одну небольшую деталь: в обработчике события <strong>onscroll</strong> я сохраняя позицию полосы прокрутки, чтобы потом, после добавления новых записей, восстановить её. Это нужно для того, чтобы положение полосы прокрутки не изменялось, при добавлении новых записей в конец списка:</p>
<pre class="prettyprint">
// сохраняем значение в обработчике onscroll
that.scrollPosition = $(window).scrollTop();

.......

// восстанавливаем значение в функции append
if (this.scrollPosition !== undefined &#038;&#038; this.scrollPosition !== null) {
	$(window).scrollTop(this.scrollPosition);
}
</pre>
<p>Теперь, после того, как скрипт создан, можно использовать его. Так же как и для большинства скриптов jQuery, добавляем код инициализации  в фукнцию <strong>ready()</strong>:</p>
<pre class="prettyprint">
$(document).ready(function(){
	engine.init(null, $("#blog"));
	engine.get();
});
</pre>
<p>Вот пожалуй и все описание скрипта, как видите он совсем не сложный. Демо приложения можно посмотреть здесь: <a href="/demo/endless/">смотреть демо</a>. Полностью скрипт доступен на <a href="http://gist.github.com/97794">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/04/18/realizaciya-beskonechnoj-prokrutki-na-jquery/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Интерфейс &#8216;Events&#8217; для jQuery</title>
		<link>http://www.jstoolbox.com/2009/04/06/interfejs-events-dlya-jquery/</link>
		<comments>http://www.jstoolbox.com/2009/04/06/interfejs-events-dlya-jquery/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 22:12:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.jstoolbox.com/?p=438</guid>
		<description><![CDATA[<p>По моему скромному мнению, код скриптов, написанных на jQuery порою напоминают что угодно, только не язык программирования JavaScript. Все дело в обильном применении шаблона программирования &#34;цепь&#34; - когда результат выполнения одной функции непосредственно передается в другую.</p>
<p>Конечно же это дело вкуса, но лично мне такая запись не всегда нравится. <a href="http://james.padolsey.com/">James Padolsey</a> решил немного изменить такую ситуацию, однако только в плане работы с событиями.]]></description>
			<content:encoded><![CDATA[<p>По моему скромному мнению, код скриптов, написанных на jQuery порою напоминают что угодно, только не язык программирования JavaScript. Все дело в обильном применении шаблона программирования &quot;цепь&quot; &#8211; когда результат выполнения одной функции непосредственно передается в другую:</p>
<pre class="prettyprint">
$('selector').click().onmouseover().onmouseout().focus();
</pre>
<p>Конечно же это дело вкуса, но лично мне такая запись не всегда нравится. <a href="http://james.padolsey.com/">James Padolsey</a> решил немного изменить такую ситуацию, однако только в плане работы с событиями. В одной из своих <a href="http://james.padolsey.com/javascript/events-interface-for-jquery/">статей</a> он предложил вариант назначения обработчиков при помощи созданной им функции <em>events</em>:</p>
<p><span id="more-438"></span></p>
<pre class="prettyprint">
$(elem).events({
    focus : function(){...},
    click : function(){...},
    mouseup : function(){...},
    'mousedown.namespace' : function(){...},
    exit : function(){...}
});
</pre>
<p>Как по мне, такой вариант гораздо лучше читается. Хотелось бы, чтобы в jQuery появилась такая функция, тем более, что её реализация очень проста &#8211; всего 6 строк:</p>
<pre class="prettyprint">
jQuery.fn.events = function(o){
    for (var i in o) {
        this.bind(i, o[i]);
    }
    return this;
};
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.jstoolbox.com/2009/04/06/interfejs-events-dlya-jquery/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

