<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3032638255243429204</id><updated>2011-12-28T18:04:34.012-08:00</updated><category term='загрузка по требованию'/><category term='copy-of'/><category term='checkbox'/><category term='lazy load'/><category term='xsl'/><category term='radio'/><category term='CSS'/><category term='выравнивание'/><category term='пакеты'/><category term='quirks'/><category term='паттерн'/><category term='декоратор'/><category term='XML'/><category term='xslt'/><category term='tag'/><category term='event'/><category term='наследование'/><category term='оптимизация'/><category term='loose coupling'/><category term='null'/><category term='jquery'/><category term='inheritance'/><category term='delete'/><category term='isArray'/><category term='debounce'/><category term='useScript'/><category term='html'/><category term='clip'/><category term='loadScript'/><category term='IE'/><category term='performance'/><category term='getScript'/><category term='JavaScript'/><category term='bus'/><category term='requireScript'/><category term='usability'/><category term='throttle'/><category term='zforms'/><category term='класс'/><category term='label'/><category term='ссылки'/><title type='text'>Филатов Дмитрий</title><subtitle type='html'>вебдев</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-6235131183121063206</id><published>2010-08-12T15:10:00.000-07:00</published><updated>2010-08-12T15:37:15.156-07:00</updated><title type='text'>Честный undefined</title><content type='html'>&lt;p&gt;В коде jQuery наткнулся на&amp;#160;красивый способ получения &amp;#171;честного&amp;#187; undefined:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(function(undefined) {

// тут мы имеем настоящий undefined

})();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Напомню, что глобальный &lt;code&gt;undefined&lt;/code&gt; можно легко переопределить:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;window.undefined = 'some_value';&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Вышеприведенный же способ позволяет иметь в&amp;#160;своем коде настоящий, &amp;#171;защищенный&amp;#187; &lt;code&gt;undefined&lt;/code&gt;, неподверженный переопределению извне.&lt;/p&gt;
&lt;p&gt;Кроме этого, добавляются &amp;#171;бесплатные&amp;#187; бонусы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;undefined&lt;/code&gt; становится локальным внутри кода, обращение к&amp;#160;нему будет быстрее, чем к&amp;#160;глобальному &lt;code&gt;undefined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;внутри такого кода &lt;code&gt;undefined&lt;/code&gt; будет пожат обфускаторами кода, в&amp;#160;отличие от&amp;#160;глобального&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;По-моему, очень изящно.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-6235131183121063206?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/6235131183121063206/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=6235131183121063206' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6235131183121063206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6235131183121063206'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2010/08/undefined.html' title='Честный undefined'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-5311690604696658098</id><published>2009-11-12T06:08:00.000-08:00</published><updated>2009-11-13T02:12:08.356-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='event'/><category scheme='http://www.blogger.com/atom/ns#' term='bus'/><category scheme='http://www.blogger.com/atom/ns#' term='tag'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='loose coupling'/><title type='text'>Tagged EventBus</title><content type='html'>&lt;p&gt;Развивая идею loose coupling, заложенную в&amp;#160;паттерне EventBus, хочу предложить полезное, на&amp;#160;мой взгляд, улучшение&amp;#160;&amp;#8212; тэгирование событий.&lt;/p&gt;
&lt;p&gt;Моя идея в&amp;#160;том, чтобы идентифицировать события не&amp;#160;по&amp;#160;какому-то одному ключу, а&amp;#160;по&amp;#160;набору ключей&amp;#160;&amp;#8212; тэгов. Т.е. описываем событие тэгами как на стороне подписчика, так и на стороне паблишера, исходя из его предметной области.&lt;/p&gt;
&lt;p&gt;Например, один объект хочет слушать открытие любых попапов, а&amp;#160;другой&amp;#160;&amp;#8212; только попапов авторизации.&lt;/p&gt;
&lt;p&gt;В таком случае, обычные попапы при открытии посылают событие примерно так:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$.eventBus.trigger('popup open');&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Попапы с&amp;#160;авторизацией так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.eventBus.trigger('popup auth open');&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Те&amp;#160;слушатели, которые хотят слушать открытие любых попапов, включая попапы авторизации, подписываются так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.eventBus.bind('popup open', handlerForPopups);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;А&amp;#160;те,&amp;#160;которые слушают открытие только попапов авторизации, так:&lt;p&gt;
&lt;pre&gt;&lt;code&gt;$.eventBus.bind('popup auth open', handlerForAuthPopup);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Т.е. если множество тэгов при bind является подмножеством множества тэгов при trigger&amp;#160;&amp;#8212; то&amp;#160;обработчик события срабатывает.&lt;/p&gt;

