<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Подлипенский Павел</title>
    <description>Блог о технологиях и деньгах</description>
    <link>http://www.podlipensky.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.podlipensky.com/opml.axd</blogChannel:blogRoll>
    <dc:creator>Подлипенский Павел</dc:creator>
    <dc:title>Подлипенский Павел</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/podlipensky" type="application/rss+xml" /><feedburner:emailServiceId>podlipensky</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Профессия программиста 4ая в рейтинге самых спокойных</title>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;div style="text-align: center"&gt;
&lt;img src="http://www.podlipensky.com/image.axd?picture=2009%2f10%2fFF111_ClientScreening.jpg" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Согласно &lt;a rel="nofollow" href="http://money.cnn.com/galleries/2009/moneymag/0910/gallery.bestjobs_leaststress.moneymag/index.html" target="_blank"&gt;опросу&lt;/a&gt; проведенными
&lt;a rel="nofollow" href="http://money.cnn.com/magazines/moneymag/" target="_blank"&gt;Money Magazine&lt;/a&gt; и &lt;a href="http://www.payscale.com/" target="NEW"&gt;PayScale.com&lt;/a&gt;, профессия разработчика программного обеспечения 4ая в списке наиболее спокойных профессий. На первом месте профессия Education/Training Consultant, на втором Physical Therapist, третьем - College Professor. В качестве аргументов, в пользу такого положения нашей профессии в рейтинге, приводилось следующее:
&lt;/p&gt;
&lt;p&gt;
1. Свободный график работы.
&lt;/p&gt;
&lt;p&gt;
2. Возможность работать издому.
&lt;/p&gt;
&lt;p&gt;
3. Гибкость сроков выполнения небольших подзадач.
&lt;/p&gt;
&lt;p&gt;
Но что особенно приятно - технические писатели, админы и даже &lt;a rel="nofollow" href="http://money.cnn.com/galleries/2009/moneymag/0910/gallery.bestjobs_leaststress.moneymag/8.html" target="_blank"&gt;архитекторы&lt;/a&gt; теряют больше нервных клеток, чем простые девелоперы.
&lt;/p&gt;
&lt;p&gt;
Берегите нервы, товарищи девелоперы и приятного вам кризиса! 
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/TKvMw2EV_x8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/TKvMw2EV_x8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/10/21/developer-profession-less-stresfull-than-architectors.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=9f3cc3dd-1706-49e7-8a24-3d557c78efe3</guid>
      <pubDate>Wed, 21 Oct 2009 15:31:00 +0200</pubDate>
      <category>В мире</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=9f3cc3dd-1706-49e7-8a24-3d557c78efe3</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=9f3cc3dd-1706-49e7-8a24-3d557c78efe3</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/10/21/developer-profession-less-stresfull-than-architectors.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=9f3cc3dd-1706-49e7-8a24-3d557c78efe3</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=9f3cc3dd-1706-49e7-8a24-3d557c78efe3</feedburner:origLink></item>
    <item>
      <title>ExtJS: Расширяем функционал</title>
      <description>Рано или поздно наступает момент, когда возможностей фреймворка вам недостаточно. &amp;quot;Ах, как же так, забыли такую полезную кнопочку/контрол/приложение сделать...&amp;quot; - сетуете вы. Вот тогда и приходит в голову идея написать нехватающий функционал самому. Точнее дописать. И любой уважающий себя фреймворк предоставляет механизмы для собственного расширения/изменения. ExtJs не стал исключением.&lt;p&gt;По сути расширение это класс, наследованный от уже существующего в библиотеке и реализующий &lt;strong&gt;дополнительный функционал&lt;/strong&gt;. Представим себе, что нам необходимо реализовать контрол, весьма похожий по своему назначению и функционалу на Ext.Panel, но с небольшим отличием - новая панель всегда должна быть квадратной формы (т.е. ширина всегда должна быть равна ее высоте). &lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin-top: 20px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow-x: auto; overflow-y: auto; cursor: text; border-width: 1px; border-color: silver; border-style: solid; padding: 4px"&gt;   &lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px"&gt;     &lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; SquarePanel = Ext.extend(Ext.Panel, {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//Устанавливаем размер панели по умолчанию&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     width: 100,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     height: 100,&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     onResize: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(width, height) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//Если размеры нашей панели были изменены, причем непропорционально - вернуть ей квадратную форму&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (width != height) {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.body.setWidth(height);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         &lt;span style="color: #008000"&gt;//Вызываем базовый метод класса-родителя, т.е. - класса Panel.&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;         SquarePanel.superclass.onResize.call(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, height, height);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     },&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//Добавляем метод который позволит нам изменять размеры нашей панели, указав лишь размер одной ее стороны&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     setSquareSize(length){&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.body.setWidth(length);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.body.setHeight(length);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;     }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt; });&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Вот такая нехитрая конструкция Ext.extend позволяет создать новый класс, с &lt;strong&gt;дополнительными возможностями&lt;/strong&gt;, а именно &amp;ndash; новое поведение панели при изменении ее размеров и новый метод setSquareSize позволяющий установить новые размеры панели.&lt;strong&gt; &lt;/strong&gt;Я акцентировал внимание на дополнительных возможностях, потому что все свойства, методы и события базового класса (Ext.Panel) теперь присущи и нашему классу. Если заглянуть &lt;a href="https://www.extjs.com/deploy/dev/docs/source/Ext.html#method-Ext-extend"&gt;внутрь реализации&lt;/a&gt; метода extend, то можно увидеть, что &lt;/p&gt;&lt;div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin-top: 20px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow-x: auto; overflow-y: auto; cursor: text; border-width: 1px; border-color: silver; border-style: solid; padding: 4px"&gt;&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px"&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;//создаем пустую функцию-класс F&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; F = &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;(){},&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//сюда будет записана ссылка на прототип дочернего класса (т.е. нашего собственного)&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     sbp, &lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #008000"&gt;//сюда будет записана ссылка на прототип родительского класса&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     spp = sp.prototype;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; &lt;span style="color: #008000"&gt;//прототипом класса F становится прототип родительского класса&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; F.prototype = spp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; &lt;span style="color: #008000"&gt;//прототипом нашего же класса становится класс F&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt; sbp = sb.prototype = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; F();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; &lt;span style="color: #008000"&gt;//далее идет переопределение конструктора и назначение суперкласса&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt; sbp.constructor=sb;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; sb.superclass=spp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt; //...много непонятных буков&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Методы и свойства, которые мы &lt;strong&gt;переопределили&lt;/strong&gt; (onResize, width и height) попадут в prototype нашего класса вот таким образом:&lt;/p&gt;&lt;div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin-top: 20px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow-x: auto; overflow-y: auto; cursor: text; border-width: 1px; border-color: silver; border-style: solid; padding: 4px"&gt;&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px"&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;//sb - это наш класс SquarePanel, а overrrides - объект содержащий дополнения к нашему классу&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; Ext.&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;(sb, overrides);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;О функции override, я расскажу в другой раз. Пока ограничусь лишь кратким описанием &amp;ndash; функция Ext.override позволяет &lt;strong&gt;замещать&lt;/strong&gt; функционал уже существующих классов, на ваши собственные реализации.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Далее мы можем расширять нашу панель точно также как и Ext.Panel&lt;/p&gt;&lt;div id="codeSnippetWrapper" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; margin-top: 20px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; width: 97.5%; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow-x: auto; overflow-y: auto; cursor: text; border-width: 1px; border-color: silver; border-style: solid; padding: 4px"&gt;&lt;div id="codeSnippet" style="text-align: left; line-height: 12pt; background-color: #f4f4f4; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px"&gt;&lt;pre style="text-align: left; line-height: 12pt; background-color: white; width: 100%; font-family: 'Courier New', courier, monospace; direction: ltr; color: black; font-size: 8pt; overflow-x: visible; overflow-y: visible; border-style: none; padding: 0px; margin: 0em"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; DifferentSquarePanel = Ext.extend(SquarePanel, {&lt;span style="color: #008000"&gt;/* some additional logic here */&lt;/span&gt;})&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Что ж, довольно просто и элегантно. Впрочем, как и должно быть в любом уважающем себя фреймворке.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/rUgtQcd_EF8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/rUgtQcd_EF8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/09/08/extjs-extenstion-plugin.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=aeb6b6e2-5e79-4bdb-9b8e-56d34e45dc92</guid>
      <pubDate>Tue, 08 Sep 2009 06:08:00 +0200</pubDate>
      <category>ExtJs</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=aeb6b6e2-5e79-4bdb-9b8e-56d34e45dc92</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=aeb6b6e2-5e79-4bdb-9b8e-56d34e45dc92</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/09/08/extjs-extenstion-plugin.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=aeb6b6e2-5e79-4bdb-9b8e-56d34e45dc92</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=aeb6b6e2-5e79-4bdb-9b8e-56d34e45dc92</feedburner:origLink></item>
    <item>
      <title>ExtJS: События</title>
      <description>&lt;p&gt;Сегодня я начинаю цикл статей посвященных фреймворку ExtJs. Это не будут туториалы или мануалы для пошагового изучения библиотеки. Я просто хочу поделиться своим опытом, поэтому начну с чего попало, а именно – с событий.&lt;/p&gt;  &lt;p&gt;С изобретением &lt;a href="http://www.google.com.ua/url?q=http://en.wikipedia.org/wiki/Graphical_user_interface&amp;amp;sa=U&amp;amp;start=1&amp;amp;ei=PR9wSrvSFaKqnQO9tJipBw&amp;amp;sig2=3I9ncfaOyelm3jaaJS_ZNA&amp;amp;usg=AFQjCNEbgirDxOKmNayJ2SNpG-e2uMUXpA" target="_blank" rel="nofollow"&gt;GUI&lt;/a&gt; и &lt;a href="http://www.google.com.ua/url?q=http://ru.wikipedia.org/wiki/%25D0%259A%25D0%25BE%25D0%25BC%25D0%25BF%25D1%258C%25D1%258E%25D1%2582%25D0%25B5%25D1%2580%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25BC%25D1%258B%25D1%2588%25D1%258C&amp;amp;sa=U&amp;amp;start=1&amp;amp;ei=VB9wSt7PL8HH_gbb05yhCQ&amp;amp;sig2=u9AxxRZayiLaLXwc0YLypQ&amp;amp;usg=AFQjCNGTfhbvuPK1M38xv4O07OAq30Xdyg" target="_blank" rel="nofollow"&gt;Мыши&lt;/a&gt;, DOM-объекты, подобные кнопкам и текстовым полям стали обладать некими событиями. Например, &lt;a href="http://www.w3.org/events.html#event-click"&gt;click&lt;/a&gt;, &lt;a href="http://www.w3.org/events.html#event-mouseover"&gt;mouseover&lt;/a&gt;, &lt;a href="http://www.w3.org/events.html#event-keydown"&gt;keydown&lt;/a&gt; и другими. По сути событие – это сообщение, вызов функции, генерируемое одной частью приложения (источником), которое извещает другую часть приложения (приемник или подписчик) о том, что что-то случилось.&lt;/p&gt;  &lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; height: 42px; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;   &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt; &lt;span style="color: #ff0000"&gt;id&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;theDiv&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;onclick&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;alert('You clicked me')&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Click me!&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;В ExtJs DOM-элементы оборачиваются в &lt;a href="http://extjs.com/deploy/dev/docs/?class=Ext.Element"&gt;Ext.Element&lt;/a&gt;, поэтому подписка на тоже событие будет выглядеть так:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.39%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; height: 41px; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; Ext.get(&lt;span style="color: #006080"&gt;'theDiv'&lt;/span&gt;).on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() {alert(&lt;span style="color: #006080"&gt;'You clicked me'&lt;/span&gt;);});&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;При разработке сложных пользовательских интерфейсов, отдельные элементы DOMа получают особое назначение. К примеру, банальный div может быть заголовком колонки в таблице (я имею ввиду &lt;a href="http://extjs.com/playpen/ext-2.0/examples/grid/grid3.html" target="_blank" rel="nofollow"&gt;ExtJs Grid&lt;/a&gt;). Следовательно, когда пользователь захочет изменить порядок колонок в гриде и начнет перетягивать колонку за заголовок – в заголовке произойдут некие события (mouseover, mousedown, click, …). Каждый раз отслеживать порядок и детали “низкоуровневых” событий в своем коде рутинно. Поэтому ExtJs поддерживает собственную модель событий. К примеру, &lt;a href="http://extjs.com/deploy/dev/docs/output/Ext.grid.GridPanel.html" target="_blank" rel="nofollow"&gt;GridPanel&lt;/a&gt; поддерживает такие события как &lt;a href="http://extjs.com/source/GridPanel.html#event-Ext.grid.GridPanel-columnmove"&gt;columnmove&lt;/a&gt;, &lt;a href="http://extjs.com/source/GridPanel.html#event-Ext.grid.GridPanel-cellclick"&gt;cellclick&lt;/a&gt;, &lt;a href="http://extjs.com/source/GridPanel.html#event-Ext.grid.GridPanel-headerclick"&gt;headerclick&lt;/a&gt; и другие.&lt;/p&gt;

&lt;p&gt;Вся магия событий в ExtJs реализована в классе &lt;a href="http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable"&gt;Ext.util.Observable&lt;/a&gt;. Чтобы наделить ваш компонент свойствами источника события, вам необходимо “унаследоваться” от &lt;a href="http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable"&gt;Ext.util.Observable&lt;/a&gt;.&amp;#160; Если же вы наследуете свой компонент от других компонентов, таких как Panel, Grid, Form, Tree и другие, то дополнительно наследоваться от &lt;a href="http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable"&gt;Ext.util.Observable&lt;/a&gt; не обязательно. О принципе паттерна Observable и об особенностях его реализации на javascript можно прочесть на &lt;a href="http://www.codeproject.com/KB/scripting/Observer_Pattern_JS.aspx" target="_blank" rel="nofollow"&gt;CodeProject&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;После того как вы так или иначе унаследовались от &lt;a href="http://extjs.com/deploy/dev/docs/?class=Ext.util.Observable"&gt;Ext.util.Observable&lt;/a&gt;, вы можете добавить ваши собственные события примерно таким образом&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.addEvents( &lt;span style="color: #006080"&gt;'IAmHappy'&lt;/span&gt;, &lt;span style="color: #006080"&gt;'IAmNotHappy'&lt;/span&gt; );&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Где, this – это и есть ваш компонент.&lt;/p&gt;

&lt;p&gt;Инициировать ваше событие также просто:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.fireEvent(&lt;span style="color: #006080"&gt;'IAmHappy'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, firstArg, secondArg);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Когда мы вызываем функцию fireEvent, то Observable смотрит, подписывался ли на это событие (в данном случае – ‘IAmHappy’) кто-либо или нет. Если подписывался, то вызывает функцию-обработчик и устанавливает значение переменной this равное текущему объекту (этого мы добились указав this вторым параметром после названия события). &lt;/p&gt;

&lt;p&gt;Также в эту функцию будут переданы параметры event и target. Где, event будет объект типа &lt;a href="http://extjs.com/source/EventManager.html#cls-Ext.EventObject"&gt;Ext.EventObject&lt;/a&gt;, а target – ссылка на HTMLElement. Следом за этими параметрами пойдут наши, собственные параметры firstArg и secondArg, коих может быть любое количество.&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; IAmHappyListener(&lt;span style="color: #0000ff"&gt;event&lt;/span&gt;, target, fristArg, secondArg){&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt;   2:&lt;/span&gt; ...&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt;   3:&lt;/span&gt; }&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Если же Observable не нашел ни одного подписчика, то он, соответственно, ничего и не вызывает.&lt;/p&gt;

&lt;p&gt;Простейший способ подписаться на события ExtJs я показал выше, но существуют также некоторые вариации:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Обработчик событий с задержкой &lt;/em&gt;(обработчик запуститься через 250 миллисекунд после события)&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; el.on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, {delay: 250});&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Обработчик событий с буферизацией &lt;/em&gt;(это означает, обработчик запуститься не чаще, чем раз в 100 миллисекунд и при условии, что событие произошло)&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; el.on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, {buffer: 100});&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Обработчик событий с условием распространения события&lt;/em&gt;&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// prevent default&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt;   2:&lt;/span&gt; el.on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, {preventDefault: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;});&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt;   3:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt;   4:&lt;/span&gt; &lt;span style="color: #008000"&gt;// only stop propagation&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt;   5:&lt;/span&gt; el.on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, {stopPropagation: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;});&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt;   7:&lt;/span&gt; &lt;span style="color: #008000"&gt;// prevent default and stop propagation&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt;   8:&lt;/span&gt; el.on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, {stopEvent: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;});&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en/DOM/event.preventDefault" target="_blank" rel="nofollow"&gt;preventDefault&lt;/a&gt; и &lt;a href="https://developer.mozilla.org/en/DOM/event.stopPropagation" target="_blank" rel="nofollow"&gt;stopPropagation&lt;/a&gt; означают тоже самое, что и соответствующие методы родных, джаваскриптовых событий.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Обработчик событий с другими опциями&lt;/em&gt;&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; el.on(&lt;span style="color: #006080"&gt;'click'&lt;/span&gt;, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick, &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt;   2:&lt;/span&gt;     single: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;, &lt;span style="color: #008000"&gt;// удаляет автоматически, после первого запуска&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;delegate&lt;/span&gt;: &lt;span style="color: #006080"&gt;'li.some-class'&lt;/span&gt; &lt;span style="color: #008000"&gt;// автоматическая делегация событий&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt;   4:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Добавление сразу нескольких обработчиков может выглядеть вот так:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; el.on({&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum2" style="color: #606060"&gt;   2:&lt;/span&gt;     &lt;span style="color: #006080"&gt;'click'&lt;/span&gt; : {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum3" style="color: #606060"&gt;   3:&lt;/span&gt;         fn: &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onClick,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum4" style="color: #606060"&gt;   4:&lt;/span&gt;     scope: &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum5" style="color: #606060"&gt;   5:&lt;/span&gt;     delay: 100&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum6" style="color: #606060"&gt;   6:&lt;/span&gt;     }, &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum7" style="color: #606060"&gt;   7:&lt;/span&gt;     &lt;span style="color: #006080"&gt;'mouseover'&lt;/span&gt; : {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum8" style="color: #606060"&gt;   8:&lt;/span&gt;         fn: &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onMouseOver,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum9" style="color: #606060"&gt;   9:&lt;/span&gt;     scope: &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum10" style="color: #606060"&gt;  10:&lt;/span&gt;     },&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum11" style="color: #606060"&gt;  11:&lt;/span&gt;     &lt;span style="color: #006080"&gt;'mouseout'&lt;/span&gt; : {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum12" style="color: #606060"&gt;  12:&lt;/span&gt;         fn: &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.onMouseOut,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum13" style="color: #606060"&gt;  13:&lt;/span&gt;         scope: &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum14" style="color: #606060"&gt;  14:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum15" style="color: #606060"&gt;  15:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Еще стоит упомянуть о такой полезной функции как &lt;a href="http://extjs.com/deploy/dev/docs/source/Observable-more.html#method-Ext.util.Observable-relayEvents" target="_blank" rel="nofollow"&gt;relayEvents&lt;/a&gt;. Она позволяет делегировать события одного компонента – другому компоненту. К примеру, у вас есть панель A, содержащая другую панель B, а та в свою очередь содержит кнопку Save. По нажатию на кнопку Save произойдет ваше собственное событие onSomeSave. К сожалению, ни панель А, ни панель B, обработать это событие не может. Поэтому панели А необходимо генерировать это событие как свое собственное, в надежде, что кто-то сможет его обработать.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/ExtJS/6603A090/clip_image001.gif"&gt;&lt;img title="clip_image001" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="222" alt="clip_image001" src="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/ExtJS/0F0E3F8D/clip_image001_thumb.gif" width="331" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“Передать” события панели B в панель A и позволяет relayEvents:&lt;/p&gt;

&lt;div id="codeSnippetWrapper" style="border-right: silver 1px solid; padding-right: 4px; border-top: silver 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: silver 1px solid; width: 97.5%; cursor: text; direction: ltr; line-height: 12pt; padding-top: 4px; border-bottom: silver 1px solid; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4; text-align: left; max-height: 200px"&gt;
  &lt;div id="codeSnippet" style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; text-align: left; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; direction: ltr; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; text-align: left; border-bottom-style: none"&gt;&lt;span id="lnum1" style="color: #606060"&gt;   1:&lt;/span&gt; panelA.relayEvents(panelB, [&lt;span style="color: #006080"&gt;'onSomeSave'&lt;/span&gt;]);&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Фух, что-то длинный пост получился. Устал. А я ведь еще не рассказал об &lt;a href="http://extjs.com/deploy/dev/docs/source/EventManager.html#cls-Ext.EventManager" target="_blank" rel="nofollow"&gt;Ext.EventManager&lt;/a&gt;, о такой полезной функции как &lt;a href="http://extjs.com/deploy/dev/docs/source/EventManager.html#method-Ext.EventObject-within" target="_blank" rel="nofollow"&gt;within&lt;/a&gt; и о многом другом. Ну чтож, это в другой раз.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Полезные материалы.&lt;/strong&gt;&lt;/p&gt;