&lt;p&gt;Простейшую реализацию Tagged EventBus можно скачать с&amp;#160;&lt;a href="http://code.google.com/p/jquery-eventbus/downloads/list"&gt;code.google&lt;/a&gt;. &lt;b&gt;UPD:&lt;/b&gt; реализация допилена&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-5311690604696658098?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/5311690604696658098/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=5311690604696658098' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/5311690604696658098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/5311690604696658098'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/11/tagged-eventbus.html' title='Tagged EventBus'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-1380770342715760293</id><published>2009-06-22T11:23:00.001-07:00</published><updated>2009-06-22T11:57:42.761-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='delete'/><category scheme='http://www.blogger.com/atom/ns#' term='null'/><title type='text'>Delete vs null</title><content type='html'>&lt;p&gt;Заметил, что у&amp;#160;меня очень долго выполняется очистка памяти от&amp;#160;ненужных объектов.&lt;/p&gt;
&lt;p&gt;Оказалось, что присваивание &lt;code&gt;null&lt;/code&gt;, выполняя примерно ту&amp;#160;же&amp;#160;функцию очистки памяти что и&amp;#160;&lt;code&gt;delete&lt;/code&gt;, работает быстрее, в&amp;#160;зависимости от&amp;#160;браузера:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IE6&amp;#160;&amp;#8212; примерно в&amp;#160;десять раз,&lt;/li&gt;
&lt;li&gt;IE8&amp;#160;&amp;#8212; примерно в&amp;#160;четыре раза,&lt;/li&gt;
&lt;li&gt;Firefox 3&amp;#160;&amp;#8212; примерно вдвое,&lt;/li&gt;
&lt;li&gt;Opera&amp;#160;&amp;#8212; примерно на&amp;#160;10-20%.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Разница между &lt;code&gt;delete&lt;/code&gt; и&amp;#160;присваиванием &lt;code&gt;null&lt;/code&gt; в&amp;#160;том, что, во-первых, после &lt;code&gt;delete&lt;/code&gt; значение становится &lt;code&gt;undefined&lt;/code&gt;, во-вторых, удаляется не&amp;#160;только значение, но&amp;#160;и&amp;#160;ключ, таким образом, исчезая из&amp;#160;циклов вида &lt;code&gt;for in&lt;/code&gt;, в&amp;#160;отличие от&amp;#160;присваивания &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Если вышеперечисленное не&amp;#160;играет роли, то&amp;#160;можно смело пользоваться присваиванием &lt;code&gt;null&lt;/code&gt; вместо &lt;code&gt;delete&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-1380770342715760293?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/1380770342715760293/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=1380770342715760293' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/1380770342715760293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/1380770342715760293'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/06/delete-vs-null_22.html' title='Delete vs null'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-8890321741282585480</id><published>2009-06-13T04:32:00.000-07:00</published><updated>2009-06-13T14:08:47.114-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='ссылки'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Думай о ссылках</title><content type='html'>&lt;p&gt;Раздражает, когда ссылка-изображения и&amp;#160;ссылка-подпись к&amp;#160;ней являются двумя разными ссылками, ведущими в&amp;#160;одно и&amp;#160;то&amp;#160;же место. В&amp;#160;этом случае, наводя на&amp;#160;ссылку-изображение, ссылка-подпись, конечно&amp;#160;же, не&amp;#160;подсвечивается. В&amp;#160;этот момент я&amp;#160;начинаю думать, что, возможно, ссылка-подпись ведет в&amp;#160;другое место, и&amp;#160;перемещаю курсор к&amp;#160;ней, и&amp;#160;начинаю в&amp;#160;памяти сравнивать урлы этих двух ссылок. Хотя мог&amp;#160;бы и&amp;#160;не&amp;#160;делать этого, если&amp;#160;бы по&amp;#160;наведению на&amp;#160;изображение, подсветилась&amp;#160;бы и&amp;#160;подпись к&amp;#160;нему.&lt;/p&gt;
&lt;p&gt;На моей практике, в&amp;#160;90%&amp;#160;процентов случаев, можно было, немного подумав, сделать их&amp;#160;одной ссылкой, включив изображение в&amp;#160;ссылку-подпись и,&amp;#160;затем, вынеся его визуально с&amp;#160;помощью &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;Еще из&amp;#160;похожей темы&amp;#160;&amp;#8212; когда у&amp;#160;ссылки есть иконка, не&amp;#160;являющейся ссылкой. Как так? Это же&amp;#160;одно целое.&lt;/p&gt;
&lt;p&gt;Другая распространенная &amp;#171;болезнь&amp;#187; ссылок&amp;#160;&amp;#8212; ссылки на&amp;#160;странице на&amp;#160;саму себя. В&amp;#160;навигации, в&amp;#160;тексте, да все равно где. Не&amp;#160;должно быть такого. Любая ссылка должна совершать какое-то действие, переход. Казалось&amp;#160;бы, это общеизвестная истина, тем не&amp;#160;менее, нарушаемая на&amp;#160;подавляющем большинстве сайтов. Если ваш &amp;#171;супердвижок&amp;#187; или &amp;#171;супершаблонизатор&amp;#187; не&amp;#160;позволяют сделать этого&amp;#160;&amp;#8212; не&amp;#160;прикрывайтесь этим, переписывайте движок.&lt;/p&gt;
&lt;p&gt;Когда я&amp;#160;в&amp;#160;разговоре с&amp;#160;кем-нибудь говорю обо всем этом, меня начинают обвинять в&amp;#160;перфекционизме. А&amp;#160;мне кажется, это такие вещи, о&amp;#160;которых должен задуматься, хотя&amp;#160;бы раз, каждый хороший веб-разработчик.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-8890321741282585480?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/8890321741282585480/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=8890321741282585480' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/8890321741282585480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/8890321741282585480'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/06/blog-post.html' title='Думай о&amp;#160;ссылках'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-3078461243370527626</id><published>2009-05-28T12:43:00.000-07:00</published><updated>2009-05-29T07:57:53.721-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='оптимизация'/><category scheme='http://www.blogger.com/atom/ns#' term='паттерн'/><category scheme='http://www.blogger.com/atom/ns#' term='декоратор'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='debounce'/><category scheme='http://www.blogger.com/atom/ns#' term='throttle'/><title type='text'>Микропаттерны оптимизации в JavaScript: декораторы функций debouncing и throttling</title><content type='html'>&lt;p&gt;Декораторы функций позволяют добавить дополнительное поведение функции, не&amp;#160;изменяя ее.&amp;#160;Сигнатура оригинальной и&amp;#160;декорированной функции полностью совпадают.&lt;/p&gt;
&lt;h2&gt;Debouncing&lt;/h2&gt;
&lt;p&gt;Если дословно переводить&amp;#160;&amp;#8212; &amp;#171;устранение дребезга&amp;#187;. Такой декоратор позволяет превратить несколько вызовов функции в&amp;#160;течение определенного времени в&amp;#160;один, причем задержка начинает заново отсчитываться с&amp;#160;каждой новой попыткой вызова. Возможно два варианта:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Реальный вызов происходит только в&amp;#160;случае, если с&amp;#160;момента последней попытки прошло время, большее или равное задержке.&lt;/li&gt;
&lt;li&gt;Реальный вызов происходит сразу, а&amp;#160;все остальные попытки вызова игнорируются, пока не&amp;#160;пройдет время, большее или равное задержке, отсчитанной от&amp;#160;времени последней попытки.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Пример использования&lt;/h4&gt;
&lt;p&gt;Например, у&amp;#160;вас есть suggest. Посылать запросы к&amp;#160;серверу на&amp;#160;каждый &lt;code&gt;keyup&lt;/code&gt; расточительно и&amp;#160;не&amp;#160;нужно. Можно декорировать обработчик, чтобы он&amp;#160;срабатывал только после того, как пользователь перестал нажимать на&amp;#160;клавиши, допустим, в&amp;#160;течение 300&amp;#160;миллисекунд:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function onKeyUp() { ... };