&lt;div id="__ss_153232" style="width: 425px; text-align: left"&gt;&lt;a title="Ext Js Events" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/sdhjl2000/ext-js-events-153232"&gt;Ext Js Events&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ext-js-events-1193984087101149-2&amp;amp;rel=0&amp;amp;stripped_title=ext-js-events-153232" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=ext-js-events-1193984087101149-2&amp;amp;rel=0&amp;amp;stripped_title=ext-js-events-153232" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;

  &lt;p&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Полезные ссылки&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.w3.org/TR/DOM-Level-3-Events/events.html" target="_blank" rel="nofollow"&gt;Document Object Model Events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.quirksmode.org/js/introevents.html" target="_blank" rel="nofollow"&gt;Introduction to Events&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://extjs.com/learn/Tutorial:Events_Explained" target="_blank" rel="nofollow"&gt;Tutorial:Events Explained&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://extjs.com/learn/Tutorial:RelayEvents" target="_blank" rel="nofollow"&gt;Tutorial:RelayEvents&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/r3kkQo_b-Qg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/r3kkQo_b-Qg/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/07/29/extjs-events.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=2fe71c86-e603-4992-9ce1-a7d575fd999e</guid>
      <pubDate>Wed, 29 Jul 2009 17:00:07 +0200</pubDate>
      <category>ExtJs</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=2fe71c86-e603-4992-9ce1-a7d575fd999e</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=2fe71c86-e603-4992-9ce1-a7d575fd999e</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/07/29/extjs-events.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=2fe71c86-e603-4992-9ce1-a7d575fd999e</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=2fe71c86-e603-4992-9ce1-a7d575fd999e</feedburner:origLink></item>
    <item>
      <title>Америка</title>
      <description>&lt;p&gt;Объявили посадку. Через несколько минут самолет Киев-Нью Йорк приземлился в аэропорту JFK. Большинство в самолете наши. Мы все незнакомы. Но нас объединяет одно - радостные лица. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Так примерно и начиналось мое путешествие в Штаты несколько месяцев&amp;#160; назад. Но написать об этом, я нашел время только сейчас. &lt;a href="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/16ea93a8b8b0_54B/DSC04408_2.jpg"&gt;&lt;img title="DSC04408" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="345" alt="DSC04408" src="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/16ea93a8b8b0_54B/DSC04408_thumb.jpg" width="260" align="right" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Потом был еще один самолет и так я оказался в &lt;strong&gt;San Francisco&lt;/strong&gt;, California. Первое впечатление об Америке было на само деле отрицательным - дело все в разнице менталитета. Я чувствовал себя инопланетянином.&amp;#160; Но не потому что был удивлен высотой небоскребов или чистотой улиц... Американцы - вот, что меня удивило с первой минуты. Банальная улыбка, многим ее иногда так не хватает, но когда тебе улыбается несколько сотен человек практически одновременно, где-нибудь на Бродвее или 5й, 7й, да и любой другой авеню. Действительно неприятно. Не знаешь, что делать в ответ. Тоже улыбаться? Я не могу улыбаться в течение суток. У нас - советских людей (да, я рожден в СССР!) - развиты не те мышцы лица. Я пробовал. К вечеру улыбку заклинивает, лицо перекособочивает, получается улыбка смертельно ране нного человека. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Океан&lt;/strong&gt;. Следующее, что произвело на меня сильное впечатление. На ближайшие выходные я добрался до океана. По случаю июля месяца, никто не купался, только баловались несколько серфингистов в соответствующих костюмах. И мне популярно объяснили, что вдоль всего тихоокеанского побережья Северной Америки идет холодное течение, поэтому температура воды не поднимается выше 18-23 C. Единственные, кого не смущала столь низкая температура воды, были - дети. Они купались и вели себя также как и у нас, на пляжах Крыма - чего-то рыли, что-то искали в прибое, куда-то носили ведёрками воду и строили немыслимые строения из песка.&lt;a href="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/16ea93a8b8b0_54B/P7040021.jpg"&gt;&lt;img title="P7040021" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="247" alt="P7040021" src="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/16ea93a8b8b0_54B/P7040021_thumb.jpg" width="328" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Американы говорят: &amp;quot;Америку сделал &lt;strong&gt;автомобиль&lt;/strong&gt;&amp;quot;. Это понятно. Большую часть жизни они проводят в авто. Машины хороши, нет слов; но не менее хороши дороги, по которым эти машины ездят. Бетонные плиты, уложенные стык в стык, почти без трещин. Некоторые участки дорог – платные (в частности мосты). Что есть платная дорога? Это кратчайший путь к вашей цели, с прекрасным скоростным режимом и пропускной способностью (за счет качества покрытия). Пробки есть, но с ними активно борятся – появились так называемые Car pool. Это полосы по которым можно ехать если в машине 2 и более человек. А если кто-то сломался, его тут же стаскивают с дороги (есть служба специально для этого). При въезде на платную дорогу вы даете кредитку и въезжаете на дорогу (на некоторых участках просто фоторафируют ваш номер и присылают раз в месяц счет за проезд). Занимает секунды. Как я узнал позже, номера имеют не только улицы, но и дороги, и вся Америка разбита на некие сектора под номерами. Если вы хотите уйти от полиции, это будет сделать непросто. Стукачей полно, и все сектора (дороги) под номерами. Даже сами американцы имеют свои номера. Это называется номер социального страхования. Вся их жизнь - это сплошное громадье цифр, номеров, счетов. Заблудиться почти невозможно. Останавливаетесь, смотрите карту, номер сектора дороги, где вы сейчас, и ориентируетесь моментально.&lt;/p&gt;  &lt;p&gt;Как вы понимаете, в Штатах я оказался не отдыха ради, а по работе. О деталях проекта, по понятным причинам, я рассказать ничего не могу. Скажу лишь, что в ближайшее время вы сможете увидеть посты на тему &lt;strong&gt;Enterprise Patterns&lt;/strong&gt;, различных особенностей SOA архитектур, пару слов об ExtJs, а также о войнах браузеров. Часто писать не обещаю – много работы, а релиз как всегда запланирован на вчера ;)&lt;a href="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/16ea93a8b8b0_54B/DSC04403.jpg"&gt;&lt;img title="DSC04403" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; margin-left: 0px; margin-right: 0px; border-right-width: 0px" height="235" alt="DSC04403" src="http://podlipensky.com/image.axd?picture=WindowsLiveWriter/16ea93a8b8b0_54B/DSC04403_thumb.jpg" width="312" align="right" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;В целом, у меня сложилось впечатление, что Америка – это страна, где меньше думают и больше действуют. При решении любого вопроса американцы стремятся как можно раньше начать действовать, даже совершая при этом ошибки. Чтож, в этом есть определенный смысл. Особенно в мире веб - где скорость выпуска продукта прямо пропорциональна количеству “завоеванных” пользователей.&lt;/p&gt;  &lt;p&gt;P.S.&lt;/p&gt;  &lt;p&gt;Теперь ваши комментарии будут появляться в блоге, лишь спустя 12 часов – апрувить я смогу их лишь своим ранним утром. Не обессудьте.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/bRCxwQNOFBI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/bRCxwQNOFBI/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/07/24/america-first-impression.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=29a74c34-a138-4d7d-9891-f6199167f5a5</guid>
      <pubDate>Fri, 24 Jul 2009 00:58:14 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=29a74c34-a138-4d7d-9891-f6199167f5a5</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=29a74c34-a138-4d7d-9891-f6199167f5a5</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/07/24/america-first-impression.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=29a74c34-a138-4d7d-9891-f6199167f5a5</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=29a74c34-a138-4d7d-9891-f6199167f5a5</feedburner:origLink></item>
    <item>
      <title>Думаете, вы знаете JavaScript</title>
      <description>&lt;p&gt;Вы бородатый веб разработчик и думаете уже видали всякие чудеса в JavaScript-коде? Хм, чтож тогда следующие задачки для вас.&amp;nbsp;&lt;/p&gt;&lt;p&gt;1. ++Math.PI&lt;br /&gt;2. (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)&lt;br /&gt;3. typeof NaN&lt;br /&gt;4. typeof typeof undefined&lt;br /&gt;5. a = {null:null}; typeof a.null;&lt;br /&gt;6. a = &amp;quot;5&amp;quot;; b = &amp;quot;2&amp;quot;; c = a * b;&lt;br /&gt;7. a = &amp;quot;5&amp;quot;; b = 2; c = a+++b;&lt;br /&gt;8. isNaN(1/null)&lt;br /&gt;9. (16).toString(16)&lt;br /&gt;10. 016 * 2&lt;br /&gt;11. ~null&lt;br /&gt;12. &amp;quot;ab c&amp;quot;.match(/\b\w\b/)&lt;/p&gt;&lt;p&gt;Жду ваши варианты в комментариях (просьба не постить по десять одинаковых комментариев, все равно раньше чем я их промодерю они не появятся). До компа я доберусь только завтра, поэтому и ваши комментарии тоже появятся только завтра, а заодно и обновление к этому посту - в виде ответов и объяснений к решениям (да, я их сопру с ваших комментариев, поэтому сначала думайте, а потом пишите!)&amp;nbsp;&lt;/p&gt;&lt;p&gt;Ответы и решения:&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;1. 4.141592653589793&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;С этим надеюсь понятно, в школе все учились.... Я знаю некоторых смутило, что Пи вроде как должно быть константой, но спешу вас разочаровать - в джаваскрипте с константами плохо, а точнее их нет в том понимании, в каком мы видим их, скажем, в C#.&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;2. false&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Такой же ответ получат и Java разработчики, потому как и Java и JavaScript используют&amp;nbsp;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;IEEE 754 числа с плавающей точкой. Более подробно об операциях с числами с плавающей точкой можно найти&amp;nbsp;&lt;a rel="nofollow" href="http://www.macaulay.ac.uk/fearlus/floating-point/" target="_blank"&gt;тутаньки&lt;/a&gt;.&amp;nbsp;&lt;span class="Apple-style-span" style="color: #000000; font-size: 12px; line-height: normal"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;3. &amp;quot;number&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Логического объяснения этому я не нашел, единственное что могу посоветовать, это стараться использовать isNaN вместо typeof SomePotentialNumber, во избежание казусов.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;4. &amp;quot;string&amp;quot;&lt;span class="Apple-style-span" style="color: #000000; font-size: 12px; font-weight: normal; line-height: normal"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Тут все просто - первый оператор typeof вернет тип переменной в виде строки, следовательно второй оператор должен вернуть тип результата первого оператора, т.е. string.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;5. &amp;quot;object&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Мы присвоили переменной а, объект с полем &amp;quot;null&amp;quot;, значение которого null, а это в свою очередь, пусть и специфический, но объект. Другими словами мы тут имеем&amp;nbsp;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;a.null === null.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;6. 10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Если в операциях умножение, деление или вычитание один из операторов строка - интерпретатор пытается преобразовать его в число.&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;7. 7&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Порядок выполнения операндов в Javascript &amp;nbsp;идет слева направо, поэтому мы имеем &amp;quot;а увеличить на 1, а затем сложить с b&amp;quot;.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;8. false&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;С этим тоже, думаю, все понятно.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;9. 10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;toString() принимает числовой параметр (необязательный) и toString(16) означает, что число записано в шестнастеричной системе счисления, посему ответ и 10.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;10. 28&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;016 это восьмеричное представление числа 14 в десятеричной системе счисления.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;11. -1&lt;span class="Apple-style-span" style="color: #000000; font-size: 12px; font-weight: normal; line-height: normal"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: #333333; font-size: 13px; line-height: 16px"&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold"&gt;12. [ &amp;quot;c&amp;quot; ]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Отдельно стоящий символ в той строке только один - &amp;quot;с&amp;quot;, это и ищет указанное регулярное выражение.&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/P68ysl4cr3Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/P68ysl4cr3Q/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/04/28/javascript-puzzle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=38794625-0c30-4327-ba66-1b19982b0d15</guid>
      <pubDate>Tue, 28 Apr 2009 06:30:00 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=38794625-0c30-4327-ba66-1b19982b0d15</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=38794625-0c30-4327-ba66-1b19982b0d15</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/04/28/javascript-puzzle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=38794625-0c30-4327-ba66-1b19982b0d15</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=38794625-0c30-4327-ba66-1b19982b0d15</feedburner:origLink></item>
    <item>
      <title>Минимальная зарплата</title>
      <description>&lt;p&gt;Думаю все уже в курсе, что&amp;nbsp;&lt;a href="http://www.developers.org.ua/archives/krokodil/2008/10/13/outsourcing-business-in-times-on-crisis/"&gt;у нас кризис&lt;/a&gt;&amp;nbsp;(теперь кажется финансовый), впрочем как и у всех. И каждый понимает что ничего хорошего ему это событие не принесет. А одним из &amp;quot;благ&amp;quot; кризиса является минимальная зарплата, т.е. та сумма денег, за которую и вы не против поработать и шефу увольнять вас пока нет повода. Звучит неплохо, правда? Неправда. У большинства людей хорошо развито чувство собственничества, поэтому пока это не мое, мне все равно кто этим владеет, но как только оно стало моим - хрен кто это у меня отберет! А тут такое дело - зарплату понижают! Не буду больше растекаться по древу вот вам поучительный комикс на эту тему:&lt;/p&gt;&lt;img src="http://www.podlipensky.com/image.axd?picture=2009%2f4%2f3376271384_b84611b2a1_o.jpg" alt="" /&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/bYTapVOJ-T8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/bYTapVOJ-T8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/04/27/minimal-wages.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</guid>
      <pubDate>Mon, 27 Apr 2009 01:34:00 +0200</pubDate>
      <category>В мире</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/04/27/minimal-wages.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=9d5d1659-f585-4a63-8a5a-afd6ce0aed62</feedburner:origLink></item>
    <item>
      <title>4 интересных онлайн презентаций для веб-разработчика</title>
      <description>&lt;p&gt;&lt;strong&gt;1. Ajax 101 | Workshop&lt;/strong&gt;     &lt;br /&gt;Автор: &lt;a href="http://www.slideshare.net/billwscott"&gt;Bill Scott&lt;/a&gt; | &lt;a href="http://www.slideshare.net/billwscott/ajax-101-workshop"&gt;This presentation on SlideShare&lt;/a&gt;     &lt;br /&gt;Введение в программирование с помощью Ajax. Включает XMLHttpRequest, XML, JSON, JavaScript, HTML, CSS, Dom Scripting, Event Handling с небольшими примерами на YUI.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div id="__ss_24818" style="width: 425px; text-align: left"&gt;&lt;a title="Ajax 101 Workshop" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/billwscott/ajax-101-workshop?type=powerpoint"&gt;Ajax 101 Workshop&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=ajax-101-workshop-29092&amp;amp;stripped_title=ajax-101-workshop" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=ajax-101-workshop-29092&amp;amp;stripped_title=ajax-101-workshop" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/billwscott"&gt;Bill Scott&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/scripthack"&gt;scripthack&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/mashup"&gt;mashup&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTU*NTgmcHQ9MTIzNTUwNjk4MTY1MiZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;   &lt;br /&gt;  &lt;p&gt;&lt;strong&gt;2. Modular CSS&lt;/strong&gt;     &lt;br /&gt;Автор: &lt;a href="http://www.slideshare.net/maxdesign"&gt;Russ Weakley&lt;/a&gt; | &lt;a href="http://www.slideshare.net/maxdesign/modular-css"&gt;This presentation on Slide Share&lt;/a&gt;     &lt;br /&gt;Вполне доступно (даже я понял) объясняется механизм построения &lt;strike&gt;правильного&lt;/strike&gt; модульного CSS, что позволяет прятать/показывать отдельные CSS правила для отдельных браузеров, без различного рода уловок и обходных путей.&lt;/p&gt;  &lt;div id="__ss_69855" style="width: 425px; text-align: left"&gt;&lt;a title="Modular CSS" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/maxdesign/modular-css?type=presentation"&gt;Modular CSS&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=modular-css3496&amp;amp;stripped_title=modular-css" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=modular-css3496&amp;amp;stripped_title=modular-css" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/maxdesign"&gt;Russ Weakley&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/flexible"&gt;flexible&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/system"&gt;system&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTcwNzMmcHQ9MTIzNTUwNzEzMDU3MiZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;   &lt;p&gt;&lt;strong&gt;3. jQuery in 15 minutes&lt;/strong&gt;     &lt;br /&gt;Автор: &lt;a href="http://www.slideshare.net/simon"&gt;Simon&lt;/a&gt; | &lt;a href="http://www.slideshare.net/simon/jquery-in-15-minutes"&gt;This presentation on SlideShare&lt;/a&gt;     &lt;br /&gt;Небольшое введение в JQuery. Функции, коллекции, работа со значениями и цепочками.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div id="__ss_88304" style="width: 425px; text-align: left"&gt;&lt;a title="jQuery in 15 minutes" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/simon/jquery-in-15-minutes?type=presentation"&gt;jQuery in 15 minutes&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=jquery-in-15-minutes1421&amp;amp;stripped_title=jquery-in-15-minutes" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=jquery-in-15-minutes1421&amp;amp;stripped_title=jquery-in-15-minutes" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/simon"&gt;simon&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/javascript"&gt;javascript&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/jquery"&gt;jquery&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTY3NjYmcHQ9MTIzNTUwNzM2NTY1NSZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;   &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4. JavaScript Library Overview&lt;/strong&gt;&amp;#160; &lt;br /&gt;Автор &lt;a href="http://www.slideshare.net/jeresig"&gt;Jeresig&lt;/a&gt; | &lt;a href="http://www.slideshare.net/jeresig/javascript-library-overview"&gt;This presentation on SlideShare&lt;/a&gt;     &lt;br /&gt;Интересный обзор популярных JavaScript библиотек (jquery, prototype, Scriptaculous...) для веб-дизайнеров.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div id="__ss_143885" style="width: 425px; text-align: left"&gt;&lt;a title="JavaScript Library Overview" style="display: block; margin: 12px 0px 3px; font: 14px helvetica,arial,sans-serif; text-decoration: underline" href="http://www.slideshare.net/jeresig/javascript-library-overview?type=presentation"&gt;JavaScript Library Overview&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=javascript-library-overview-1193202840830224-1&amp;amp;stripped_title=javascript-library-overview" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=javascript-library-overview-1193202840830224-1&amp;amp;stripped_title=javascript-library-overview" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="font-size: 11px; padding-top: 2px; font-family: tahoma,arial; height: 26px"&gt;View more &lt;a style="text-decoration: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline" href="http://www.slideshare.net/jeresig"&gt;jeresig&lt;/a&gt;. (tags: &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/dojo"&gt;dojo&lt;/a&gt; &lt;a style="text-decoration: underline" href="http://slideshare.net/tag/prototype"&gt;prototype&lt;/a&gt;)&lt;/div&gt; &lt;/div&gt; &lt;img style="visibility: hidden; width: 0px; height: 0px" height="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMzU1MDY2OTkxMTgmcHQ9MTIzNTUwNzQzNjMxMSZwPTEwMTkxJmQ9Jmc9MiZ*PSZvPWY4MmQyM2VjODcwMDRhN2Y5MWZjZDZhNThlOTQzNTlm.gif" width="0" border="0" /&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/LWtG0uvGmL4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/LWtG0uvGmL4/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/25/four-online-presentations-for-web-developers.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</guid>
      <pubDate>Wed, 25 Feb 2009 17:47:42 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/25/four-online-presentations-for-web-developers.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=17af4966-79cf-4f20-bfc5-3f40fa95868d</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=17af4966-79cf-4f20-bfc5-3f40fa95868d</feedburner:origLink></item>
    <item>
      <title>Video: Layout Engine Internals</title>
      <description>&lt;p&gt;Интересное видео в тему к предыдущему посту. Если вы еще не в курсе, как работает браузер - жмите на серенький треугольничек рядом с дядькой.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:bab3c1f9-6ecd-45d7-a58d-de29ad8e8e75" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;div&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/a2_6bGNZ7bA&amp;amp;eurl=http://dougt.wordpress.com/&amp;amp;feature=player_embedded"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/a2_6bGNZ7bA&amp;amp;eurl=http://dougt.wordpress.com/&amp;amp;feature=player_embedded" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/AnCLKYK1Hwo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/AnCLKYK1Hwo/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/17/Video-Layout-Engine-Internals.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</guid>
      <pubDate>Tue, 17 Feb 2009 00:02:25 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/17/Video-Layout-Engine-Internals.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=321c21cf-517d-42fb-ad07-9a4eb8a66e2f</feedburner:origLink></item>
    <item>
      <title>Скаженi кабани: Оптимизируем операции с DOM'ом</title>
      <description>&lt;p&gt;Давно известно, что операции с DOM'ом весьма и весьма трудоемки. Потери в производительности заметны обычно в трех случаях:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;когда скрипт выполняет &lt;strong&gt;манипуляции&lt;/strong&gt; с деревом объектов (создает, удаляет или изменяет часть дерева)  &lt;li&gt;если скрипт "заставляет" браузер &lt;strong&gt;перерисовывать&lt;/strong&gt; (redraw) или &lt;strong&gt;перестраивать разметку&lt;/strong&gt; (reflow) страницы  &lt;li&gt;и наконец, в случае когда скрипт "ищет" один из узлов дерева объектов (если дерево большое).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Последний пункт я уже рассматривал в &lt;a href="http://podlipensky.com/post/2008/11/24/quick-web-sites-optimize-jquery.aspx" target="_blank"&gt;одной из статей&lt;/a&gt; своего цикла &lt;a href="http://podlipensky.com/tag/%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C.aspx" target="_blank"&gt;Скаженi кабани&lt;/a&gt;, на примере JQuery. Поэтому сегодня мы поговорим о первых двух. Эм...на самом деле я схитрил, и первый пункт представляет собой ни что иное, как причину появления второго пункта. Тогда сразу перейдем ко второму пункту и попробуем разобраться в терминах перерисовывать и перестраивать разметку:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Перерисовка страницы &lt;/strong&gt;браузером происходит в случае, когда что-то визуально изменилось, но разметка страницы осталась прежней. Например, изменился цвет элемента или элемент стал видимым/невидимым (с помощью visibility: [hidden, visible], так как это не повлияет на разметку). Эта операция существенно влияет на производительность веб приложения, так как заставляет браузер пройтись по дереву объектов и определить какие элементы видимы и как они должны быть отображены.&lt;/p&gt; &lt;p&gt;Перестройка разметки страницы более дорогостоящая операция. Она происходит в следующих случаях:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;при первой загрузке страницы. В случае с Firefox, перестройка может происходить несколько раз, по мере &lt;strong&gt;докачивания контента&lt;/strong&gt; страницы;  &lt;li&gt;когда вы добавляете или удаляете элементы DOM'a. Надо сказать, тут есть одно исключение - если вы добавили/удалили объект с абсолютным позиционированием, то это может и не привести к перестройке разметки страницы, так как позиция и размеры других элементов не были изменены;  &lt;li&gt;когда стиль элемента изменен и он влияет на размер и положение этого либо других объектов;  &lt;li&gt;когда вы пытаетесь обратиться к свойствам, требующим вычислений со стороны браузера (например, offsetWidth, clientHeight). А также в случае попытки получить вычисляемые CSS значения (с помощью getComputedStyle() или currentStyle в IE).&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Процесс перестройки разметки страницы выглядит примерно следующим образом:&lt;/p&gt; &lt;p&gt;&lt;a href="http://Mozilla.org" target="_blank" rel="nofollow"&gt;Mozilla.org&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="display: block"&gt; &lt;object type="application/x-shockwave-flash" height="330" width="400" data="http://video.google.com/googleplayer.swf?docid=1020647662203348823"&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://wiki.org" target="_blank" rel="nofollow"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="display: block"&gt; &lt;object type="application/x-shockwave-flash" height="330" width="400" data="http://video.google.com/googleplayer.swf?docid=-5863446593724321515"&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Но перестройка разметки странцы не происходит сразу после добавления элемента в дерево или после изменения высоты элемента. Все "запросы" на перестройку разметки выстраиваются в очередь и выполняются уже после выполнения скрипта. Причем, некоторые "запросы" могут быть объединены, если они применяются к одному элементу и являются одного типа (например изменяют его ширину). Но процесс оптимизации таких "запросов" сильно зависит от типа браузера (и даже версии браузера). Пользователь не может взаимодействовать с вашим приложением, пока идет перестройка разметки.&lt;/p&gt; &lt;p&gt;Теперь когда мы в курсе "почему наш сайт тормозит", рассмотрим несколько техник оптимизации работы с DOM'ом. Первое что приходит в голову, это минимизировать количество дорогостоящих операций (описанных выше). А значит, необходимо как можно больше операций совершать вне DOM'а, например используя &lt;a href="http://ejohn.org/blog/dom-documentfragments/" target="_blank" rel="nofollow"&gt;DocumentFragment&lt;/a&gt;.&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; products = ... &lt;span style="color: #008000"&gt;//init array of products&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: #8b0000"&gt;myProducts&lt;/span&gt;"); &lt;span style="color: #008000"&gt;//find list populate to&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i=0; i &amp;lt; products.&lt;span style="color: #0000ff"&gt;length&lt;/span&gt;; i++){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createElement("&lt;span style="color: #8b0000"&gt;li&lt;/span&gt;");&lt;p&gt;&lt;/p&gt;
    item.appendChild(&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createTextNode("&lt;span style="color: #8b0000"&gt;Product&lt;/span&gt;" + products[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.appendChild(item); &lt;span style="color: #008000"&gt;// AHTUNG! Operation with DOM&lt;/span&gt;&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Предыдущий код можно оптимизировать следующим образом:&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; products = ... &lt;span style="color: #008000"&gt;//init array of products&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: #8b0000"&gt;myProducts&lt;/span&gt;"); &lt;span style="color: #008000"&gt;//find list populate to&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; fragment = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createDocumentFragment(); &lt;span style="color: #008000"&gt;//create document fragment&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i=0; i &amp;lt; products.&lt;span style="color: #0000ff"&gt;length&lt;/span&gt;; i++){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createElement("&lt;span style="color: #8b0000"&gt;li&lt;/span&gt;");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.appendChild(&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createTextNode("&lt;span style="color: #8b0000"&gt;Product&lt;/span&gt;" + products[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fragment.appendChild(item); &lt;span style="color: #008000"&gt;//working with fragment only, not with DOM&lt;/span&gt;&lt;br&gt;}&lt;br&gt;list.appendChild(fragment); &lt;span style="color: #008000"&gt;//add fragment to DOM&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Эта версия кода затрагивает дерево объектов только раз, в последней строчке. И так как DocumentFragment не имеет визуальной составляющей, то все операции с ним не вызывают ни перерисовки, ни изменения в разметке страницы. Но так как DocumentFragment не может быть добавлен в DOM, то операция appendChild добавит все дочерние элементы фрагмента (вместо того, чтобы добавить сам фрагмент). &lt;/p&gt;
&lt;p&gt;Другим, более эффективным подходом, будет работать с элементом, не находящимся в дереве. К примеру, мы можем удалить наш объект из дерева перед выполнением операций над ним (removeChild() или replaceChild())&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; products = ... &lt;span style="color: #008000"&gt;//init array of products&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; list = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById("&lt;span style="color: #8b0000"&gt;myProducts&lt;/span&gt;"); &lt;span style="color: #008000"&gt;//find list populate to&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff"&gt;parent&lt;/span&gt; = list.parentNode; &lt;span style="color: #008000"&gt;//find parent&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;parent&lt;/span&gt;.removeChild(list); &lt;span style="color: #008000"&gt;//remove list element from DOM&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; fragment = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createDocumentFragment(); &lt;span style="color: #008000"&gt;//create document fragment&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; i=0; i &amp;lt; products.&lt;span style="color: #0000ff"&gt;length&lt;/span&gt;; i++){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; item = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createElement("&lt;span style="color: #8b0000"&gt;li&lt;/span&gt;");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; item.appendChild(&lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.createTextNode("&lt;span style="color: #8b0000"&gt;Product &lt;/span&gt;" + products[i]);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.appendChild(item);&lt;br&gt;}&lt;br&gt;&lt;span style="color: #0000ff"&gt;parent&lt;/span&gt;.appendChild(list);&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Мы не избежали перестройки разметки страницы, но мы уменьшили количество таких перестроек.&lt;/p&gt;
&lt;p&gt;Другой причиной перерисовки или перестройки страницы служат &lt;strong&gt;стили&lt;/strong&gt; и спобосы их назначения элементам. Рассмотрим следующий кусок кода:&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;element.style.backgroundColor = "&lt;span style="color: #8b0000"&gt;white&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause redraw&lt;/span&gt;&lt;br&gt;element.style.color = "&lt;span style="color: #8b0000"&gt;red&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause redraw&lt;/span&gt;&lt;br&gt;element.style.fontSize = "&lt;span style="color: #8b0000"&gt;12em&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause reflow&lt;/span&gt;&lt;br&gt;element.style.widht = "&lt;span style="color: #8b0000"&gt;100px&lt;/span&gt;"; &lt;span style="color: #008000"&gt;//will cause reflow&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Как видите первые две строки инициируют перерисовку. Избежать этого можно, если перед изменением стилей скрыть элемент с помощью visibility:hidden или display:none (будет произведено два лишних reflow). Избежать перестройки разметки тут не получиться, но их количество можно уменьшить, если задать все изменения стилей в CSS классе.&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;.&lt;span style="color: #800000"&gt;newClass&lt;/span&gt;{&lt;br&gt;	&lt;span style="color: #800000"&gt;background-color&lt;/span&gt;: &lt;span style="color: #800000"&gt;blue&lt;/span&gt;;&lt;br&gt;	&lt;span style="color: #800000"&gt;color&lt;/span&gt;: &lt;span style="color: #800000"&gt;red&lt;/span&gt;;&lt;br&gt;	&lt;span style="color: #800000"&gt;font-size&lt;/span&gt;: &lt;span style="color: #800000"&gt;12em&lt;/span&gt;;&lt;br&gt;	&lt;span style="color: #800000"&gt;with&lt;/span&gt;: &lt;span style="color: #800000"&gt;100px&lt;/span&gt;;&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;а затем&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;element.className = "&lt;span style="color: #8b0000"&gt;newClass&lt;/span&gt;";&lt;/pre&gt;&lt;br&gt;
&lt;p&gt;Скрытый reflow может также произойти, если мы попытаемся получить одно из вычисляемых свойств (например &lt;strong&gt;offsetWidth&lt;/strong&gt;). Браузер должен быть уверен, что значение свойства актуально, поэтому он рассчитает его заново, а это фактически и будет перестройка разметки страницы. Избежать этого опять же нельзя, но мы можем уменьшить количество таких операций за счет кэширования значения этого свойства:&lt;/p&gt;&lt;pre style="font-size: 1.6em"&gt;&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; posElem = &lt;span style="color: #0000ff"&gt;document&lt;/span&gt;.getElementById('animation');
&lt;span style="color: #0000ff"&gt;var&lt;/span&gt; calcWidth = posElem.offsetWidth;
posElem.style.fontSize = ( calcWidth / 10 ) + 'px';
posElem.firstChild.style.marginLeft = ( calcWidth / 20 ) + 'px';
posElem.style.left = ( ( -1 * calcWidth ) / 2 ) + 'px';
... other changes ...&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Полезные ссылки&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mozilla.org/newlayout/doc/reflow.html" target="_blank" rel="nofollow"&gt;Notes on HTML Reflow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ejohn.org/blog/dom-documentfragments/" target="_blank" rel="nofollow"&gt;Dom document fragments&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://dev.opera.com/articles/view/efficient-javascript/?page=3#reflow" target="_blank" rel="nofollow"&gt;Efficent Javascript (from Opera)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ryboe.com/2008/07/22/increasing-appendchild-performance-with-dom-tricks.html" target="_blank" rel="nofollow"&gt;Increasing appendChild Performance with DOM Tricks&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/smsbMfIMnPU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/smsbMfIMnPU/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/16/dom-operations-optimization.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=b95ecda1-8094-412c-94ca-f2e55a96e402</guid>
      <pubDate>Mon, 16 Feb 2009 02:00:43 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=b95ecda1-8094-412c-94ca-f2e55a96e402</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=b95ecda1-8094-412c-94ca-f2e55a96e402</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/16/dom-operations-optimization.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=b95ecda1-8094-412c-94ca-f2e55a96e402</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=b95ecda1-8094-412c-94ca-f2e55a96e402</feedburner:origLink></item>
    <item>
      <title>Производительность браузеров в зависимости от верстки</title>
      <description>&lt;p&gt;Честно говоря раньше не придавал особого значения такой фазе веб-девелопмента, как верстка. Отчасти потому что никогда этим сам не занимался(на должном уровне), отчасти от того, что недопонимал некоторые аспекты веб-разработки. Недавно наткнулся на &lt;a href="http://www.artlebedev.ru/tools/technogrette/html/browser-performance/" target="_blank" rel="nofollow"&gt;интересную статью&lt;/a&gt; Сергея Чикуенока (из команды никому не известного &lt;a href="http://www.artlebedev.ru" target="_blank" rel="nofollow"&gt;Артема Лебедева&lt;/a&gt;). Суть этой статьи сводится к следующему: если клиентский код работает медленно - убейте дизайнера, верстальщика или кто этим у вас там занимался. Потому как &lt;strong&gt;разметка влияет на скорость работы веб-приложения&lt;/strong&gt;. Кому интересно почитать детали можно в &lt;a href="http://www.artlebedev.ru/tools/technogrette/html/browser-performance/" target="_blank" rel="nofollow"&gt;оригинале статьи&lt;/a&gt;, а я лишь процитирую выводы:&lt;/p&gt; &lt;ol&gt; &lt;ol&gt; &lt;li&gt;Для интерактивных элементов лучше использовать &lt;tt&gt;position: absolute&lt;/tt&gt;.  &lt;li&gt;Большое количество элементов на странице может снизить производительность, но не стоит увлекаться их сокращением в ущерб надежности макета.  &lt;li&gt;Не надо делать очень глубоких вложенных структур элементов.  &lt;li&gt;Прежде чем начинать верстку макета, следует узнать, какие интерактивные механизмы там должны быть — это избавит от многих проблем уже на начальном этапе работы над проектом.  &lt;li&gt;Не надо загонять себя в угол глупых стереотипов: «валидность» и «семантичность» никому, кроме самих разработчиков, не нужна.  &lt;li&gt;Не стоит без надобности растягивать картинки. Если это необходимо сделать, следует воспользоваться &lt;tt&gt;canvas&lt;/tt&gt;.  &lt;li&gt;Как правило, &lt;tt&gt;img&lt;/tt&gt;-элемент будет работать гораздо быстрее, чем CSS-свойство &lt;tt&gt;background-image&lt;/tt&gt;.  &lt;li&gt;Помните главное правило: &lt;i&gt;оптимизировать нужно то, что требует оптимизации&lt;/i&gt;. &lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt; &lt;p&gt;Вот так-то господа, веб разработчики...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/JEFBlyoH_FQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/JEFBlyoH_FQ/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/13/browser-performance-layout.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</guid>
      <pubDate>Fri, 13 Feb 2009 09:17:04 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/13/browser-performance-layout.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=eca0dda4-07b7-44ee-8f88-1ace31a09c32</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=eca0dda4-07b7-44ee-8f88-1ace31a09c32</feedburner:origLink></item>
    <item>
      <title>Небольшой LINQ пазл</title>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
 
&lt;p&gt;
Почему следующий кусок кода генерирует &lt;strong&gt;StackOverflowException&lt;/strong&gt;?
&lt;/p&gt;
&lt;pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
IEnumerable&amp;lt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt; q = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;[] { 1, 2 };
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
q = from x &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;[] { 1, 2 }
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
    from y &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; q
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
    select x + y;
&lt;/pre&gt;
&lt;pre style="margin: 0em; font-size: 12px; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;
q.ToArray();
&lt;/pre&gt;
&lt;/pre&gt;
&lt;p&gt;
С предложениями, как это &lt;strong&gt;исправить&lt;/strong&gt; - прошу в комментарии ;)
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/qE2hD8XFrcg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/qE2hD8XFrcg/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/11/linq-puzzle.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=e0f63684-4431-4159-9b24-3904918f95b2</guid>
      <pubDate>Wed, 11 Feb 2009 10:25:00 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=e0f63684-4431-4159-9b24-3904918f95b2</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=e0f63684-4431-4159-9b24-3904918f95b2</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/11/linq-puzzle.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=e0f63684-4431-4159-9b24-3904918f95b2</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=e0f63684-4431-4159-9b24-3904918f95b2</feedburner:origLink></item>
    <item>
      <title>Письмо архитектору</title>
      <description>&lt;p&gt;По роду деятельности получаю различного рода документы(требования) от наших клиентов. Ввиду подписанного мною NDA, я не могу их публиковать. Поэтому я представляю требования к проекту, как требования к постройке дома.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Уважаемый Архитектор,&lt;/p&gt; &lt;p&gt;Пожалуйста спланируте и построте мне дом. Я не совсем уверен, что именно мне нужно, поэтому полностью полагаюсь на вас. Тем не менее, у меня есть несколько идей, которые я бы хотел видеть реализованными в моем доме. К примеру, я бы хотел иметь 2 или 44 спальных комнаты. Спланируйте пожалуйста, так чтобы эти комнаты можно было потом легко убрать или добавить, потому что я приму окончательное решение только тогда, когда увижу чертежи. А также оцените финансовые затраты на каждый вариант, чтобы я мог принять правильное решение.&lt;/p&gt; &lt;p&gt;Пожалуйста учтите, что мой новый дом должен стоить дешевле, чем дом в котором я живу. Убедитесь, что все недостатки, присутствующие в моем текущем жилище, будут устранены в новом доме (чтоб розетка была не за шкафом, и чтобы телевизор не выключался, когда кто-нибудь включает душ). &lt;/p&gt; &lt;p&gt;Не используйте дорогие материалы (алюминий, медь, и др). Но если нужда в этом все-таки будет, то потрудитесь детально объяснить почему этот материал нельзя заменить на более дешевый.&lt;/p&gt; &lt;p&gt;Надеюсь вы будете использовать последние технологии и идеи при разработке проекта моего дома. Хотя, кухню, пожалуй, давайте сделаем в венецианском стиле IX века.&lt;/p&gt; &lt;p&gt;Чтобы быть уверенным, что вы строите то, что я и моя семья хотим, пожалуйста свяжитесь со всеми членами моей семьи (включая 5ти месячную Мэри) и узнайте у них, чего бы они хотели видеть в нашем новом доме. Моя мама, точно знает, как должен выглядеть наш новый дом, так как она часто нас посещает - раз, а то и два в год. Пожалуйста убедитесь, что вы удовлетворили требования всех членов моей семьи и приняли правильное решение. Но, я оставляю за собой право отменить любое ваше решение, если оно мне не понравиться.&lt;/p&gt; &lt;p&gt;И пожалуйста, не утомляйте меня сейчас деталями. Ваша задача не построить дом, а просто сделать план, нарисовать общую картину так сказать. К примеру, сейчас не время определять цвет паркета. И вот еще, учтите, что моей жене нравиться синий цвет.&lt;/p&gt; &lt;p&gt;Сейчас, также не время покупать какие-либо материалы к постройке дома. Этим займемся когда одобрим план. Надеюсь вы успеете возвести дом в течение 48 часов, после одобрения вашего плана...&lt;/p&gt; &lt;p&gt;И хоть вы сейчас разрабатываете дом для меня, учтите на будущее, что я возможно захочу продать этот дом. Поэтому стоит предусмотреть гибкую конфигурацию дома, на случай если моим покупателям что-то не понравиться.&lt;/p&gt; &lt;p&gt;Вы должны быть восхищены такой уникальной возможностью поработать на меня и используя последние новаторские технологии и материалы построить дом. Я вам предоставляю невероятную свободу в принятии решений для моего дома. Свяжитесь со мной как только закончите разработку плана. &lt;/p&gt; &lt;p&gt;Заранее неуверен в успехе,&lt;/p&gt; &lt;p&gt;Заказчик&lt;/p&gt; &lt;p&gt;P.S.&lt;/p&gt; &lt;p&gt;Моя жена только что мне сказала, что она не согласна с большинством моих инструкций приведенных выше. Ваша задача, как архитектора, решить эту проблему и взять всю ответственность на себя. Если жи вы не можете этого сделать, то я поищу другого &lt;strike&gt;идиота&lt;/strike&gt; архитектора.&lt;/p&gt; &lt;p&gt;P.P.S.&lt;/p&gt; &lt;p&gt;Возможно мне нужен, не дом, а трейлер на колесиках. Пожалуйста ответьте мне, если вы считаете также.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Все вышенаписанное было создано по мотивам схожего &lt;a href="http://blog.wikijava.org/2009/01/04/if-architects-had-to-work-like-software-developers/" target="_blank" rel="nofollow"&gt;романа&lt;/a&gt; и моего личного &lt;a href="http://podlipensky.com/tag/%D0%BE%D0%BF%D1%8B%D1%82.aspx" target="_blank"&gt;опыта&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/4QlcT6I0hD8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/4QlcT6I0hD8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/11/mail-to-architector.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=16323552-156a-48f0-86da-a02b29eb69c1</guid>
      <pubDate>Wed, 11 Feb 2009 09:03:34 +0200</pubDate>
      <category>Управление проектами</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=16323552-156a-48f0-86da-a02b29eb69c1</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=16323552-156a-48f0-86da-a02b29eb69c1</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/11/mail-to-architector.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=16323552-156a-48f0-86da-a02b29eb69c1</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=16323552-156a-48f0-86da-a02b29eb69c1</feedburner:origLink></item>
    <item>
      <title>Скаженi кабани: Повышение производительности в браузерах</title>
      <description>&lt;p&gt;
&lt;a rel="nofollow" href="http://ejohn.org" target="_blank"&gt;John Resig&lt;/a&gt;, создатель &lt;a rel="nofollow" href="http://jquery.com" target="_blank"&gt;JQuery&lt;/a&gt;, совсем недавно провел небольшую &lt;a rel="nofollow" href="http://ejohn.org/blog/talk-performance-improvements-in-browsers/" target="_blank"&gt;презентацию&lt;/a&gt; в Гугле. Темой встречи были улучшения производительности в браузерах(в ближайших релизах), некие новшества в Javascirpt движках, новые способы работы с DOM и изумительные эффекты с помощью CSS стилей. Но обо всем по порядку.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Количество процессов на браузер&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Одним из интереснейших нововведений в IE8 и Chrome стало то, что теперь вкладки разделены на несколько процессов. Это дает огромное преимущество в производительности, так как теперь различные веб страницы могут загружаться и исполняться параллельно, не отнимая машинных ресурсов друг у друга. В тоже время такие браузеры как FF, Opera и более старые версии IE загружают/исполняют несколько страниц в одном процессе (различные страницы выполняются отдельными потоками).
&lt;/p&gt;
&lt;p&gt;
Позвольте я поясню, каким же образом происходит разделение вкладок на процессы в &lt;strong&gt;Internet Explorer 8&lt;/strong&gt;. Но для начала давайте вспомним модель процессов IE7:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_2.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb.png" border="0" alt="image" width="600" height="484" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Как видите, каждое окно браузера (UI Frame) находиться в отдельном процессе. Хотя, надо сказать, тут есть одно исключение - если вы нажмете CTRL+N, то новый UI фрейм создастся в том же процессе. Закладки, расширения браузера (toolbar extensions), вспомагательные объекты и ActiveX контролы находятся в том же процессе, что и UI фрейм. Проблема такой модели в том, что любая фатальная ошибка (например stack overflow) в одной из закладок приведет к закрытию всех закладок в этом процессе. 
&lt;/p&gt;
&lt;p&gt;
Рассмотрим модель процессов в IE8:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_4.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb_1.png" border="0" alt="image" width="677" height="522" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
В новом браузере изменилось лишь месторасположение UI фрейма соответствующих ресурсов. Со стороны пользователя это будет выглядеть вот так:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_6.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb_2.png" border="0" alt="image" width="460" height="294" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
И так как закладки изолированы от UI фрейма, то фатальная ошибка в одной из закладок приведет к закрытию всех закладок в этом процессе, но &lt;strong&gt;окно браузера останется открытым&lt;/strong&gt;. Зачем нам это нужно? А для того, чтобы браузер (UI Frame) имел возможность восстановить закрытые вкладки. Но вернемся к разделению вкладок на процессы. Как вы наверное уже успели заметить закладки разделяются на процессы по принципу принадлежности к одной из моделей безопасности (medium IL или low IL). Это накладывало некоторые ограничения на процесс(окно браузера) и когда вы, например, открыли Интранет страницу в одной вкладке, а затем пытались открыть Интернет страницу в другой, то браузер вам сообщал: &amp;quot;Internet Explorer needs to display this webpage in a new window&amp;quot;. Это происходило по той причине, что данный процесс(а следовательно и данное окно браузера) имело определенные security-ограничения в отношении страниц, которые он отображал. Теперь, вы можете открывать страницы &lt;strong&gt;с разными уровнями безопасности в одном окне&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Боюсь ввести вас в заблуждение, что и &lt;strong&gt;Chrome&lt;/strong&gt; работает по тому же принципу, что и IE 8 (раз эта фича была объявлена для обоих браузеров в одном предложении ранее). Поэтому вкратце расскажу как это происходит в гугловом браузере.
&lt;/p&gt;
&lt;p&gt;
Chrome создает три типа процессов:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Браузер. &lt;/strong&gt;Существует только один процесс браузера, который управляет закладками, окнами и &amp;quot;хромированием&amp;quot; внешнего вида. Этот процесс также ответственен за операции с диском, сетью, пользовательским вводом.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Отрисовщик (Renderer).&lt;/strong&gt; Прости господи меня за такой перевод, но этот тип процессов действительно отвечает за обработку HTML, Javascript, CSS, картинок и много чего еще.&amp;nbsp; Причем эти процессы не имеют доступа ни к вашему диску, ни к сетевым ресурсам. Все взаимодействия с пользователем, а также отрисовка на дисплее лежит на процессе типа Браузер. Такое разделение на процессы позволяет сразу убивать подозрительные процессы, которые могли быть подвержены различного рода атакам.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Плагины.&lt;/strong&gt; Процесс браузера также создает по одному процессу для каждого типа плагина: Flash, Quicktime, Adobe Reader и тп. 
&lt;/p&gt;
&lt;p&gt;
Все эти процессы можно увидеть в собственном Chrome Task Managar&amp;#39;e:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_8.png"&gt;&lt;img style="border-width: 0px" src="http://www.podlipensky.com/image.axd?picture=WindowsLiveWriter/i_9E10/image_thumb_3.png" border="0" alt="image" width="244" height="136" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Как только Chrome создал процесс типа Браузер, он начинает создавать по одному процессу типа Отрисовщик для каждого веб-сайта, который вы посещаете. Но тут тоже не все так просто, как кажется на первый взгляд. Ведь создавать такое количество процессов было бы весьма расточительно, учитывая то, что создание процесса это весьма трудоемкая и ресурсоемкая операция. Поэтому, если вы открываете новую закладку используюя JavaScript, или если вы открываете страницу с того же сайта, но в новой закладке, то эти закладки будут находиться в одном процессе (типа Отрисовщик). Это позволяет этим страницам на разных вкладках общаться посредством JavaScript и разделять общие закэшированные объекты. Но даже при таком подходе в группировке вкладок в процессы, существует риск создать слишком много процессов и &amp;quot;повесить&amp;quot; систему. Поэтому разработчики ввели ограничение на количество процессов, это число зависит от ресурсов вашей машины, но в среднем оно не превышает 20.
&lt;/p&gt;
&lt;p&gt;
Процессы типа Плагин создаются сразу как только вы открыли страницу, нуждающуюся в этом плагине. И убивает этот процесс, вскоре после того как вы закрыли последнюю страницу, использующую этот плагин.
&lt;/p&gt;
&lt;p&gt;
Мда...хотел написать обзорный пост о презентации, а получился обзорный пост о распределении закладок по процессам в браузерах... Ладно, не буду превращать этот пост в руководство по написанию эффективных веб приложений. Дам лишь ссылки на &lt;a rel="nofollow" href="http://www.youtube.com/watch?v=13-3VMzfU3Y" target="_blank"&gt;видео презентации&lt;/a&gt; и ее &lt;a rel="nofollow" href="http://www.slideshare.net/jeresig/performance-improvements-in-browsers-presentation" target="_blank"&gt;слайды&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Остальные интересности и вкусности этой презентации я постараюсь осветить в ближайшем светлом будущем.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Полезные ссылки&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blogs.msdn.com/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx" target="_blank"&gt;IE8 and Loosely-Coupled IE (LCIE)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blogs.msdn.com/ie/archive/2008/07/28/ie8-and-reliability.aspx" target="_blank"&gt;IE8 and Reliability&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blogs.msdn.com/ieru/archive/2008/10/14/ie8.aspx" target="_blank"&gt;Группировка вкладок в IE8&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a rel="nofollow" href="http://blog.chromium.org/2008/09/multi-process-architecture.html" target="_blank"&gt;Multi-process Chrome Architecture&lt;/a&gt;
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/-tpi4jXm240" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/-tpi4jXm240/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/10/browser-performance-improvement.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</guid>
      <pubDate>Tue, 10 Feb 2009 09:01:00 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/10/browser-performance-improvement.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=83a7edc4-b5e7-4c81-a634-54e84f9aa936</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=83a7edc4-b5e7-4c81-a634-54e84f9aa936</feedburner:origLink></item>
    <item>
      <title>NHaml. Что это такое и с чем его едят.</title>
      <description>&lt;p&gt;&lt;strong&gt;NHaml&lt;/strong&gt; это .NET реализация популярного &lt;a href="http://rubyonrails.com/" target="_blank" rel="nofollow"&gt;Rails Haml&lt;/a&gt;. Поэтому, сначала давайте попробуем понять что такое &lt;a href="http://ru.wikipedia.org/wiki/Haml" target="_blank" rel="nofollow"&gt;Haml&lt;/a&gt;. Расшифровывается он как &lt;strong&gt;XHTML Abstraction Markup Language&lt;/strong&gt;, то есть это язык разметки для упрощёной генерации &lt;a href="http://ru.wikipedia.org/wiki/XHTML"&gt;XHTML&lt;/a&gt;. В нашем арсенале уже имеются средства для достижения подобных целей: XSLT, ASP.NET Web Forms или даже лучше ASP.NET MVC и др. NHaml предоставляет альтернативный способ построения разметки ваших страниц, причем если сам XHTML весьма многословный язык, то NHaml пронизан духом лаконичности. Сокращения, ключевые слова, обозначение блоков — все направлено на сокращение объема кода при максимальном сохранении его ясности. Давайте рассмотрим следующий кусок кода:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;ASP.NET MVC (винегрет из кода и html)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeBehind="List.aspx" Inherits="MvcApplication5.Views.Products.List" Title="Products" %&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Content&lt;/span&gt; &lt;span style="color: #ff0000"&gt;ContentPlaceHolderID&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"MainContentPlaceHolder"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;runat&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"server"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= ViewData.CategoryName &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt; foreach (var product in ViewData.Products) { &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= product.ProductName &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"editlink"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink("Edit", new { Action="Edit", ID=product.ProductID })&lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt; } &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp; &lt;span style="color: black; background-color: #ffff00"&gt;&amp;lt;%&lt;/span&gt;= Html.ActionLink("Add New Product", new { Action="New" }) &lt;span style="color: black; background-color: #ffff00"&gt;%&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #c71585"&gt;asp&lt;/span&gt;:&lt;span style="color: #800000"&gt;Content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Эту же разметку (причем сохранив логику ее построения) можно написать и так:&lt;/p&gt; &lt;p&gt;&lt;strong&gt;NHaml&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;%h2= ViewData.CategoryName
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;%ul
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;  - &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (var product &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; ViewData.Products)
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    %li
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      = product.ProductName 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      .editlink
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;        = Html.ActionLink("&lt;span style="color: #8b0000"&gt;Edit&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { Action="&lt;span style="color: #8b0000"&gt;Edit&lt;/span&gt;", ID=product.ProductID })
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;= Html.ActionLink("&lt;span style="color: #8b0000"&gt;Add New Product&lt;/span&gt;", &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; { Action="&lt;span style="color: #8b0000"&gt;New&lt;/span&gt;" })&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Как видите, количество кода несколько уменьшилось. Но тут не все так просто. Во-первых, блоки в NHaml обозначаются с помощью отступов, аналогично Python. Т.е. следующий фрагмент кода&lt;/p&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;%one
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    %two
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      %three Hey there&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;преобразуется в &lt;/p&gt;&lt;pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;one&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;two&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;      &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;three&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Hey there&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;three&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;    &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;two&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #ffffff"&gt;  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;one&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Можно по-разному относиться к Python’овскому стилю обозначения блоков, но нельзя не признать, что этот способ гораздо удачнее, чем закрывающие теги, используемые в HTML. Во-вторых, первый символ (не считая отсупов) может описывать способ обработки этой строки. К примеру, символ &lt;strong&gt;"%" &lt;/strong&gt;указывает на то, что это XHTML тег. Эти директивы называются &lt;strong&gt;правилами разметки&lt;/strong&gt; и почти совпадают с &lt;a href="http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html" target="_blank" rel="nofollow"&gt;подобными правилами&lt;/a&gt; в родном Haml. Радует и то, что практически все директивы состоят из одного символа (%, =, -, ., #) и во многом похожи(по назначению) на аналогичные CSS директивы, что упрощает освоение языка. А любители верстки div-ами могут наслаждаться тем, что div является тегом по умолчанию, например #header и %div#header - одно и тоже.&lt;/p&gt;
&lt;p&gt;Практически на всех веб-проектах от четверти до половины строк кода приходится на HTML-код. Даже с учетом того, что HTML писать проще, чем программный код, можно предположить, что до трети времени будет уходить на создание и отладку шаблонов. Следовательно, за счет использования качественного языка генерации HTML можно выиграть немало времени. В некоторых проектах созданием HTML-кода занимаются отдельные люди, работающие на стыке программирования и веб-дизайна. Для них потенциальный выигрыш будет еще выше. 
&lt;p&gt;Таким образом, проблема продуктивного создания &lt;strong&gt;HTML-кода&lt;/strong&gt; является одной из ключевых проблем повышения продуктивности веб-разработки вообще. Не уверен, что NHaml сейчас имеет смысл использовать в коммерческих проектах, так как это еще молодая технология (родилась она где-то в 2007 году). И, как свойственно молодым технологиям (тому же Silverlight), Nhaml довольно радикально меняется от версии к версии. Но, тем не менее, я полагаю, что существует четкая тенденция развития языков разметки в сторону упрощения чтения и редактирования человеком. И хотя, предсказание будущего — штука неблагодарная, особенно в области высоких технологий, осмелюсь сделать ставку на эту (или весьма похожую) технологию построения разметки страниц. 
&lt;p&gt;&lt;strong&gt;Полезные ссылки&lt;/strong&gt; 
&lt;p&gt;&lt;a href="http://weblogs.asp.net/mirvodasergey/archive/2008/06/02/introducing-monorail-nhaml.aspx" target="_blank" rel="nofollow"&gt;Introducing MonoRail NHAML&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.brianhartsock.com/2009/01/15/using-nhaml-from-source/" target="_blank" rel="nofollow"&gt;Using NHaml, from Source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-35-use-the-nhaml-view-engine.aspx" target="_blank" rel="nofollow"&gt;Use the NHaml View Engine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://andrewpeters.net/" target="_blank" rel="nofollow"&gt;Блог одного из разработчиков этой технологии&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/muG3zI9vD6U" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/muG3zI9vD6U/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/08/Nhaml-introduction.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</guid>
      <pubDate>Sun, 08 Feb 2009 23:17:17 +0200</pubDate>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/08/Nhaml-introduction.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=22dd5d49-bd7e-44f9-83bb-ef4e4023f2bc</feedburner:origLink></item>
    <item>
      <title>Как отключить JQuery анимацию одним ударом</title>
      <description>&lt;p&gt;
Вчера набрел на настройку &lt;strong&gt;jQuery.fx.off&lt;/strong&gt; в соотв. &lt;a rel="nofollow" href="http://docs.jquery.com/Effects/jQuery.fx.off" target="_blank"&gt;документации&lt;/a&gt;. Эта штука позволяет отключить любую анимацию jQuery на всей странице. Выглядит это примерно так:
&lt;/p&gt;
&lt;div id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:5822b95a-ab1d-45f8-9884-d0925a0a82f7" class="wlWriterSmartContent" style="margin: 0px; padding: 0px; display: inline; float: none"&gt;
&lt;pre style="overflow: auto; background-color: White; font-size: 1.5em"&gt;
&lt;div&gt;
&lt;span style="color: #000000"&gt;jQuery.fx.off &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;;&lt;br /&gt;
$(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;input&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;).click(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;&lt;span style="color: #000000"&gt;(){&lt;br /&gt;
$(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;div&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;).toggle(&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;slow&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;);&lt;br /&gt;
}); &lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;
&lt;/div&gt;
&lt;p&gt;
После нажатия на кнопочку, ваш div появиться/спрячется незамедлительно, без какой либо анимации.
&lt;/p&gt;
&lt;p&gt;
Понадобиться этот ловкий прием может, если вы имеете дело с &amp;quot;тормознутым&amp;quot; клиентом. И ваша страница вместо анимаций показывает слайд-шоу.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/podlipensky/~4/3XjErPjS7g8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/podlipensky/~3/3XjErPjS7g8/post.aspx</link>
      <author>paul.nospam@nospam.podlipensky.com (Подлипенский Павел)</author>
      <comments>http://www.podlipensky.com/post/2009/02/06/d09ad0b0d0ba-d0bed182d0bad0bbd18ed187d0b8d182d18c-JQuery-d0b0d0bdd0b8d0bcd0b0d186d0b8d18e-d0bed0b4d0bdd0b8d0bc-d183d0b4d0b0d180d0bed0bc.aspx#comment</comments>
      <guid isPermaLink="false">http://www.podlipensky.com/post.aspx?id=f0822750-4efd-4fda-8841-703199bbf627</guid>
      <pubDate>Fri, 06 Feb 2009 09:04:00 +0200</pubDate>
      <category>JQuery</category>
      <dc:publisher>Подлипенский Павел</dc:publisher>
      <pingback:server>http://www.podlipensky.com/pingback.axd</pingback:server>
      <pingback:target>http://www.podlipensky.com/post.aspx?id=f0822750-4efd-4fda-8841-703199bbf627</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.podlipensky.com/trackback.axd?id=f0822750-4efd-4fda-8841-703199bbf627</trackback:ping>
      <wfw:comment>http://www.podlipensky.com/post/2009/02/06/d09ad0b0d0ba-d0bed182d0bad0bbd18ed187d0b8d182d18c-JQuery-d0b0d0bdd0b8d0bcd0b0d186d0b8d18e-d0bed0b4d0bdd0b8d0bc-d183d0b4d0b0d180d0bed0bc.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.podlipensky.com/syndication.axd?post=f0822750-4efd-4fda-8841-703199bbf627</wfw:commentRss>
    <feedburner:origLink>http://www.podlipensky.com/post.aspx?id=f0822750-4efd-4fda-8841-703199bbf627</feedburner:origLink></item>
  </channel>
</rss>