$('input[name=suggest]').keyup($.debounce(onKeyUp, 300));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Или у&amp;#160;вас есть один обработчик на&amp;#160;несколько событий, и&amp;#160;нужно, чтобы если в&amp;#160;течение некоторого времени происходит оба события, обработчик срабатывал только на&amp;#160;последнем произошедшем событии:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$('input').bind('keyup blur', $.debounce(process, 300));&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Throttling&lt;/h2&gt;
&lt;p&gt;Данный декоратор позволяет &amp;#171;затормозить&amp;#187; функцию&amp;#160;&amp;#8212; функция будет выполняться не&amp;#160;чаще одного раза в&amp;#160;указанный период, даже если она будет вызвана много раз в&amp;#160;течение этого периода. Т.е. все промежуточные вызовы будут игнорироваться.&lt;/p&gt;
&lt;h4&gt;Пример использования&lt;/h4&gt;
&lt;p&gt;Например, на&amp;#160;&lt;code&gt;resize&lt;/code&gt; окна (или, допустим, на &lt;code&gt;mousemove&lt;/code&gt;) у&amp;#160;вас срабатывает какой-то тяжелый обработчик. Можно его &amp;#171;затормозить&amp;#187;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$(window).resize($.throttle(doComplexСomputation, 300));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;В итоге, функция будет выполняться не&amp;#160;чаще, чем раз в&amp;#160;300&amp;#160;миллисекунд.&lt;/p&gt;
&lt;p&gt;Мои реализации в&amp;#160;виде jQuery-плагина можно скачать с&amp;#160;&lt;a href="http://code.google.com/p/jquery-debounce/downloads/list"&gt;code.google&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ps. Навеяно книжкой Николаса Закаса &amp;#171;&lt;a href="http://www.amazon.com/Professional-JavaScript-Developers-Wrox-Programmer/dp/047022780X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1243595063&amp;sr=8-1"&gt;Professional JavaScript for Web Developers, 2nd Edition&lt;/a&gt;&amp;#187;, хотя в&amp;#160;ней он&amp;#160;путает &lt;code&gt;debounce&lt;/code&gt; и&amp;#160;&lt;code&gt;throttle&lt;/code&gt;, называя первое вторым.
На&amp;#160;ajaxian тоже поднималась &lt;a href="http://ajaxian.com/archives/debounce-your-javascript-functions"&gt;эта тема&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-3078461243370527626?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/3078461243370527626/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=3078461243370527626' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3078461243370527626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3078461243370527626'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/05/debouncing.html' title='Микропаттерны оптимизации в&amp;#160;JavaScript: декораторы функций debouncing и&amp;#160;throttling'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-4028355279444866010</id><published>2009-05-20T11:08:00.000-07:00</published><updated>2009-05-25T03:38:40.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='загрузка по требованию'/><category scheme='http://www.blogger.com/atom/ns#' term='useScript'/><category scheme='http://www.blogger.com/atom/ns#' term='lazy load'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='getScript'/><category scheme='http://www.blogger.com/atom/ns#' term='loadScript'/><category scheme='http://www.blogger.com/atom/ns#' term='requireScript'/><title type='text'>Загрузка по требованию и jQuery</title><content type='html'>&lt;p&gt;Несмотря на&amp;#160;то,&amp;#160;что необходимо минимизировать количество http-запросов, иногда (или часто, в зависимости от задачи) бывает полезно загружать часть &amp;#171;тяжелого&amp;#187; функционала только тогда, когда он&amp;#160;действительно понадобится на&amp;#160;странице.&lt;/p&gt;
&lt;p&gt;У jQuery есть механизм, позволяющий осуществить это&amp;#160;&amp;#8212; &lt;code&gt;$.getScript&lt;/code&gt;, однако, он&amp;#160;обладает рядом недостатков:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;не запоминаются уже загруженные или загружаемые в данный момент скрипты, при повторном запросе опять идет их&amp;#160;загрузка.&lt;/li&gt;
&lt;li&gt;нельзя указать сразу несколько скриптов&lt;/li&gt;
&lt;li&gt;выключен кэш (к&amp;#160;каждому урлу насильно приписываются параметры типа &lt;code&gt;?_=1242843920520&lt;/code&gt;). Зачем это было так жестко сделано, для меня осталось загадкой.&lt;/li&gt;
&lt;li&gt;у коллбэка нельзя задать контекст (это вообще болезнь коллбэков jQuery, хотя, как недавно рассказал Азат, разработчиками уже делаются шаги в&amp;#160;этом направлении).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Я написал небольшой плагин, лишенный вышеперечисленных недостатков:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.requireScript(url, callback, [context], [options])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cкачать и&amp;#160;попробовать можно с&amp;#160;&lt;a href="http://code.google.com/p/jquery-loadscript/downloads/list"&gt;code.google&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-4028355279444866010?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/4028355279444866010/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=4028355279444866010' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/4028355279444866010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/4028355279444866010'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/05/jquery.html' title='Загрузка по требованию и jQuery'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-7771216386634831415</id><published>2009-04-13T11:14:00.001-07:00</published><updated>2009-04-20T00:32:05.862-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='inheritance'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>Плагин для jQuery, реализующий наследование</title><content type='html'>&lt;p&gt;Недавно понадобилось для проекта с&amp;#160;jQuery реализовать наследование, написал плагин для jQuery, где релизованы идеи, описанные в&amp;#160;&amp;#171;&lt;a href="http://dfilatov.blogspot.com/2008/09/javascript.html"&gt;Еще раз о&amp;#160;наследовании в&amp;#160;JavaScript&lt;/a&gt;&amp;#187;. Плагин находится на&amp;#160;code.google&amp;#160;&amp;#8212; &lt;a href="http://code.google.com/p/jquery-inheritance/"&gt;code.google.com/p/jquery-inheritance/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Работает так:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$.inherit([base], methods, [statical])&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class="comment"&gt;// A&amp;#160;&amp;#8212; базовый тип&lt;/span&gt;
var A = $.inherit(
    {

        &lt;span class="comment"&gt;// __constructor&amp;#160;&amp;#8212; специальный метод, вызываемый при создании экземпляра&lt;/span&gt;
        __constructor : function(property) {
                this.property = property;
        },

        getProperty : function() {
            return this.property + ' of A';
        },

        getType : function() {
            return 'A';
        }

    },
    {
        &lt;span class="comment"&gt;// статическое свойство, доступное изнутри как this.__self.staticMember&lt;/span&gt;
        staticMember : 'staticA'
    });

&lt;span class="comment"&gt;// B&amp;#160;&amp;#8212; тип, наследуемый от A&lt;/span&gt;
var B = $.inherit(
    A,
    {

        &lt;span class="comment"&gt;// перекрытие с вызовом одноименного метода базового класса&lt;/span&gt;
        getProperty : function() {
            return this.__base() + ' of B';
        },

        &lt;span class="comment"&gt;// просто перекрытие&lt;/span&gt;
        getType : function() {
            return 'B';
        }

    },
    {
        staticMember : 'staticB'
    });

var instance = new B('value');

console.log(instance.getProperty());
console.log(instance.getType());
console.log(instance.__self.staticMember);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;А кто вообще как использует, и&amp;#160;использует&amp;#160;ли вообще, наследование?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-7771216386634831415?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/7771216386634831415/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=7771216386634831415' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/7771216386634831415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/7771216386634831415'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/04/jquery.html' title='Плагин для jQuery, реализующий наследование'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-5464052913110831603</id><published>2009-04-05T12:43:00.000-07:00</published><updated>2009-04-05T13:13:02.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>Знатокам JavaScript</title><content type='html'>&lt;p&gt;Как это работает?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if('mySuperProperty' in window) {
    alert(window['mySuperProperty']);
}

var mySuperProperty = 1;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-5464052913110831603?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/5464052913110831603/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=5464052913110831603' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/5464052913110831603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/5464052913110831603'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/04/javascript.html' title='Знатокам JavaScript'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-1751052507694778129</id><published>2009-03-16T01:29:00.000-07:00</published><updated>2009-03-16T01:58:55.014-07:00</updated><title type='text'>ZForms 3.0</title><content type='html'>&lt;p&gt;Несколько недель потраченного свободного времени, переписывание кучи кода, документации, примеров&amp;#160;&amp;#8212; куча сил ушла на&amp;#160;&lt;a href="http://zforms.ru"&gt;ZForms 3.0&lt;/a&gt;. Главное&amp;#160;&amp;#8212; что теперь все работает почти &amp;#171;само&amp;#187;, количество кода, необходимого разработчику для описания форм, уменьшилось на&amp;#160;порядок, а&amp;#160;функционала только прибавилось.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-1751052507694778129?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/1751052507694778129/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=1751052507694778129' title='Комментарии: 15'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/1751052507694778129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/1751052507694778129'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/03/zforms-30.html' title='ZForms 3.0'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-6544223012940716514</id><published>2009-02-27T12:31:00.000-08:00</published><updated>2009-02-27T13:25:50.173-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Чего мне не хватает в CSS</title><content type='html'>&lt;p&gt;Несмотря на&amp;#160;всю мощь &lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;, некоторых вещей мне там все-таки не&amp;#160;хватает.&lt;/p&gt;
&lt;h2&gt;Константы&lt;/h2&gt;
&lt;p&gt;Очень часто хочется сделать какие-то правило общими для нескольких селекторов. Приходится, либо копировать часть правил из&amp;#160;селектора в&amp;#160;селектор:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.class1 {
  font-size: 0.9em;
  color: #FF0000;
  position: absolute;
}

.class2 {
  font-size: 0.9em;
  color: #FF0000;
  float: left;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Или отдельно описывать общие части:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.class1 {
  position: absolute;  
}

.class2 {
  float: left;
}

.class1,
.class2 {
  font-size: 0.9em;
  color: #FF0000;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Вроде&amp;#160;бы неплохо, но&amp;#160;не&amp;#160;всегда удобно&amp;#160;&amp;#8212; часто приходится группировать селекторы из&amp;#160;разных частей css, в&amp;#160;итоге размазывая описание одной сущности.&lt;/p&gt;
&lt;p&gt;Или&amp;#160;же создавать еще один CSS-класс, содержащий общие части, и&amp;#160;добавлять его потом ко&amp;#160;всем нужным HTML-элементам, что мне вообще не&amp;#160;нравится:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.class1 {
  position: absolute;
}

.class2 {
  float: left;
}

.class3 {
  font-size: 0.9em;
  color: #FF0000; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Душа&amp;#160;же хочет чего-нибудь такого:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$font1 {
  font-size: 0.9em;
  color: #FF0000; 
}

.class1 {
  $font;
  position: absolute;
}

.class2 {
  $font;
  float: left;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Где-то читал, что что-то подобное поддерживает webkit.&lt;/p&gt;
&lt;h2&gt;Селекторы, с&amp;#160;возможностями похожими на&amp;#160;XPath&lt;/h2&gt;
&lt;p&gt;Часто хочется назначить какие-то правила контейнеру, если внутри контейнера есть какой-нибудь элемент. Например, сделать нижний отступ у&amp;#160;контейнера, если внутри контейнера есть изображение (пример надуман, обычно все намного сложнее):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.container[descendant::img] {
  margin-bottom: 1em;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Мне кажется это гораздо более нужным чем всякие drop shadow и&amp;#160;css-анимации.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-6544223012940716514?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/6544223012940716514/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=6544223012940716514' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6544223012940716514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6544223012940716514'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/02/css.html' title='Чего мне не хватает в CSS'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-2126195534339041199</id><published>2009-02-24T12:32:00.000-08:00</published><updated>2009-02-27T13:20:54.924-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='isArray'/><title type='text'>Самые эффективные решения - самые простые</title><content type='html'>&lt;p&gt;Оказывается, как просто можно в&amp;#160;js&amp;#160;проверить, является&amp;#160;ли что-то массивом:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]'; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Источник: &lt;a href="http://thinkweb2.com/projects/prototype/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/"&gt;http://thinkweb2.com/projects/prototype/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Кстати, в&amp;#160;jQuery (начиная с&amp;#160;1.3), это проверяется именно этим способом.&lt;/p&gt;
&lt;p&gt;Мне как-то всегда хватало &lt;code&gt;o&amp;#160;instanceof Array&lt;/code&gt;, но&amp;#160;оказалось что у&amp;#160;этого способа есть проблемы с&amp;#160;фреймами. И&amp;#160;еще, после замены &lt;code&gt;instanceof Array&lt;/code&gt; на&amp;#160;&lt;code&gt;isArray&lt;/code&gt; у&amp;#160;меня перестала течь память в&amp;#160;IE6&amp;#160;в&amp;#160;ZForms (вернее, в&amp;#160;том случае, если ZForms использует родной Common.js).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-2126195534339041199?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/2126195534339041199/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=2126195534339041199' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/2126195534339041199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/2126195534339041199'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/02/blog-post.html' title='Самые эффективные решения - самые простые'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-3605944282635480868</id><published>2009-01-30T01:50:00.000-08:00</published><updated>2009-01-30T04:55:30.326-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clip'/><category scheme='http://www.blogger.com/atom/ns#' term='quirks'/><category scheme='http://www.blogger.com/atom/ns#' term='IE'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>CSS: clip и Internet Explorer</title><content type='html'>&lt;p&gt;На днях понадобилось воспользоваться css-свойством clip для создания закруглений у&amp;#160;блоков с&amp;#160;помощью css-спрайтов. В&amp;#160;нормальных браузерах заработало быстро. А&amp;#160;вот разработчики IE,&amp;#160;как обычно, выделились.&lt;/p&gt;

&lt;p&gt;Оказалось, что в&amp;#160;режиме quirks, IE&amp;#160;понимает запись значений через запятую (так как написано в&amp;#160;&lt;a href="http://www.w3.org/TR/CSS21/visufx.html#clipping"&gt;спецификации w3c&lt;/a&gt;)&amp;#160;&amp;#8212; &lt;code&gt;clip: rect(100px, 100px, 145px, 30px)&lt;/code&gt;, а&amp;#160;в&amp;#160;режиме соответствия стандартам только через пробел&amp;#160;&amp;#8212; &lt;code&gt;clip: rect(100px 100px 145px 30px)&lt;/code&gt;. Проверил на&amp;#160;IE6 и&amp;#160;IE7. Хорошо хоть остальные браузеры тоже понимают такую неправильную запись.&lt;/p&gt;

&lt;p&gt;Чем думают разработчики IE?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-3605944282635480868?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/3605944282635480868/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=3605944282635480868' title='Комментарии: 7'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3605944282635480868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3605944282635480868'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2009/01/css-clip-internet-explorer.html' title='CSS: clip и Internet Explorer'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-5211267520489128916</id><published>2008-11-09T09:47:00.000-08:00</published><updated>2008-11-09T23:52:32.407-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='пакеты'/><category scheme='http://www.blogger.com/atom/ns#' term='xsl'/><title type='text'>Пакетирование js- и сss-ресурсов. Управление подключением ресурсов с помощью XML/XSL.</title><content type='html'>&lt;p&gt;В этой статье я&amp;nbsp;затрону тему подключения ресурсов, а&amp;nbsp;именно, как можно управлять подключением нужных JavaScript и&amp;nbsp;&lt;abbr title="Cascading Style Sheets"&gt;CSS&lt;/abbr&gt;-файлов в&amp;nbsp;больших проектах, с&amp;nbsp;большим количеством функционала, чтобы это быстро не&amp;nbsp;превратилось в&amp;nbsp;хаос.
&lt;/p&gt;
&lt;p&gt;Я расскажу о&amp;nbsp;способе, который использую в&amp;nbsp;своем фрэймворке &amp;laquo;Конфигуратор&amp;raquo;, однако, если вашим проектам не&amp;nbsp;чужды понятия &lt;acronym title="Extensible Markup Language"&gt;XML&lt;/acronym&gt; и&amp;nbsp;&lt;abbr title="Extensible Stylesheet Language"&gt;XSL&lt;/abbr&gt;, вы&amp;nbsp;легко можете адаптировать предлагаемый способ к&amp;nbsp;своим нуждам.&lt;/p&gt;
&lt;p&gt;Если вкратце, то&amp;nbsp;я&amp;nbsp;предлагаю разбивать все js-&amp;nbsp;и&amp;nbsp;css-ресурсы проекта на&amp;nbsp;пакеты, исходя из&amp;nbsp;их&amp;nbsp;функциональности. Внутри пакета собирать входящие в&amp;nbsp;него файлы и&amp;nbsp;минимизировать их.&amp;nbsp;В&amp;nbsp;режиме разработки отдавать исходники как они есть, а&amp;nbsp;в&amp;nbsp;&amp;laquo;боевом&amp;raquo;&amp;nbsp;&amp;#8212; собранные по&amp;nbsp;пакетам и&amp;nbsp;минимизированные (для уменьшения количества http-запросов и&amp;nbsp;размера файлов). Кроме этого, за&amp;nbsp;каждую функциональность проекта должен отвечать отдельный xsl (который непосредственно и&amp;nbsp;знает о&amp;nbsp;необходимых этой функциональности ресурсах). Причем все подключения, сборки пакетов, и&amp;nbsp;их&amp;nbsp;минимизации должны происходить при как можно меньшем количестве телодвижений со&amp;nbsp;стороны разработчика.&lt;/p&gt;
&lt;p&gt;
Рассмотрим на&amp;nbsp;примере двух пакетов&amp;nbsp;&amp;#8212; global (содержащего базовую функциональность проекта) и&amp;nbsp;zforms (содержащий функциональность для форм). Пакет global должен подключаться везде, а&amp;nbsp;пакет zforms&amp;nbsp;&amp;#8212; только на&amp;nbsp;страницах форм.
&lt;/p&gt;
&lt;p&gt;Xml-описание пакетов (должно быть доступно везде внутри проекта):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;package name=&amp;quot;global&amp;quot; version=&amp;quot;1&amp;quot;&amp;gt;
  &amp;lt;css media=&amp;quot;screen&amp;quot;&amp;gt;
    &amp;lt;file name=&amp;quot;common-screen.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;main-screen.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;main-colors-screen.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;main-screen-package.css&amp;quot; dev-mode=&amp;quot;production&amp;quot; /&amp;gt;
  &amp;lt;/css&amp;gt;
  &amp;lt;css media=&amp;quot;screen&amp;quot; cc=&amp;quot;if IE&amp;quot;&amp;gt;
    &amp;lt;file name=&amp;quot;common-screen-ie.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;main-screen-ie.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;main-screen-ie-package.css&amp;quot; dev-mode=&amp;quot;production&amp;quot; /&amp;gt;
  &amp;lt;/css&amp;gt;
  &amp;lt;js&amp;gt;
    &amp;lt;file name=&amp;quot;Common.js&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;Common_Ajax.js&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;Common-package.js&amp;quot; dev-mode=&amp;quot;production&amp;quot; /&amp;gt;
  &amp;lt;/js&amp;gt;
&amp;lt;/package&amp;gt;

&amp;lt;package name=&amp;quot;zforms&amp;quot; version=&amp;quot;2.43&amp;quot;&amp;gt;
  &amp;lt;css media=&amp;quot;screen&amp;quot;&amp;gt;
    &amp;lt;file name=&amp;quot;ZForms-screen.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;ZForms-screen-package.css&amp;quot; dev-mode=&amp;quot;production&amp;quot; /&amp;gt;
  &amp;lt;/css&amp;gt;
  &amp;lt;css media=&amp;quot;screen&amp;quot; cc=&amp;quot;if IE&amp;quot;&amp;gt;
    &amp;lt;file name=&amp;quot;ZForms-screen-ie.css&amp;quot; dev-mode=&amp;quot;development&amp;quot; /&amp;gt;
    &amp;lt;file name=&amp;quot;ZForms-screen-ie-package.css&amp;quot; dev-mode=&amp;quot;production&amp;quot; /&amp;gt;
  &amp;lt;/css&amp;gt;
  &amp;lt;js&amp;gt;
    &amp;lt;file name=&amp;quot;ZForms.js&amp;quot; /&amp;gt;
  &amp;lt;/js&amp;gt;
&amp;lt;/package&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Рассмотрим подробнее из&amp;nbsp;чего состоит пакет. Во-первых, у&amp;nbsp;пакета есть имя (@name), и&amp;nbsp;версия (@version). Во-вторых, пакет делится на&amp;nbsp;блоки по&amp;nbsp;типу ресурсов: css и&amp;nbsp;js.&amp;nbsp;Каждый такой блок может содержать несколько файлов с&amp;nbsp;@dev-mode = &amp;#146;development&amp;#146; (которые будут подключаться в&amp;nbsp;режиме разработки) и&amp;nbsp;один файл с&amp;nbsp;@dev-mode = &amp;#146;production&amp;#146; (подключаемый в&amp;nbsp;&amp;laquo;боевом&amp;raquo; режиме). Если&amp;nbsp;же используемые файлы уже собраны (например вы&amp;nbsp;используете какую-то библиотеку), то&amp;nbsp;@dev-mode указывать не&amp;nbsp;нужно. Для примера, именно так подлючается ZForms.js.&lt;/p&gt;
&lt;p&gt;
Кроме того, блоки пакета могут содержать необязательные атрибуты:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;для css-блоков:
&lt;ul&gt;&lt;li&gt;@media (screen/print/handheld)&lt;/li&gt;
&lt;li&gt;@cc (для указания conditional comments, если стили блока нужно подключать только для &lt;abbr title="Internet Explorer"&gt;IE&lt;/abbr&gt;)&lt;/li&gt;
&lt;li&gt;@version (версия блока)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;для js-блоков
&lt;ul&gt;
&lt;li&gt;@cc (аналогично css-блоку)&lt;/li&gt;
&lt;li&gt;@version (версия блока)&lt;/li&gt;
&lt;li&gt;@pack, true/false (использовать&amp;nbsp;ли алгоритм base-62&amp;nbsp;для сжатия production-версии)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Суммарная версия файла будет складываться из&amp;nbsp;версии пакета и&amp;nbsp;версии блока. Версия будет добавлена к&amp;nbsp;имени файла в&amp;nbsp;качестве параметра&amp;nbsp;&amp;#8212; ?v={номер_версии}. Добавление этого параметра позволяет избежать кэширования браузерами предыдущей версии файла.&lt;/p&gt;
&lt;p&gt;Я не&amp;nbsp;буду останавливаться на&amp;nbsp;подробном описании xsl-шаблонов для подключения ресурсов, приведу лишь общие моменты.&lt;/p&gt;
&lt;p&gt;В общем шаблоне для всех страниц:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;xsl:template match=&amp;quot;&amp;amp;document;&amp;quot; mode=&amp;quot;cdocument:head&amp;quot;&amp;gt;
  &amp;lt;head&amp;gt;
    ...
    &amp;lt;xsl:apply-templates select=&amp;quot;.&amp;quot; mode=&amp;quot;cdocument:include-packages&amp;quot;&amp;gt;
    ...
  &amp;lt;/head&amp;gt;
&amp;lt;/xsl:template&amp;gt;

&amp;lt;xsl:template match=&amp;quot;&amp;amp;document;&amp;quot; mode=&amp;quot;cdocument:include-packages&amp;quot;&amp;gt;
  &amp;lt;xsl:call-template name=&amp;quot;cinclude:package&amp;quot;&amp;gt;
    &amp;lt;xsl:with-param name=&amp;quot;name&amp;quot; select=&amp;quot;'global'&amp;quot; /&amp;gt;
  &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;
В&amp;nbsp;шаблоне для форм перекрываем:
&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;xsl:template match=&amp;quot;&amp;amp;document;&amp;quot; mode=&amp;quot;cdocument:include-packages&amp;quot;&amp;gt;
  &amp;lt;xsl:apply-imports /&amp;gt; &lt;span class="comment"&gt;&amp;lt;!-- подключение остальных пакетов --&amp;gt;&lt;/span&gt;
  &amp;lt;xsl:call-template name=&amp;quot;cinclude:package&amp;quot;&amp;gt;
    &amp;lt;xsl:with-param name=&amp;quot;name&amp;quot; select=&amp;quot;'zforms'&amp;quot; /&amp;gt;
  &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;В итоге, получаем, что за&amp;nbsp;каждый функционал отвечает отдельный xsl, который вызывает шаблон для подключения своих ресурсов и,&amp;nbsp;что самое важное, вызывает через &lt;code&gt;apply-imports&lt;/code&gt; шаблоны для подключения всех остальных ресурсов текущей страницы, причем не только из пакета global, но и из других возможных независимых пакетов (при этом ничего не&amp;nbsp;зная о&amp;nbsp;них).&lt;/p&gt;
&lt;p&gt;Все файлы с&amp;nbsp;@dev-mode = &amp;#146;production&amp;#146; можно и&amp;nbsp;нужно создавать автоматически при выкладке в&amp;nbsp;&amp;laquo;боевой&amp;raquo; режим, распарсив xml-описание пакетов.&lt;/p&gt;
&lt;p&gt;Текущее состояние dev-mode определяется глобальной переменной $cglobal:dev-mode, которая, в&amp;nbsp;свою очередь, берет его из&amp;nbsp;конфига проекта.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-5211267520489128916?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/5211267520489128916/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=5211267520489128916' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/5211267520489128916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/5211267520489128916'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/11/js-ss-xmlxsl.html' title='Пакетирование js- и сss-ресурсов. Управление подключением ресурсов с помощью XML/XSL.'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-3728223635230167244</id><published>2008-11-01T01:32:00.000-07:00</published><updated>2008-11-01T01:51:13.100-07:00</updated><title type='text'>Победа в WebHiTech</title><content type='html'>&lt;p&gt;На&amp;nbsp;закончившемся первом технологическом конкурсе веб-сайтов в&amp;nbsp;Рунете, &lt;a href="http://zforms.ru/"&gt;ZForms.ru&lt;/a&gt; и&amp;nbsp;&amp;laquo;&lt;a href="http://garage25.ru/"&gt;Еврогараж&lt;/a&gt;&amp;raquo; заняли первое и&amp;nbsp;второе места в&amp;nbsp;номинации &amp;laquo;Лучшие потребительские качества&amp;raquo;!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-3728223635230167244?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/3728223635230167244/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=3728223635230167244' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3728223635230167244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3728223635230167244'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/11/webhitech.html' title='Победа в WebHiTech'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-2765155503227290894</id><published>2008-10-15T00:14:00.000-07:00</published><updated>2008-10-15T03:09:10.569-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='copy-of'/><category scheme='http://www.blogger.com/atom/ns#' term='xsl'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>Нестандартное использование xsl:copy-of. Разделение содержания и представления</title><content type='html'>&lt;p&gt;Обычно конструкцию вида &lt;code&gt;xsl:copy-of&lt;/code&gt; используют для копирования фрагмента исходного дерева в&amp;nbsp;результирующее дерево. При этом забывая, что &lt;code&gt;xsl:copy-of&lt;/code&gt; можно использовать для копирования фрагмента результирующего дерева. Вроде&amp;nbsp;бы, польза от&amp;nbsp;этого неочевидна, однако, я&amp;nbsp;покажу, как это можно применить.&lt;/p&gt;
&lt;p&gt;Допустим, у&amp;nbsp;нас есть верстка какого-то сложного html-блока, причем этот блок может повторяться во&amp;nbsp;многих местах, но&amp;nbsp;с&amp;nbsp;разным контентом. В&amp;nbsp;качестве примера рассмотрим блок с&amp;nbsp;закругленными углами, так как обычно это достаточно сложная html-конструкция, состоящая из&amp;nbsp;нескольких html-элементов:&lt;/p&gt;
&lt;code&gt;&amp;lt;div class=&amp;quot;rounded&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;corner l-t&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;corner r-t&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;corner r-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;corner l-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;
        &lt;span class="comment"&gt;&amp;lt;!-- контент --&amp;gt;&lt;/span&gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;
&lt;p&gt;И мы&amp;nbsp;хотим обрамлять такой конструкцией свои блоки, допустим&amp;nbsp;&amp;#8212; статьи, формы, меню. Решение в&amp;nbsp;лоб&amp;nbsp;&amp;#8212; в&amp;nbsp;шаблоне вывода каждого такого блока добавлять такую обрамляющую конструкцию. Т.е. &amp;laquo;копипаст&amp;raquo; со&amp;nbsp;всеми вытекающими из&amp;nbsp;него последствиями. &lt;/p&gt;
&lt;p&gt;Примерно, это выглядело&amp;nbsp;бы так (возьмем блок статей):&lt;/p&gt;
&lt;code&gt;&amp;lt;xsl:template match=&amp;quot;articles&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;rounded&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;corner l-t&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;corner r-t&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;corner r-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;corner l-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;
            &amp;lt;xsl:apply-templates select=&amp;quot;article&amp;quot;/&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;
&lt;p&gt;Мой вариант&amp;nbsp;&amp;#8212; создать для обрамляющей html-конструкции отдельный именованный шаблон, а&amp;nbsp;контент передавать ему параметром, который внутри шаблона копировать с&amp;nbsp;помошью &lt;code&gt;xsl:copy-of&lt;/code&gt;:&lt;/p&gt;
&lt;code&gt;&amp;lt;xsl:template name=&amp;quot;block&amp;quot;&amp;gt;
    &amp;lt;xsl:param name=&amp;quot;content&amp;quot;/&amp;gt;

    &amp;lt;div class=&amp;quot;rounded&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;corner l-t&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;corner r-t&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;corner r-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;corner l-b&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
        &amp;lt;div class=&amp;quot;content&amp;quot;&amp;gt;
            &amp;lt;xsl:copy-of select=&amp;quot;$content&amp;quot;/&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;
&lt;p&gt;Шаблоны соответствующих блоков (статей, форм, меню) будут выглядеть следующим образом:&lt;/p&gt;
&lt;code&gt;&amp;lt;xsl:template match=&amp;quot;articles&amp;quot;&amp;gt;
    &amp;lt;xsl:call-template name=&amp;quot;block&amp;quot;&amp;gt;
        &amp;lt;xsl:with-param name=&amp;quot;content&amp;quot;&amp;gt;
            &amp;lt;xsl:apply-templates select=&amp;quot;article&amp;quot;/&amp;gt;
        &amp;lt;/xsl:with-param&amp;gt;
    &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:template&amp;gt;

&amp;lt;xsl:template match=&amp;quot;navigation&amp;quot;&amp;gt;
    &amp;lt;xsl:call-template name=&amp;quot;block&amp;quot;&amp;gt;
        &amp;lt;xsl:with-param name=&amp;quot;content&amp;quot;&amp;gt;
            &amp;lt;ul class=&amp;quot;navigation&amp;quot;&amp;gt;
                &amp;lt;xsl:apply-templates select=&amp;quot;navigation-item&amp;quot;/&amp;gt;
            &amp;lt;/ul&amp;gt;
        &amp;lt;/xsl:with-param&amp;gt;
    &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:template&amp;gt;

&amp;lt;xsl:template match=&amp;quot;form&amp;quot;&amp;gt;
    &amp;lt;xsl:call-template name=&amp;quot;block&amp;quot;&amp;gt;
        &amp;lt;xsl:with-param name=&amp;quot;content&amp;quot;&amp;gt;
            &amp;lt;xsl:apply-templates select=&amp;quot;.&amp;quot; mode=&amp;quot;zforms&amp;quot;/&amp;gt;
        &amp;lt;/xsl:with-param&amp;gt;
    &amp;lt;/xsl:call-template&amp;gt;
&amp;lt;/xsl:template&amp;gt;&lt;/code&gt;
&lt;p&gt;Получилось, что шаблоны ничего не&amp;nbsp;знают о&amp;nbsp;том окружении, в&amp;nbsp;котором будет находиться сгенерированный ими контент. Таким образом, вводится дополнительный уровень абстракции, отделяющий содержание от&amp;nbsp;представления. Все вышенаписанное&amp;nbsp;&amp;#8212; это всего лишь один пример, как можно применить подобный подход, который можно использовать и&amp;nbsp;для более сложных случаев.&lt;/p&gt;
&lt;p&gt;P.S. Впервые похожую идею я&amp;nbsp;когда-то услышал от&amp;nbsp;Владимира Токмакова из&amp;nbsp;&lt;a href="http://www.artlebedev.ru/"&gt;Студии&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-2765155503227290894?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/2765155503227290894/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=2765155503227290894' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/2765155503227290894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/2765155503227290894'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/10/xslcopy-of.html' title='Нестандартное использование xsl:copy-of. Разделение содержания и представления'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-6740198227685345080</id><published>2008-09-05T02:57:00.000-07:00</published><updated>2008-09-22T00:06:02.783-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='класс'/><category scheme='http://www.blogger.com/atom/ns#' term='наследование'/><title type='text'>Еще раз о наследовании в JavaScript</title><content type='html'>&lt;p&gt;Всегда смущала обычная реализации наследования в&amp;nbsp;JavaScript, а&amp;nbsp;в&amp;nbsp;особенности вызов метод базового класса из&amp;nbsp;метода потомка. Здесь и&amp;nbsp;в&amp;nbsp;дальнейшем я&amp;nbsp;буду использовать термин &amp;laquo;класс&amp;raquo; из&amp;nbsp;классического &lt;abbr title="Объектно-ориентированное программирование"&gt;ООП&lt;/abbr&gt;, хотя в&amp;nbsp;JavaScript заложена немного другая концепция.
&lt;/p&gt;
&lt;p&gt;Допустим, что у&amp;nbsp;нас есть иерархия классов вида A&amp;nbsp;&amp;#8594; B&amp;nbsp;&amp;#8594; C&amp;nbsp;и&amp;nbsp;в&amp;nbsp;методе наследников нам нужно вызывать тот&amp;nbsp;же метод базового класса вверх по&amp;nbsp;иерархии. Обычно это выглядит примерно так (вариантов может быть несколько, но&amp;nbsp;смысл не&amp;nbsp;меняется):&lt;/p&gt;
&lt;code&gt;&lt;span class="comment"&gt;// описание методов класса A&lt;/span&gt;
...

method : function(param1, param2) {

  &lt;span class="comment"&gt;// действия класса A&lt;/span&gt;

}

...

&lt;span class="comment"&gt;// описание методов класса B&lt;/span&gt;
...

method : function(param1, param2) {

  &lt;span class="comment"&gt;// действия базового класса A&lt;/span&gt;
  A.prototype.method.call(this, param1, param2);

  &lt;span class="comment"&gt;// действия класса B&lt;/span&gt;

}

...

&lt;span class="comment"&gt;// описание методов класса С&lt;/span&gt;
...

method : function(param1, param2) {

  &lt;span class="comment"&gt;// действия базового класса B&lt;/span&gt;
  B.prototype.method.call(this, param1, param2);

  &lt;span class="comment"&gt;// действия класса C&lt;/span&gt;

}
...
&lt;/code&gt;
&lt;p&gt;Таким образом, для вызова метода базового класса приходится сооружать такую неуклюжую конструкцию, где каждый раз упоминается имя базового класса и&amp;nbsp;имя метода, где приходится вызывать &lt;code&gt;call&lt;/code&gt;, а&amp;nbsp;в&amp;nbsp;параметрах передавать &lt;code&gt;this&lt;/code&gt;. Вообщем, мягко говоря, не&amp;nbsp;очень красиво. Ведь было гораздо красивее написать так:&lt;/p&gt;
&lt;code&gt;&lt;span class="comment"&gt;// описание методов класса B&lt;/span&gt;
...

method : function(param1, param2) {

  &lt;span class="comment"&gt;// действия базового класса A&lt;/span&gt;
  this.__base(param1, param2);

  &lt;span class="comment"&gt;// действия класса B&lt;/span&gt;

}

...

&lt;span class="comment"&gt;// описание методов класса С&lt;/span&gt;
...

method : function(param1, param2) {

  &lt;span class="comment"&gt;// действия базового класса B&lt;/span&gt;
  this.__base(param1, param2);

  &lt;span class="comment"&gt;// действия класса C&lt;/span&gt;

}

...
&lt;/code&gt;
&lt;p&gt;Возможно&amp;nbsp;ли такое в&amp;nbsp;JavaScript? Оказывается, возможно.&lt;/p&gt;
&lt;p&gt;Читая &lt;a href="http://dean.edwards.name/weblog/"&gt;блог Dean Edwards&amp;#146;а&lt;/a&gt;, я&amp;nbsp;наткнулся на&amp;nbsp;интересную идею реализации подобного функционала&amp;nbsp;&amp;#8212; при наследовании не&amp;nbsp;просто записывать в&amp;nbsp;прототип нового класса перекрываемый метод, а&amp;nbsp;заворачивать его в&amp;nbsp;метод-обертку, которая будет перед вызовом метода заменять &lt;code&gt;this.__base&lt;/code&gt; на&amp;nbsp;необходимый метод базового класса, а&amp;nbsp;после вызова восстанавливать (потому что возможно ситуация когда перекрываемый метод вызывает другие методы, которые также могут вызывать одноименные методы базовых классов). Тоже самое можно сделать и&amp;nbsp;для конструктора.&lt;/p&gt;
&lt;p&gt;В итоге, наследование у меня происходит сейчас так:&lt;/p&gt;
&lt;code&gt;var SubClass = BaseClass.inheritTo(
  {
    &lt;span class="comment"&gt;// если нужно, перекрываем конструктор&lt;/span&gt;
    __constructor : function(param) {
      
      &lt;span class="comment"&gt;// если нужно, вызываем конструктор базового класса&lt;/span&gt;
      this.__base(param);

      &lt;span class="comment"&gt;// и делаем что-нибудь еще&lt;/span&gt;

    },

    &lt;span class="comment"&gt;// перекрываемый метод&lt;/span&gt;
    method : function(param) {

      &lt;span class="comment"&gt;// если нужно, вызываем метод method базового класса&lt;/span&gt;
      this.__base(param);

      &lt;span class="comment"&gt;// и делаем что-нибудь еще&lt;/span&gt;

    }

  },
  {
    &lt;span class="comment"&gt;// если необходимо, тут перекрываем статические свойства и методы&lt;/span&gt;
  }
);
&lt;/code&gt;
&lt;p&gt;Для единообразия базовый класс создается так (наследуется от абстрактного класса &lt;code&gt;Abstract&lt;/code&gt;):&lt;/p&gt;
&lt;code&gt;var Class = Abstract.inheritTo(
  {
    &lt;span class="comment"&gt;// конструктор&lt;/span&gt;
    __constructor : function(param) {
      
    },

    &lt;span class="comment"&gt;// обычный метод&lt;/span&gt;
    method : function(param) {

    }

  },
  {
    &lt;span class="comment"&gt;// если необходимо, тут создаем статические свойства и методы&lt;/span&gt;
  }
);
&lt;/code&gt;&lt;p&gt;Работоспособность этого способа была проверена на&amp;nbsp;иерархии классов &lt;a href="http://zforms.ru/"&gt;ZForms&lt;/a&gt; (около 30&amp;nbsp;классов). После рефакторинга код стал намного стройнее, короче и&amp;nbsp;понятнее.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-6740198227685345080?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/6740198227685345080/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=6740198227685345080' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6740198227685345080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6740198227685345080'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/09/javascript.html' title='Еще раз о наследовании в JavaScript'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-3708914196615288091</id><published>2008-08-27T07:54:00.000-07:00</published><updated>2008-08-27T08:38:39.072-07:00</updated><title type='text'>CSS-селекторы для Common.js</title><content type='html'>&lt;p&gt;Начал писать свою реализацию (плагин для Common.js) css-селекторов, реализованных в&amp;nbsp;большинстве фреймфорков. Пока результаты весьма радуют&amp;nbsp;&amp;#8212; на&amp;nbsp;большинстве из&amp;nbsp;тех селекторов, которые уже успел реализовать (на&amp;nbsp;данный момент это практически все &lt;a href="http://www.w3.org/TR/REC-CSS2/selector.html"&gt;css2-селекторы&lt;/a&gt;), скорость гораздо выше, чем у&amp;nbsp;всех остальных фреймворков. Для тестов использую SlickSpeed Selectors Test.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-3708914196615288091?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/3708914196615288091/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=3708914196615288091' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3708914196615288091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/3708914196615288091'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/08/css.html' title='CSS-селекторы для Common.js'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-7890291747572187460</id><published>2008-08-13T04:01:00.000-07:00</published><updated>2008-08-20T00:21:28.848-07:00</updated><title type='text'>ZForms.ru</title><content type='html'>&lt;p&gt;Наконец-то хватило сил доделать &lt;a href="http://zforms.ru/"&gt;ZForms.ru&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-7890291747572187460?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/7890291747572187460/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=7890291747572187460' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/7890291747572187460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/7890291747572187460'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/08/zformsru.html' title='ZForms.ru'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-6941348197921829454</id><published>2008-07-14T08:12:00.000-07:00</published><updated>2008-07-16T05:18:31.928-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='radio'/><category scheme='http://www.blogger.com/atom/ns#' term='checkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='label'/><category scheme='http://www.blogger.com/atom/ns#' term='выравнивание'/><title type='text'>Выравнивание чекбоксов и радиобаттонов с их лэйблами</title><content type='html'>&lt;p&gt;Всегда, даже работая в&amp;nbsp;&lt;a href="http://www.artlebedev.ru/"&gt;Студии&lt;/a&gt;, как-то обходил эту проблему стороной.&lt;/p&gt;
&lt;p&gt;Но тут перфекфионизм взял верх и&amp;nbsp;решил, наконец, сделать &amp;laquo;круто&amp;raquo;. Вкратце, в&amp;nbsp;чем состоит проблема&amp;nbsp;&amp;#8212; у&amp;nbsp;одних браузеров (ie,&amp;nbsp;opera) есть некоторый отступ у&amp;nbsp;чекбоксов и&amp;nbsp;радиобаттонов (который нельзя ничем сбросить), у&amp;nbsp;других нет.&lt;/p&gt;
&lt;p&gt;
Кусок исходного html-кода:
&lt;/p&gt;
&lt;code&gt;...

&amp;lt;dl&amp;gt;
 &amp;lt;dt&amp;gt;
  &amp;lt;label&amp;gt;Пол&amp;lt;/label&amp;gt;
 &amp;lt;/dt&amp;gt;
 &amp;lt;dd&amp;gt;
  &amp;lt;div class="option"&amp;gt;
   &amp;lt;input type="radio" name="sex" id="sex-male" value="male" /&amp;gt;
   &amp;lt;label for="sex-male"&amp;gt;мужской&amp;lt;/label&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;div class="option"&amp;gt;
   &amp;lt;input type="radio" name="sex" id="sex-female" value="female" /&amp;gt;
   &amp;lt;label for="sex-female"&amp;gt;мужской&amp;lt;/label&amp;gt;
  &amp;lt;/div&amp;gt;
 &amp;lt;/dd&amp;gt;
&amp;lt;/dl&amp;gt;

...
&lt;/code&gt;
&lt;p&gt;
Решение для &amp;laquo;нормальных&amp;raquo; браузеров:
&lt;/p&gt;
&lt;code&gt;.option {
 position: relative; 
}

.option input {
 position: absolute; 
 left: 0;
 top: 0.69em; // Величина сдвига подобрана для line-height: 1.2
 margin: -4px 0 0; 
}

.option label { 
 margin-left: 18px;
}
&lt;/code&gt;
&lt;p&gt;Теперь нужно &amp;laquo;разобраться&amp;raquo; с&amp;nbsp;ie&amp;nbsp;и&amp;nbsp;opera, имеющих пресловутые отступы. Начнем c&amp;nbsp;ie:&lt;/p&gt;
&lt;code&gt;.option input {
// margin: -7px 0 0 -3px;
}
&lt;/code&gt;
&lt;p&gt;Кто использует conditional comments&amp;nbsp;&amp;#8212; выносит вышестоящую конструкцию в&amp;nbsp;файл стилей для ie.&lt;/p&gt;
&lt;p&gt;
Осталась opera. Долго искал какой-нибудь хак для нее, самым красивым, с&amp;nbsp;моей точки зрения, оказался следующий (такую конструкцию не&amp;nbsp;понимает ни&amp;nbsp;один браузер, кроме opera):
&lt;/p&gt;
&lt;code&gt;html:first-child .option input {
 margin: -7px 0 0 -3px;
}
&lt;/code&gt;
&lt;p&gt;И вуаля, везде красота! Даже при масштабировании шрифта.&lt;/p&gt;
&lt;p&gt;P.S. Никогда не&amp;nbsp;пишите в&amp;nbsp;css конструкцию вида: * { padding: 0&amp;nbsp;}. Если вам, конечно не&amp;nbsp;все равно, как выглядят ваши формы в&amp;nbsp;Firefox. Firefox сбрасывает внутренний отступ у&amp;nbsp;input, а&amp;nbsp;у&amp;nbsp;select не&amp;nbsp;сбрасывает. Потом будет проблематично их&amp;nbsp;выровнять по&amp;nbsp;высоте.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-6941348197921829454?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/6941348197921829454/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=6941348197921829454' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6941348197921829454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/6941348197921829454'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/07/blog-post_14.html' title='Выравнивание чекбоксов и радиобаттонов с их лэйблами'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-7231496761181200511</id><published>2008-07-10T06:18:00.000-07:00</published><updated>2008-07-14T08:38:45.007-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zforms'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>jQuery-адаптер для ZForms</title><content type='html'>&lt;p&gt;Написал адаптер для ZForms, позволяющий работать через jQuery.&lt;/p&gt;
&lt;p&gt;Напомню, что изначально ZForms работал только через Сommon, но&amp;nbsp;было&amp;nbsp;бы неправильно заставлять использовать разработчиков несколько фреймворков на&amp;nbsp;проекте, если им&amp;nbsp;нужны возможности ZForms.&lt;/p&gt;
&lt;p&gt;Вкратце, идея адаптера довольна проста&amp;nbsp;&amp;#8212; подменить вызовы родной библиотеки (Common) на&amp;nbsp;вызовы jQuery, при этом не&amp;nbsp;изменяя код ZForms.&lt;/p&gt;
&lt;p&gt;Например, код для добавления css-класса dom-элементу в&amp;nbsp;адаптере выглядит следующим образом:&lt;/p&gt;

&lt;code&gt;var Common = {

 Class : {

  ...

  add : function(
   oElement,
   sClassName
   ) {

   $(oElement).addClass(sClassName);

  },

  ...

 },

 ...

};
&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-7231496761181200511?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/7231496761181200511/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=7231496761181200511' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/7231496761181200511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/7231496761181200511'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/07/jquery-zforms.html' title='jQuery-адаптер для ZForms'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3032638255243429204.post-1582814246293413923</id><published>2008-07-07T04:48:00.000-07:00</published><updated>2008-07-07T05:49:11.994-07:00</updated><title type='text'>Сайт еврогаража</title><content type='html'>&lt;p&gt;Наконец-то доделали с&amp;nbsp;Сашей Любавиным &amp;laquo;&lt;a href="http://garage25.ru/"&gt;сайт еврогаража&lt;/a&gt;&amp;raquo;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3032638255243429204-1582814246293413923?l=dfilatov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dfilatov.blogspot.com/feeds/1582814246293413923/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3032638255243429204&amp;postID=1582814246293413923' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/1582814246293413923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3032638255243429204/posts/default/1582814246293413923'/><link rel='alternate' type='text/html' href='http://dfilatov.blogspot.com/2008/07/blog-post.html' title='Сайт еврогаража'/><author><name>alpha</name><uri>http://www.blogger.com/profile/03598754956374557480</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_bnzarkP80eY/SNqTlIjWZOI/AAAAAAAAAAM/IVXmPTd_EmU/S220/alpha.jpg'/></author><thr:total>1</thr:total></entry></feed>
