<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkcMRnk7fSp7ImA9WhRUEEo.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634</id><updated>2012-01-20T06:34:47.705-08:00</updated><category term="domain name" /><category term="Block contacts from Google Chat" /><category term="ASP.NET" /><category term="criteria" /><category term="pop3" /><category term="test" /><category term="RSS" /><category term="ActionScript3" /><category term="Dynamic HTML" /><category term="GoogleChatList" /><category term="Google account" /><category term="gallary image" /><category term="Google API" /><category term="performance" /><category term="SyntaxHighlighter" /><category term="404 error" /><category term="FireFox" /><category term="Jump Break" /><category term="lazy load" /><category term="resize image" /><category term="HSE{10K}" /><category term="OpenId" /><category term="MySQL" /><category term="CSS" /><category term="GoogleChat" /><category term="example" /><category term="Opera" /><category term="Google chat" /><category term="Gmail" /><category term="utf-8" /><category term="google analytics tracking" /><category term="рекламные ссылки" /><category term="django" /><category term="Blogger" /><category term="flex" /><category term="Google Analytics" /><category term="text" /><category term="google code" /><category term="BlockContactsFromGoogleChat" /><category term="Eclipse" /><category term="Google Translation Bar" /><category term="self.error" /><category term="clip" /><category term="bliki engine" /><category term="mx.containers.tile" /><category term="Google chat list" /><category term="мнение" /><category term="JavaMail" /><category term="Attached file" /><category term="dynamic load" /><category term="Aptana Studio" /><category term="Python" /><category term="wordWrap" /><category term="gwtwiki" /><category term="smtp" /><category term="wiki" /><category term="jquery tips" /><category term="javascript" /><category term="GoogleTalk" /><category term="Google Translate" /><category term="Feedburner" /><category term="google talk" /><category term="file download" /><category term="Google calendar" /><category term="django tips. django" /><category term="Font" /><category term="reCaptcha" /><category term="Stats" /><category term="django form" /><category term="блог" /><category term="JAX-WS" /><category term="Animation" /><category term="debug" /><category term="hibernate" /><category term="Sphinx" /><category term="soap" /><category term="статистика google" /><category term="ajax" /><category term="async load post" /><category term="django.contrib.comments" /><category term="Java" /><category term="flex-htmlfilter" /><category term="Google App Engine" /><category term="FireBug" /><category term="Google" /><category term="SOAPFault" /><category term="jquery" /><category term="jquery 1.4" /><category term="Google Chrome" /><category term="captcha" /><category term="feature" /><category term="intellisence" /><category term="Ubiquity" /><category term="Escaping characters" /><category term="IE" /><category term="Html" /><category term="Google Buzz" /><category term="django template" /><title>Сказки на ночь</title><subtitle type="html">Данный блог посвящен интересным и полезным вещам в программировании, ведении блога и всем примыкающим темам.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://night-fairy-tales.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/night-fairy-tales" /><feedburner:info uri="night-fairy-tales" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>night-fairy-tales</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/night-fairy-tales" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2Fnight-fairy-tales" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><entry gd:etag="W/&quot;DUYEQ30yeyp7ImA9Wx9UFkw.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2815473429779844793</id><published>2011-02-13T03:53:00.000-08:00</published><updated>2011-02-13T09:11:42.393-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-13T09:11:42.393-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RSS" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title>Добавляем RSS фид на сайт ASP.NET за 5 минут</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jsO2Wu7ef1q9ldPnYhP5xhblK8o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jsO2Wu7ef1q9ldPnYhP5xhblK8o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jsO2Wu7ef1q9ldPnYhP5xhblK8o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jsO2Wu7ef1q9ldPnYhP5xhblK8o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/rss_feed_asp_net.png" width="220px" height="288px"&gt;&lt;/img&gt;&lt;/div&gt;RSS фиды уже давно стали неотъемлемой частью интернета. И к тому же еще очень удобный способ получения новой информации. &lt;br /&gt;
&lt;br /&gt;
Для меня фид больше чем технология, это признак того, буду ли я дальше пользоваться сайтом или нет. 90% всей информации я получаю как раз через них, а если на сайте отсутствует такая возможность, то сайт для меня "уходит в историю".&lt;br /&gt;
&lt;br /&gt;
Разрабатывая сайт на ASP.NET понадобилось внедрить RSS фид, статьи на эту тему либо просто не до конца описывают механизм внедрения, либо вообще имеют программные ошибки. Вот я решил немного пролить свет на эту задачу.&lt;br /&gt;
&lt;br /&gt;
Изобретать велосипед не буду, так что за основу берем &lt;a href="http://aspnetrsstoolkit.codeplex.com/" rel="ext_link"&gt;ASP.NET RSS Toolkit&lt;/a&gt;. Данная библиотека обладает неплохим функционалом, детально смотрим на сайте &lt;a href="http://aspnetrsstoolkit.codeplex.com/" rel="ext_link"&gt;http://aspnetrsstoolkit.codeplex.com/&lt;/a&gt;.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Внедрение Rss фида на сайт&lt;/h2&gt;Для внедрения Rss фида на сайт нам понадобится сделать 4-и действия:&lt;br /&gt;
&lt;br /&gt;
1. Качаем последнюю версию библиотеке ASP.NET RSS Toolkit. &lt;a href="http://aspnetrsstoolkit.codeplex.com/releases/view/3674" rel="ext_link"&gt;ASP.NET RSS Toolkit, Downloads&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
2. Добавляем ссылку на библиотеку RssToolkit.dll в проект (Add reference).&lt;br /&gt;
&lt;br /&gt;
3. Добавляем в проект новый элемент "Generic Handler" (например, RssFeed.ashx, в дальнейшем буду использовать ссылку на класс RssFeed).&lt;br /&gt;
&lt;br /&gt;
4. Наследуем класс RssFeed от RssToolkit.Rss.RssDocumentHttpHandler и переопределяем метод PopulateRss, в котором и будет заполнен объект RSS.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:csharp"&gt;public class RssFeed : RssDocumentHttpHandler
{
    protected override void PopulateRss(string rssName, string userName)
    {
        Rss.Channel = new RssChannel();
        Rss.Version = &amp;quot;2.0&amp;quot;;
        Rss.Channel.Title = &amp;quot;Тестовый RSS фид за 5 минут&amp;quot;;
        if (!string.IsNullOrEmpty(rssName))
        {
            Rss.Channel.Title += &amp;quot; &amp;#39;&amp;quot; + rssName + &amp;quot;&amp;#39;&amp;quot;;
        }
        
        if (!string.IsNullOrEmpty(userName))
        {
            Rss.Channel.Title += &amp;quot; (generated for &amp;quot; + userName + &amp;quot;)&amp;quot;;
        }

        Rss.Channel.PubDate = DateTime.Now.ToString(&amp;quot;R&amp;quot;);
        Rss.Channel.LastBuildDate = DateTime.Now.ToString(&amp;quot;R&amp;quot;); ;
        Rss.Channel.Description = &amp;quot;Тестовый RSS фид за 5 минут&amp;quot;;
        Rss.Channel.Link = &amp;quot;http://localhost/RssFeed.ashx&amp;quot;;

        Rss.Channel.Items = new List&amp;lt;rssitem&amp;gt;();

        var item = new RssItem
                       {
                           Title = &amp;quot;Название...&amp;quot;,
                           Description = &amp;quot;Описание...&amp;quot;,
                           PubDate = DateTime.Now.ToString(&amp;quot;R&amp;quot;),
                           Link = &amp;quot;http://localhost/Default.aspx&amp;quot;
                       };
        Rss.Channel.Items.Add(item);

        item = new RssItem
                   {
                       Title = &amp;quot;Название...&amp;quot;,
                       Description = &amp;quot;Описание...&amp;quot;,
                       PubDate = DateTime.Now.ToString(&amp;quot;R&amp;quot;),
                       Link = &amp;quot;http://localhost/News.aspx&amp;quot;
                   };
        Rss.Channel.Items.Add(item);
    }
}
&lt;/pre&gt;&lt;br /&gt;
Вот и все, переходим на нашу страницу и получаем RSS фид.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Распознавание браузером.&lt;/h2&gt;В ASP.NET RSS Toolkit 2.0.0.0 есть один небольшой баг. Для фида устанавливается Content-Type в значение "text/xml". В этом случае большинство современных браузеров не считают такой контент фидом (в любой rss "читалке" фид будет работать). Исправить это можно поменяв Content-Type на значение "application/rss+xml".&lt;br /&gt;
&lt;br /&gt;
Внес необходимую правку, для скачивания воспользуйтесь следующей ссылкой - &lt;a href="http://cdn.night-fairy-tales.com/nft/sr/RssToolkit.dll" rel="ext_link"&gt;RssToolkit.dll&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2815473429779844793?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/cSjkUNFLZjI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2815473429779844793/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2011/02/rss-aspnet-5.html#comment-form" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2815473429779844793?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2815473429779844793?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/cSjkUNFLZjI/rss-aspnet-5.html" title="Добавляем RSS фид на сайт ASP.NET за 5 минут" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://night-fairy-tales.com/2011/02/rss-aspnet-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEARnwyfCp7ImA9Wx9UFUQ.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-7849697673786746173</id><published>2011-02-13T00:36:00.000-08:00</published><updated>2011-02-13T03:47:27.294-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-13T03:47:27.294-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google API" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>"Периодическая система" Google-а для разработчиков</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/24aWvi7rZzhCq40794MsK8SQhf8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/24aWvi7rZzhCq40794MsK8SQhf8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/24aWvi7rZzhCq40794MsK8SQhf8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/24aWvi7rZzhCq40794MsK8SQhf8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google-api-logo.png" width="300px" height="200px"&gt;&lt;/img&gt;&lt;/div&gt;Сколько продуктов Google для разработчиков вы знаете? А какие API Google вы используете?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Google Data Protocol, Blogger Data API,Gadgets API, Google Apps, Google Desktop APIs, Google Earth API, Google Chrome Frame, Android и т.д.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;При ответе на эти вопросы я бы на долго задумался и, скорей всего, не вспомнил бы и половину.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Не так давно случайно попал на небольшую &lt;b&gt;шпаргалку для разработчиков по продуктам и API Google&lt;/b&gt;. Моя первая ассоциация была с Периодической системой Менделеева (вспомнился школьный плакат 3x3 метра :) ). &lt;i&gt;На текущий момент на странице представлено 96 элементов&lt;/i&gt;!&lt;br /&gt;&lt;br /&gt;Так что переходим на страница &lt;a href="http://code.google.com/intl/ru-RU/more/table/" rel="ext_link"&gt;Google APIs &amp; Developer Products&lt;/a&gt; и пополняем знания! Лучше один раз увидеть, чем сто раз услышать :).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google-api.png" width="625px" height="257px"&gt;&lt;/img&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-7849697673786746173?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/xnfPF3DWRBQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/7849697673786746173/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2011/02/google.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/7849697673786746173?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/7849697673786746173?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/xnfPF3DWRBQ/google.html" title="&quot;Периодическая система&quot; Google-а для разработчиков" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://night-fairy-tales.com/2011/02/google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQCRnY9fSp7ImA9Wx9SE0Q.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2218824330163763319</id><published>2010-10-29T03:12:00.001-07:00</published><updated>2010-12-03T09:46:07.865-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-03T09:46:07.865-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="utf-8" /><category scheme="http://www.blogger.com/atom/ns#" term="django" /><category scheme="http://www.blogger.com/atom/ns#" term="django template" /><title>Как подружить шаблоны Django в кодировке utf-8 c BOM байтами?</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vBCKeb6Qn2grJ0s-yng8Z_ZLzFI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vBCKeb6Qn2grJ0s-yng8Z_ZLzFI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vBCKeb6Qn2grJ0s-yng8Z_ZLzFI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vBCKeb6Qn2grJ0s-yng8Z_ZLzFI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/django_bom.png"/&gt;&lt;/div&gt;При работе с Django шаблонами периодически сталкиваюсь с проблемой, когда в браузере появляются "пробелы"(белые зоны) в дизайне. Первое рассмотрение проблемы, используя &lt;a href="http://getfirebug.com/" rel="ext_link"&gt;FireBug&lt;/a&gt;, заводит в тупик. Свёрстанный макет отображается нормально, а вот та же страница, собранная из нескольких файловых шаблонов в Django имеет при отображении "пробелы". Анализ результирующих html страниц показал, что на "бракованной" странице появляется череда байтов "EF BB BF".&lt;br /&gt;&lt;br /&gt;Небольшое отступление... Череда байтов "EF BB BF", именуемая &lt;b&gt;меткой порядка байтов (&lt;a href="http://ru.wikipedia.org/wiki/BOM" rel="ext_link"&gt;byte order mark, BOM&lt;/a&gt;)&lt;/b&gt;, применяется для обозначения формата UTF-8, хотя к этому формату и неприменимо понятие порядка байтов.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Поиск решений&lt;/h2&gt;Поискав решение проблемы наткнулся на пару топиков:&lt;br /&gt;- &lt;a href="http://code.djangoproject.com/ticket/12301" rel="ext_link"&gt;&lt;b&gt;Template adds extra characters when using utf8 file encoding&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"The first bytes of your header.html file are EF BB BF. That's the UTF-8 encoding of the BOM...It proposes noting, stripping, and relocating the BOM to the front of the ultimately rendered template."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://groups.google.com/group/django-developers/browse_thread/thread/b19bd59d61a688b8/?pli=1" rel="ext_link"&gt;&lt;b&gt;Django Templates and BOM (byte order marks)&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"If I will render page.html output will contain TWO byte order marks:&lt;br /&gt;!UTF_8_BOM!!UTF8_BOM!&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD HTML 4.01&lt;br /&gt;Transitional//EN&amp;quot; ... "&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://stackoverflow.com/questions/1960105/weird-problem-with-django-templates" rel="ext_link"&gt;&lt;b&gt;weird problem with django templates&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"...when templates are being rendered (i guess), in code, right before the doctype, strange character is being placed. I call it "strange" because if I select it, copy it and try to paste nothing is pasted. This "dot" is seen only if I do "view source" in webkit browsers..."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Все решения сводятся к одному - &lt;b&gt;сохраняйте файлы шаблонов в формате UTF-8 без BOM!&lt;/b&gt; :) &lt;i&gt;А что делать, если редактор не позволяет сохранять файлы в кодировке UTF-8 без BOM?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Тут есть несколько решений:&lt;br /&gt;1. Запустить скрипт, который удалит все BOM символы в шаблонах.&lt;br /&gt;2. Использовать обработку шаблонов при загрузке.&lt;br /&gt;&lt;br /&gt;Например, в качестве IDE я использую Eclipse и кодировку UTF-8 для файлов. Ну и вот этот "паршивец" считает своим долгом поместить в каждый файл шаблона BOM байты (поиск решение по отключению этого эффекта не дал результата). А каждый раз запускать скрипт не удобно, так что выбираем второе решение.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Обработка шаблонов для удаления BOM символов при загрузке&lt;/h2&gt;Смотрим какие загрузчики нужно поправить (settings.py):&lt;br /&gt;&lt;pre class="brush:python"&gt;&lt;br /&gt;TEMPLATE_LOADERS = (    'django.template.loaders.filesystem.load_template_source',    'django.template.loaders.app_directories.load_template_source',&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Писать наследников "лень", так что используем &lt;a href="http://mourk.com/blog/2008/02/14/monkey-patching/"&gt;monkey patching&lt;/a&gt;. Пишем небольшую корректирующую функцию :), помещаем ее и инициализацию в файл urls.py.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:python"&gt;&lt;br /&gt;def patch_load_template_source(func):&lt;br /&gt;    def decorator(self, template_name, template_dirs=None):&lt;br /&gt;        item = func(self, template_name, template_dirs)&lt;br /&gt;        //для сравнения, по хорошему, bom байты нужно переводить в ту же кодировку, что и кодировка загруженного файла. опустил этот момент.&lt;br /&gt;        if item[0][:1]==u'\ufeff':&lt;br /&gt;            return (item[0][1:], item[1])&lt;br /&gt;        return item&lt;br /&gt;    return decorator&lt;br /&gt;&lt;br /&gt;//патчим filesystem.Loader&lt;br /&gt;from django.template.loaders import filesystem&lt;br /&gt;filesystem.Loader.load_template_source = patch_load_template_source(filesystem.Loader.load_template_source)&lt;br /&gt;&lt;br /&gt;//патчим app_directories.Loader&lt;br /&gt;from django.template.loaders import app_directories&lt;br /&gt;app_directories.Loader.load_template_source = patch_load_template_source(app_directories.Loader.load_template_source)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ЗЫ: Данный пример не претендует на звание идеального, а лишь демонстрирует рабочую версию одного из решений :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2218824330163763319?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/VAqnzdv-Hq4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2218824330163763319/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/10/django-utf-8-c-bom.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2218824330163763319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2218824330163763319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/VAqnzdv-Hq4/django-utf-8-c-bom.html" title="Как подружить шаблоны Django в кодировке utf-8 c BOM байтами?" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/10/django-utf-8-c-bom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMBRns8eyp7ImA9Wx5bEks.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-5326404820873896441</id><published>2010-10-28T04:07:00.000-07:00</published><updated>2010-10-28T04:14:17.573-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-28T04:14:17.573-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Feedburner" /><title>Новый интерфейс FeedBurner</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gMUPQJhaKZT0SZMHjd3rhJHmbA8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gMUPQJhaKZT0SZMHjd3rhJHmbA8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gMUPQJhaKZT0SZMHjd3rhJHmbA8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gMUPQJhaKZT0SZMHjd3rhJHmbA8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img width="235px" height="43px" src="http://cdn.night-fairy-tales.com/nft/sr/feedburner_0.png"/&gt;&lt;/div&gt;Google добрался и до новой реализации интерфейса для FeedBurner. Анонс об этом можно было прочитать пару дней назад в статье "&lt;a href="http://adsenseforfeeds.blogspot.com/2010/10/your-stats-right-away.html" rel="ext_link"&gt;Your stats, right away"&lt;/a&gt;. Теперь он стал более похож на "привычные интерфейсы Google проектов" :).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Возможности&lt;/h2&gt;На текущий момент есть только две закладки: &lt;br /&gt;&lt;b&gt;1. Сводная&lt;/b&gt; - информация по собщениям, топ постов по кликам и посещаемости, сводная информация по фидам. &lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://cdn.night-fairy-tales.com/nft/sr/feedburner_1.png" rel="ext_link"&gt;&lt;img width="625px" height="397px" src="http://cdn.night-fairy-tales.com/nft/sr/feedburner_1.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Фиды&lt;/b&gt; - детальная информация по каждому фиду (топ постов, топ стран и т.д.)&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://cdn.night-fairy-tales.com/nft/sr/feedburner_2.png" rel="ext_link"&gt;&lt;img width="625px" height="300px" src="http://cdn.night-fairy-tales.com/nft/sr/feedburner_2.png"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Все довольно просто и наглядно. Единственное чего не удалось найти - множество настроек, которые присутствуют в старой версии :(.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Попробуй сейчаc!&lt;/h2&gt;Воспользоваться новой версией интерфейса можно перейдя по ссылке &lt;a target="_blank" href="http://feedburner.google.com/gfb/" rel="ext_link"&gt;http://feedburner.google.com/gfb/&lt;/a&gt; или нажав на кнопку "Try out the NEW (beta) version!" в панели инструментов старой версии интерфейса.&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://cdn.night-fairy-tales.com/nft/sr/feedburner_3.jpg" rel="ext_link"&gt;&lt;img width="625px" height="385px" src="http://cdn.night-fairy-tales.com/nft/sr/feedburner_3.jpg"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-5326404820873896441?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/x3ZML4NQTlg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/5326404820873896441/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/10/feedburner.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/5326404820873896441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/5326404820873896441?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/x3ZML4NQTlg/feedburner.html" title="Новый интерфейс FeedBurner" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/10/feedburner.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4HQ3s5fCp7ImA9Wx5VFEo.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-6625417237856996499</id><published>2010-10-07T11:58:00.000-07:00</published><updated>2010-10-07T11:58:52.524-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-07T11:58:52.524-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="SyntaxHighlighter" /><title>Новые плюшки SyntaxHighlighter 3</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4zFmQIeIPeTvj9gvWEhbGwnwA9M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4zFmQIeIPeTvj9gvWEhbGwnwA9M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4zFmQIeIPeTvj9gvWEhbGwnwA9M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4zFmQIeIPeTvj9gvWEhbGwnwA9M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/syntaxhighlighter3_0.jpg" alt="SyntaxHighlighter 3.0.83"/&gt;&lt;/div&gt;Лето выдалось для меня довольно энергичным и знаменательным. Хотя, с точки зрения моего блога, это было не заметно, а порой казалось, наверное, что он и вовсе умер. Все акценты сместились в сторону реальной жизни, существенная часть времени уделялась как подготовке к своей свадьбе, так и самой свадьбе и все это феерическое действие было завершено отличным отдыхом в теплых краях. Для себя решил, что летнюю программу я выполнил на отлично, так что можно проявить немного творчества :).&lt;br /&gt;
&lt;br /&gt;
2 июля 2010 года была анонсирована &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/"&gt;новая версия SyntaxHighlighter 3.0.83&lt;/a&gt;. В этом небольшом посте хочу немного рассказать про новые возможности и недостатки данной версии.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Динамическая загрузка кистей&lt;/h2&gt;&lt;br /&gt;
Одним из самых привлекательных изменений, которые могут сподвигнуть на переход к 3-й версии, является динамическая загрузка кистей для различных языков. Как раз вот это вот изменение и сподвигло меня написать эту статью.&lt;br /&gt;
&lt;br /&gt;
Для подключение динамической загрузки используйте следующий код:&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;script src=&amp;quot;shCore.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;shAutoloader.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
SyntaxHighlighter.autoloader(
&amp;#39;js jscript javascript  /js/shBrushJScript.js&amp;#39;,
&amp;#39;applescript            /js/shBrushAppleScript.js&amp;#39;);
SyntaxHighlighter.all();
&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;h2&gt;Отсутствие flash-а&lt;/h2&gt;&lt;br /&gt;
Наличие flash-а было обусловлено необходимостью иметь возможность копировать исходный код. При использовании 2-й версии выделение "подсвеченного" текста (больше 1-й строки) и копирования его приводило к добавлению в каждую строчку номер строки.&lt;br /&gt;
&lt;br /&gt;
Пример выделения:&lt;br /&gt;
&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/syntaxhighlighter3_1.jpg" alt="Выделение кода при подсветки кода с использованием SyntaxHighlighter 2"/&gt;&lt;br /&gt;
&lt;br /&gt;
Результат копирования:&lt;br /&gt;
&lt;b&gt;C:\Sphinx&gt;bin\indexer --all&lt;br /&gt;
02 Sphinx 0.9.9-rc1 (r1566)&lt;br /&gt;
03 Copyright (c) 2001-2008, Andrew Aksyonoff&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
В версии 3 проблема решена разделением блоков нумерации и кода.&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/syntaxhighlighter3_2.jpg" alt="Блоки нумерации и кода при использовании SyntaxHighlighter 2"/&gt;&lt;br /&gt;
&lt;br /&gt;
Выделяем необходимую область и копируем (Ctrl-C). Проще простого, а главное интуитивно понятно!&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;"Скрываемые" блоки&lt;/h2&gt;&lt;br /&gt;
Эта возможность позволяет помещать скрытые блоки кода на страницу и отображать их по клику пользователя на тексте. Добавьте атрибут &lt;b&gt;title&lt;/b&gt; к тегам &amp;lt;pre /&amp;gt; или &amp;lt;script /&amp;gt; следующим образом.&lt;br /&gt;
&lt;pre class="brush: xml"&gt;&amp;lt;script type=&amp;quot;syntaxhighlighter&amp;quot; class=&amp;quot;brush: bash&amp;quot; title=&amp;quot;Хочешь посмотреть код, жми тут!&amp;quot;&amp;gt;
C:\Sphinx&gt;bin\indexer --all
Sphinx 0.9.9-rc1 (r1566)
Copyright (c) 2001-2008, Andrew Aksyonoff
&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
В результате будет только фраза "&lt;b&gt;Хочешь посмотреть код, жми тут!&lt;/b&gt;", при клике на которой раскроется контейнер с кодом.&lt;br /&gt;
&lt;h2&gt;Непредвиденное поведение&lt;/h2&gt;&lt;br /&gt;
В данной версии не обошлось и без небольших багов. Возможно будет поправлено в следующих релизах.&lt;br /&gt;
&lt;br /&gt;
Первое. При наведении мышкой на область "подсвеченного" кода &lt;b&gt;иногда возникает почти незаметный эффект прокрутки внутри области, тем самым блокируя прокрутку во всем окне&lt;/b&gt;, что доставляет определенные неудобства :(. Замечено в FireFox 3.6.10.&lt;br /&gt;
&lt;br /&gt;
Второе. Кликает двойным щелчком на область "подсвеченного" кода (происходит выделение всего кода), потом одинарным кликом на любое место той же области и замечаем, что &lt;b&gt;текст всей области стал одноцветный (черный)&lt;/b&gt;. Если убрать курсор(клик за рамками области) с области, то цвета будут отображены снова. Наблюдается в FireFox 3.6.10, Safari 5.0, Chrome 6.0.472.62.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;Добавление SyntaxHighlighter 3 в блог Blogger&lt;/h2&gt;&lt;br /&gt;
Думал упростить данную установку и реализовать виджет в котором бы содержалась вся логика по установке и инициализации SyntaxHighlighter 3. Но после отладки скриптов столкнулся с особенностью реализации виджетов в Blogger. Как оказалось, каждый такой виджет запускается в фрейме, в котором блокируется доступ("удаляются" ссылки) к основной странице :(. Т.е. эффект от этого виджета будет стремится к 0 :). Поэтому заходим в на страницу редактирования шаблона ("Дизайн"-&gt;"Изменить Html"), находим элемент "&lt;b&gt;&amp;lt;/body&amp;gt;&lt;/b&gt;" и вставляем следующий код до этого элемента.&lt;br /&gt;
&lt;pre class="brush:xml"&gt;&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;Stylesheet&amp;quot; href=&amp;quot;http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css&amp;quot;/&amp;gt;
&amp;lt;script src=&amp;quot;http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function path() {
var args = arguments, result = [];
for(var i = 0; i &amp;lt; args.length; i++) {
result.push(args[i].replace(&amp;#39;@&amp;#39;, &amp;#39;http://alexgorbatchev.com/pub/sh/current/scripts/&amp;#39;)); 
}
return result;
}

SyntaxHighlighter.autoloader.apply(null, path(
&amp;#39;applescript            @shBrushAppleScript.js&amp;#39;,
&amp;#39;actionscript3 as3      @shBrushAS3.js&amp;#39;,
&amp;#39;bash shell             @shBrushBash.js&amp;#39;,
&amp;#39;coldfusion cf          @shBrushColdFusion.js&amp;#39;,
&amp;#39;cpp c                  @shBrushCpp.js&amp;#39;,
&amp;#39;c# c-sharp csharp      @shBrushCSharp.js&amp;#39;,
&amp;#39;css                    @shBrushCss.js&amp;#39;,
&amp;#39;delphi pascal          @shBrushDelphi.js&amp;#39;,
&amp;#39;diff patch pas         @shBrushDiff.js&amp;#39;,
&amp;#39;erl erlang             @shBrushErlang.js&amp;#39;,
&amp;#39;groovy                 @shBrushGroovy.js&amp;#39;,
&amp;#39;java                   @shBrushJava.js&amp;#39;,
&amp;#39;jfx javafx             @shBrushJavaFX.js&amp;#39;,
&amp;#39;js jscript javascript  @shBrushJScript.js&amp;#39;,
&amp;#39;perl pl                @shBrushPerl.js&amp;#39;,
&amp;#39;php                    @shBrushPhp.js&amp;#39;,
&amp;#39;text plain             @shBrushPlain.js&amp;#39;,
&amp;#39;py python              @shBrushPython.js&amp;#39;,
&amp;#39;ruby rails ror rb      @shBrushRuby.js&amp;#39;,
&amp;#39;sass scss              @shBrushSass.js&amp;#39;,
&amp;#39;scala                  @shBrushScala.js&amp;#39;,
&amp;#39;sql                    @shBrushSql.js&amp;#39;,
&amp;#39;vb vbnet               @shBrushVb.js&amp;#39;,
&amp;#39;xml xhtml xslt html    @shBrushXml.js&amp;#39;
));

SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Надеюсь, что-то новое и/или полезное вы для себя нашли! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-6625417237856996499?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/GxC5rmTF6a0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/6625417237856996499/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/10/syntaxhighlighter-3.html#comment-form" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/6625417237856996499?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/6625417237856996499?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/GxC5rmTF6a0/syntaxhighlighter-3.html" title="Новые плюшки SyntaxHighlighter 3" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/10/syntaxhighlighter-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YFQXw9fCp7ImA9Wx5WGEs.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2387317041857915136</id><published>2010-09-30T09:38:00.000-07:00</published><updated>2010-09-30T09:45:10.264-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-09-30T09:45:10.264-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sphinx" /><category scheme="http://www.blogger.com/atom/ns#" term="MySQL" /><title>Ошибка при индексации в Sphinx 0.9.9 + MySQL 5.1.47 под Windows XP</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CSlhbybRljp4mmcMh4697rJzqYs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CSlhbybRljp4mmcMh4697rJzqYs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CSlhbybRljp4mmcMh4697rJzqYs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CSlhbybRljp4mmcMh4697rJzqYs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/sphinx.jpg"/&gt;&lt;/div&gt;В очередной раз после переустановки системы решил развернуть проект в котором используется MySQL + Sphinx. Все проходило гладко пока не дошел до индексации данных Sphinx-ом.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Отсутствует libmySQL.dll&lt;/h2&gt;&lt;br /&gt;Запускаем индексацию ("C:\Sphinx&gt;bin\indexer --all") и получаем сообщение &lt;br /&gt;&lt;br /&gt;&lt;b&gt;"This application has failed to start because LIBMYSQL.dll was not found. Re-installing the application may fix this problem."&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Эта проблема решается быстро, просто копируем файл libmySQL.dll из папки установленного MySQL ("c:\Program Files\MySQL\MySQL Tools for 5.0\libmySQL.dll") в папку System32 ("c:\WINDOWS\system32\").&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;"Иной" libmySQL.dll&lt;/h2&gt;&lt;br /&gt;Делаем повторный запуск индексации ("C:\Sphinx&gt;bin\indexer --all") и в этот раз уже получаем другую ошибку:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:bash"&gt;&lt;br /&gt;C:\Sphinx&gt;bin\indexer --all&lt;br /&gt;Sphinx 0.9.9-rc1 (r1566)&lt;br /&gt;Copyright (c) 2001-2008, Andrew Aksyonoff&lt;br /&gt;&lt;br /&gt;using config file './sphinx.conf'...&lt;br /&gt;WARNING: key 'port' is deprecated in ./sphinx.conf line 47; use 'listen' instead.&lt;br /&gt;indexing index 'my_index'...&lt;br /&gt;ERROR: index 'my_index': column number 1 has no name.&lt;br /&gt;total 0 docs, 0 bytes&lt;br /&gt;total 0.033 sec, 0.00 bytes/sec, 0.00 docs/sec&lt;br /&gt;total 0 reads, 0.0 sec, 0.0 kb/read avg, 0.0 msec/read avg&lt;br /&gt;total 0 writes, 0.0 sec, 0.0 kb/write avg, 0.0 msec/write avg&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В этот момент у меня "глаза сильно округлились", так как раньше все работало отлично, а за это время проект не менялся. Сообщение "&lt;b&gt;column number 1 has no name.&lt;/b&gt;" не давало каких-либо зацепок.&lt;br /&gt;&lt;br /&gt;Сокровенный ответ был найден на форуме &lt;a href="http://www.sphinxsearch.com/forum/view.html?id=2724"&gt;http://www.sphinxsearch.com/forum/view.html?id=2724&lt;/a&gt;. &lt;i&gt;Как оказалось, ошибка возникает, если использовать libmySQL.dll из MySQL версии 5.1 и выше.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Скачав libmySQL.dll из версии 5.0.37, сохраняем в папку System32 ("c:\WINDOWS\system32\") и запускаем индексацию. Все отлично работает!&lt;br /&gt;&lt;br /&gt;ЗЫ: &lt;a href="http://downloads.mysql.com/archives.php?p=mysql-5.0&amp;v=5.0.37"&gt;MySQL Database Server 5.0.37&lt;/a&gt;, архив - &lt;a href="http://downloads.mysql.com/archives/mysql-5.0/mysql-noinstall-5.0.37-win32.zip"&gt;mysql-noinstall-5.0.37-win32.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2387317041857915136?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/dhSHdjuv9zg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2387317041857915136/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/09/sphinx-099-mysql-5147-windows-xp.html#comment-form" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2387317041857915136?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2387317041857915136?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/dhSHdjuv9zg/sphinx-099-mysql-5147-windows-xp.html" title="Ошибка при индексации в Sphinx 0.9.9 + MySQL 5.1.47 под Windows XP" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/09/sphinx-099-mysql-5147-windows-xp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEFSH0_eyp7ImA9WxFaEks.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-5787221736110715757</id><published>2010-07-15T01:26:00.000-07:00</published><updated>2010-07-16T00:00:19.343-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-16T00:00:19.343-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="wiki" /><category scheme="http://www.blogger.com/atom/ns#" term="gwtwiki" /><category scheme="http://www.blogger.com/atom/ns#" term="bliki engine" /><title>Расширяем gwtwiki своими тегами</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4ousvdwJWL-7xH4zFIJbhwnknbw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4ousvdwJWL-7xH4zFIJbhwnknbw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4ousvdwJWL-7xH4zFIJbhwnknbw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4ousvdwJWL-7xH4zFIJbhwnknbw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/wiki-wiki.png"/&gt;&lt;/div&gt;gwtwiki - это проект на Java, предоставляющий API, для преобразования Wiki разметки в html. Основан он на движке Bliki engine. &lt;br /&gt;&lt;br /&gt;Несколько полезных ссылок:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Домашняя страница проекта &lt;a rel="ext_link" href="http://code.google.com/p/gwtwiki/"&gt;gwtwiki. Java Wikipedia API (Bliki engine)&lt;/a&gt;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Захотелось попробовать, пожалуста - &lt;a rel="ext_link" href="http://w-i-k-i.appspot.com/"&gt;http://w-i-k-i.appspot.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;API очень простое, но вот документация скудновата. Так как код написан хорошо, то заглянув в исходники, можно разобраться с любым функционалом. Хочу сэкономить ваше время и раcказать как быстро расширить движок своими wiki тегами.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Создание Wiki тег&lt;/h2&gt;&lt;br /&gt;Основой для моего wiki тега возьму NowikiTag. Все что вам нужно, так это переопределить метод renderHTML.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;import info.bliki.htmlcleaner.TagNode;&lt;br /&gt;import info.bliki.wiki.filter.ITextConverter;&lt;br /&gt;import info.bliki.wiki.model.IWikiModel;&lt;br /&gt;import info.bliki.wiki.tags.NowikiTag;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;public class MyTag extends NowikiTag {&lt;br /&gt; &lt;br /&gt; public MyTag(){&lt;br /&gt;  super(&amp;quot;my&amp;quot;);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Override&lt;br /&gt; public void renderHTML(ITextConverter converter, Appendable buf, IWikiModel model) throws IOException {&lt;br /&gt;  &lt;br /&gt;  TagNode node = this;&lt;br /&gt;&lt;br /&gt;  //Список атрибутов, которые присутствуют в теге&lt;br /&gt;  Map&amp;lt;String, String&amp;gt; tagAtttributes = node.getAttributes();&lt;br /&gt;  &lt;br /&gt;  //Контент, который находится внутри тега&lt;br /&gt;  String content = getBodyString();&lt;br /&gt;  &lt;br /&gt;  buf.append(&amp;#39;&amp;lt;p&amp;gt;My wiki tag.&amp;lt;/p&amp;gt;&amp;#39;);&lt;br /&gt;  buf.append(&amp;#39;\n&amp;#39;);&lt;br /&gt;  buf.append(&amp;#39;&amp;lt;p&amp;gt;&amp;#39;+content&amp;lt;/p&amp;gt;);&lt;br /&gt;  buf.append(&amp;#39;\n&amp;#39;);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public boolean isReduceTokenStack() {&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Для того чтобы движок использовал наш wiki тег, необходимо его добавить в конфигурацию. Пишем наш класс конфигурации.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;import info.bliki.wiki.addon.model.AddonConfiguration;&lt;br /&gt;&lt;br /&gt;public class MyConfiguration extends AddonConfiguration {&lt;br /&gt; &lt;br /&gt; static {&lt;br /&gt;  TAG_TOKEN_MAP.put(&amp;quot;my&amp;quot;, new MyTag());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static MyConfiguration DEFAULT_CONFIGURATION = new MyConfiguration();&lt;br /&gt;&lt;br /&gt; public MyConfiguration() {&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Преобразование wiki разметки в html&lt;/h2&gt;&lt;br /&gt;Все кирпичики готовы, теперь можно использовать:&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;import info.bliki.wiki.model.WikiModel;&lt;br /&gt;import info.bliki.wiki.model.Configuration;&lt;br /&gt;&lt;br /&gt;public class Test {&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * @param args&lt;br /&gt;  */&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  WikiModel wikiModel = &lt;br /&gt;            new WikiModel(new MyConfiguration(), &amp;quot;http://www.mywiki.com/wiki/${image}&amp;quot;, &amp;quot;http://www.mywiki.com/wiki/${title}&amp;quot;);&lt;br /&gt;  String htmlStr = wikiModel.render(&amp;quot;This is a simple [[Hello World]] &amp;lt;my&amp;gt;Wow!&amp;lt;/my&amp;gt;&amp;quot;);&lt;br /&gt;  System.out.print(htmlStr);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот и вся магия :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-5787221736110715757?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/cMuWUM-VtYU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/5787221736110715757/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/07/gwtwiki.html#comment-form" title="Комментарии: 1" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/5787221736110715757?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/5787221736110715757?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/cMuWUM-VtYU/gwtwiki.html" title="Расширяем gwtwiki своими тегами" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/07/gwtwiki.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcCSX07fyp7ImA9WxFbFUQ.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-7027129395176741019</id><published>2010-07-05T10:38:00.001-07:00</published><updated>2010-07-08T05:44:28.307-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-08T05:44:28.307-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Stats" /><title>Статистика посещения блога Blogger (Blogger Stats)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZMGODoDAM_Id3Nal_Whrt_NONZs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZMGODoDAM_Id3Nal_Whrt_NONZs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZMGODoDAM_Id3Nal_Whrt_NONZs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZMGODoDAM_Id3Nal_Whrt_NONZs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_stats.png" width="190px" height="286px"/&gt;&lt;/div&gt;Первый летний месяц дал небывалую жару, возможность личного развития и очень много интересной информации. Немного отойду от темы поста и хочу рассказать вам про замечательного мудреца Владимира Довганя. &lt;br /&gt;&lt;br /&gt;Вот уже второй месяц читаю его блог &lt;a rel="ext_link" href="http://www.vdovgan.ru/"&gt;http://www.vdovgan.ru/&lt;/a&gt;. Тему блога в полной мере иллюстрирует заголовок "Мои мысли об успехе, счастье и богатстве". И действительно, на множество своих вопросов я нашел глубокую мудрость. Хочу выразить огромную благодарность Владимиру Довганю! Ну и теперь о самом главном :), о статистики посещения блога. &lt;br /&gt;&lt;br /&gt;После того, как Google приобрел проект blogger.com, было понятно, что сам сервис будет улучшен и появятся новые возможности. И вот сейчас появилась &lt;i&gt;очередная&lt;/i&gt; новая возможность позволяющая просматривать статистику блога Blogger используя "&lt;a href="http://draft.blogger.com" rel="ext_link"&gt;Blogger in Draft&lt;/a&gt;".&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Статистика&lt;/h2&gt;&lt;br /&gt;Для просмотра статистики входим в блог через "Панель инструментов" ("&lt;a href="http://draft.blogger.com" rel="ext_link"&gt;Blogger in Draft&lt;/a&gt;") и смело жмем на новом пункте меню "Статистика". Дальше можно увидеть 4 простых подменю: Обзор, Посты, Источники переходов, Аудитория. Все довольно просто и понятно.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Обзор"&lt;/b&gt;&lt;br /&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_stats_overview.png" width="628px" height="491px"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Посты"&lt;/b&gt;&lt;br /&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_stats_posts.png" width="628px" height="457px"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Источники переходов"&lt;/b&gt;&lt;br /&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_stats_traffic_sources.png" width="628px" height="498px"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;"Аудитория"&lt;/b&gt;&lt;br /&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_stats_audience.png" width="628px" height="449px"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Какие отличия от Google Analytics?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;В своем блоге я использую инструмент &lt;a rel="ext_link" href="https://www.google.com/analytics"&gt;Google Analytics&lt;/a&gt;, который позволяет отлично отслеживать посещаемость, и у многих может возникнуть вопрос: "&lt;b&gt;Чем данная статистика отличается от статистики Google Analytics?&lt;/b&gt;". &lt;br /&gt;&lt;br /&gt;Различия начинаются c того, что статистику они собирают независимо и алгоритмы анализа у них разные. Статистика Blogger в свою очередь имеет очень простой интерфейс, но уступает по множеству возможностей. Правда отображается она в реальном времени, что является неплохим плюсом.&lt;br /&gt;&lt;br /&gt;Для себя я решил, что ее можно использовать как отличный предварительный инструмент анализа. Так что попробуйте ее уже сейчас!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-7027129395176741019?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/1bHPJO7mqdI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/7027129395176741019/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/07/blogger-blogger-stats.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/7027129395176741019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/7027129395176741019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/1bHPJO7mqdI/blogger-blogger-stats.html" title="Статистика посещения блога Blogger (Blogger Stats)" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/07/blogger-blogger-stats.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04FSX4yfip7ImA9WxFXF0Q.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-426666626740901972</id><published>2010-05-25T00:41:00.000-07:00</published><updated>2010-05-25T06:58:38.096-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-25T06:58:38.096-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Font" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>"Каталог шрифтов" или "Как быстро подобать шрифт для сайта/блога"</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jNmy59SzZID2AeA2RbYd4rYyiRs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jNmy59SzZID2AeA2RbYd4rYyiRs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jNmy59SzZID2AeA2RbYd4rYyiRs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jNmy59SzZID2AeA2RbYd4rYyiRs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google_font_directory.png" height="130px" width="240px" /&gt;&lt;/div&gt;Шрифт на сайте или блоге часто играет очень важную стилистическую и композиционную составляющую. А так как каждый творит на свой вкус и цвет, то иногда стандартные шрифты просто не устраивают.
&lt;br /&gt;
&lt;br /&gt;В этом посте хочу рассказать о проекте Google "&lt;b&gt;&lt;a href="http://code.google.com/webfonts" rel="ext_link"&gt;Каталоге шрифтов&lt;/a&gt;&lt;/b&gt;" и о вспомогательном сервисе "&lt;b&gt;&lt;a rel="ext_link" href="http://code.google.com/webfonts/preview"&gt;Просмотрщике шрифтов&lt;/a&gt;&lt;/b&gt;". Используя их вы сможете ответить на вопрос "Как установить шрифт на сайте/блоге?", "Как изменить шрифт на сайте/блоге?" и внедрить эти шрифты в течении 1 минуты. Сразу хочу сказать о том, что, к сожалению, данные шрифты &lt;i&gt;НЕ поддерживают кириллические символы&lt;/i&gt; :(.&lt;link href="http://fonts.googleapis.com/css?family=Tangerine" rel="stylesheet" type="text/css"&gt;
&lt;br /&gt;&lt;div style="font-family: 'Tangerine'; font-size: 80px; left: 50%; top: 50%;"&gt;Making the Web Beautiful!&lt;/div&gt;
&lt;br /&gt;Поддерживается браузерами(по документации):
&lt;br /&gt; - Google Chrome 4.249.4+
&lt;br /&gt; - Mozilla Firefox 3.5+
&lt;br /&gt; - Apple Safari 3.1+
&lt;br /&gt; - Opera 10.5+
&lt;br /&gt; - Microsoft Internet Explorer 6+
&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;
&lt;br /&gt;&lt;h2&gt;Каталог шрифтов&lt;/h2&gt;
&lt;br /&gt;На текущий момент в "&lt;b&gt;&lt;a href="http://code.google.com/webfonts" rel="ext_link"&gt;Каталоге шрифтов&lt;/a&gt;&lt;/b&gt;" присутствует 18 разных экземпляров. Выбор конечно не сильно большой, но имеющиеся уже могут вас порадовать. Для каждого шрифта будет показан пример, подборка символов и описан код для внедрения.
&lt;br /&gt;
&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google_font_directory_3.jpg" height="392" width="600" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Например, для того чтобы написать фразу "Making the Web Beautiful!" необходимо добавить следующий html
&lt;br /&gt;&lt;pre class="brush:xml"&gt;
&lt;br /&gt;&amp;lt;link href='http://fonts.googleapis.com/css?family=Tangerine' rel='stylesheet' type='text/css'&amp;gt;
&lt;br /&gt;&amp;lt;div style="font-family: 'Tangerine'; font-size: 80px"&amp;gt;Making the Web Beautiful!&amp;lt;/div&amp;gt;
&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;h2&gt;Предварительный просмотр шрифтов&lt;/h2&gt;
&lt;br /&gt;Просмотреть и подобрать необходимый параметры шрифта вам поможет "&lt;b&gt;&lt;a rel="ext_link" href="http://code.google.com/webfonts/preview"&gt;Просмотрщик шрифтов&lt;/a&gt;&lt;/b&gt;". Вводите свой текст, выбирает шрифт, задаете параметры и сразу же получаете результат!
&lt;br /&gt;
&lt;br /&gt;Предварительный просмотр текста
&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google_font_directory_1.jpg" height="363" width="600" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Настройка параметров
&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google_font_directory_2.jpg" height="235" width="600" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Код для внедрения
&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/google_font_directory_4.jpg" height="235" width="600" /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;Уложились в минуту?! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-426666626740901972?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/Syr1j9VBH8o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/426666626740901972/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/05/blog-post.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/426666626740901972?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/426666626740901972?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/Syr1j9VBH8o/blog-post.html" title="&quot;Каталог шрифтов&quot; или &quot;Как быстро подобать шрифт для сайта/блога&quot;" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/05/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAEQH4_cCp7ImA9WxFXEUQ.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-556829667374159488</id><published>2010-05-18T04:41:00.000-07:00</published><updated>2010-05-18T09:05:01.048-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-18T09:05:01.048-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><title>Удаляем "Панель навигации"(Navbar) из блога Blogger (blogspot.com)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gXNf3RPorzSXRQKxYJObuNnhimw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gXNf3RPorzSXRQKxYJObuNnhimw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gXNf3RPorzSXRQKxYJObuNnhimw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gXNf3RPorzSXRQKxYJObuNnhimw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img width="300" height="258" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_navbar.jpg"/&gt;&lt;/div&gt;Мой блог "Сказки на ночь" повзрослел немного, 5-го мая ему исполнился первый годок. Желание рассказать и написать про какие-то вещи возникало и до этого, но начал только после того, как столкнулся с проблемой, решение которой не смог найти в интернете.&lt;br /&gt;&lt;br /&gt;Радует то, что блог читают и находят полезные советы для себя. В ближайший год планирую запустить несколько сервисов которые упростят жизнь или программистам, или блогерам. &lt;i&gt;Возможно, вы уже встретили проблему, которую не смогли решить сами и не нашли решения в интернете, то &lt;b&gt;обращайтесь, буду рад помочь&lt;/b&gt;!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;С самого начала выбора платформы Blogger(blogspot.com), как основы для блога, у меня часто возникал вопрос: "Как удалить Панель навигации из блога Blogger?". Обычно каждый гаджет можно удалить войдя в режим редактирования ("Дизайн"-&gt;"Элементы страницы"-&gt;кнопка "Изменить"), но почему-то "Панель навигации" одна из числа "особенных" :(.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img width="600" height="516" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_navbar_1.jpg"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Как оказалось, удалить "Панель навигации" можно довольно простым способом. Для этого переходим в меню "Дизайн"-&gt;"Изменить HTML", находим открывающийся тех body ("&amp;lt;body&amp;gt;") и перед ним добавляем следующий HTML&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;script type='text/javascript'&amp;gt; &lt;br /&gt;&amp;lt;![CDATA[ &lt;br /&gt;&amp;lt;!-- &lt;br /&gt;/*&amp;lt;body&amp;gt;*/ &lt;br /&gt;--&amp;gt; &lt;br /&gt;]]&amp;gt; &lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Жмем "Сохранить шаблон" и на экране будет отображено следующее окно&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img width="600" height="205" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_navbar_2.jpg"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Для окончания удаления "Панель навигации" необходимо нажать "Удалить виджет". Если вам все же захотелось вернуть ее назад, то просто уберите вставленный HTML код из шаблона.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;В старых шаблонах может возникнуть проблема с дизайном, придется шаманить!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Пробуйте и наслаждайтесь!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-556829667374159488?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/aJSyluhZSp8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/556829667374159488/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/05/navbar-blogger-blogspotcom.html#comment-form" title="Комментарии: 13" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/556829667374159488?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/556829667374159488?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/aJSyluhZSp8/navbar-blogger-blogspotcom.html" title="Удаляем &quot;Панель навигации&quot;(Navbar) из блога Blogger (blogspot.com)" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>13</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/05/navbar-blogger-blogspotcom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIARHk_fip7ImA9WxFQFUQ.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-4782257207389038131</id><published>2010-05-11T04:55:00.000-07:00</published><updated>2010-05-11T10:22:25.746-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-11T10:22:25.746-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="HSE{10K}" /><title>Финал конкурса бизнес-проектов HSE{10K}</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/KD9xoLGf6DNdWcevPfF1LmbtsLQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KD9xoLGf6DNdWcevPfF1LmbtsLQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/KD9xoLGf6DNdWcevPfF1LmbtsLQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/KD9xoLGf6DNdWcevPfF1LmbtsLQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/hse10k.jpeg"&gt;&lt;/img&gt;&lt;/div&gt;Апрель выдался отличным месяцем для новых интересных знакомств, новых идей и даже публичных выступлений (первый опыт). Одним из результатов работы стал выход в финал конкурса &lt;a rel="ext_link" href="http://10k.hse-inc.ru/"&gt;HSE{10K}&lt;/a&gt; с идеей проекта MobilQuest. Призовых мест нам не досталось(&lt;i&gt;а так бы постригли одного из участников налысо&lt;/i&gt;), зато мы получили кучу опыта, интересные знакомства и весьма хорошую обратную связь от членов жюри.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Рождение идеи проекта&lt;/h2&gt;&lt;br /&gt;Сама &lt;b&gt;идея проекта MobilQuest&lt;/b&gt; родилась в результате работы на серии курсов "&lt;a rel="ext_link" href="http://timepad.ru/event/1284"&gt;Создание успешного нового бизнеса&lt;/a&gt;", там же сформировалась команда из 6 человек. Дмитрий Репин (Директор по старт-ап проектам СКОЛКОВО, профессор ГУ-ВШЭ, основатель конкурса 'Бизнес инновационных технологий',&lt;br /&gt;создатель программы eXtrepreneurship) и Алексей Николаев (директор академических программ Intel в России) , по моему мнению, справились со своей задаче на все 100%. Программа курсов получилась живой, основной же изюминкой курса была практика. Огромная благодарность создателям и руководителям курса.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Курсы позволили понять некоторые тонкости механизма и обзавестись разносторонней командой.&lt;/i&gt; От нас же требовалось выбрать идею и проработать ее. С самого начала нам хотелось поучаствовать в конкурсе HSE{10K}, да и времени было достаточно, до окончания подачи заявки оставалось 2 месяца. &lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Но как всегда в голове летала масса идей. Долго не могли остановится на той единственной, которую хотелось бы реализовать и которая была бы жизнеспособной. Одной из наших первоначальных ошибок было то, что &lt;b&gt;не все члены команды включились полностью в работу&lt;/b&gt;. Это привело к хаосу в команде, непониманию друг друга, а что самое главное - к плохой проработке идеи.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Осталась 1 неделя&lt;/h2&gt;&lt;br /&gt;За одну неделю до окончания приема заявок на конкурс мы поняли, что хватит рассуждать, пора выбрать ту единственную любимую с которой мы пойдем дальше.&lt;br /&gt;&lt;br /&gt;Каждый день проходили встречи и обсуждения результатов, страсти кипели не на шутку. Встречи в живую ближе к ночи переходили в online, где заканчивались бурными дискуссиями и морем негодования. И вот за 7 минут до окончания мы успели подать заявку.&lt;br /&gt;&lt;br /&gt;Через несколько дней мы получили письмо, о том, что проект MobilQuest вышел в финал. &lt;b&gt;Первое ликование...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Выводы: при встречах необходимо всегда готовить повестку и дополнительные материалы; за каждый участок работы лучше назначить ответственного человека.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;7 дней до конкурса&lt;/h2&gt;&lt;br /&gt;Пожалуй самым важным моментом, который позволил сделать нашу презентацию на порядок лучше, был мастер-класс "Мастерство презентации — путь лидеров" организованный для финалистов конкурса. &lt;i&gt;Отдельное спасибо тренеру Петру Осипову&lt;/i&gt;, который позволил понять тонкости публичных выступлений.&lt;br /&gt;&lt;br /&gt;На этом этапе активизировалась вся команда. Определились с тем, кто будет представлять нас на сцене :). Получилось грамотно распределить задачи, каждый занимался своей частью и высказывал мнение по другим направлениям.&lt;br /&gt;&lt;br /&gt;Презентацию закончили доделывать за 2 часа до начала :).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Выводы: сразу необходимо мотивировать всю команду; прежде чем вступить бой сперва лучше обсудить стратегию (хоть банально звучит, но именно этого не хватало ).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Час X&lt;/h2&gt;&lt;br /&gt;Первым всегда тяжело.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;embed src="http://widget-a6.slide.com/widgets/slideticker.swf" type="application/x-shockwave-flash" quality="high" scale="noscale" salign="l" wmode="transparent" flashvars="cy=lt&amp;il=1&amp;channel=2594073385399280038&amp;site=widget-a6.slide.com" style="width:426px;height:320px" name="flashticker" align="middle"&gt;&lt;/embed&gt;&lt;div style="width:426px;text-align:left;"&gt;&lt;a href="http://www.slide.com/pivot?cy=lt&amp;at=un&amp;id=2594073385399280038&amp;map=1" target="_blank"&gt;&lt;img src="http://widget-a6.slide.com/p1/2594073385399280038/lt_t017_v000_s0un_f00/images/xslide1.gif" border="0" ismap="ismap" /&gt;&lt;/a&gt; &lt;a href="http://www.slide.com/pivot?cy=lt&amp;at=un&amp;id=2594073385399280038&amp;map=2" target="_blank"&gt;&lt;img src="http://widget-a6.slide.com/p2/2594073385399280038/lt_t017_v000_s0un_f00/images/xslide2.gif" border="0" ismap="ismap" /&gt;&lt;/a&gt; &lt;a href="http://www.slide.com/pivot?cy=lt&amp;at=un&amp;id=2594073385399280038&amp;map=F" target="_blank"&gt;&lt;img src="http://widget-a6.slide.com/p4/2594073385399280038/lt_t017_v000_s0un_f00/images/xslide42.gif" border="0" ismap="ismap" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Выводы: идея должна зажечь весь зал; правильное позиционирование залог успеха.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;В очередной раз убеждаюсь, что &lt;b&gt;ЛУЧШЕ ОДИН РАЗ ПОПРОБОВАТЬ, ЧЕМ СТО РАЗ УСЛЫШАТЬ&lt;/b&gt;. Дерзайте и вы добьетесь успехов!&lt;br /&gt;&lt;br /&gt;P.S: Апрель был знаменателен не только этими событиями. На своем блоге сейчас тестирую небольшой проект о котором расскажу вскоре.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-4782257207389038131?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/MsgySL2ehrc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/4782257207389038131/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/05/hse10k.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4782257207389038131?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4782257207389038131?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/MsgySL2ehrc/hse10k.html" title="Финал конкурса бизнес-проектов HSE{10K}" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/05/hse10k.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8GSX89eSp7ImA9WxFXEkg.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-4465351090526262731</id><published>2010-03-12T11:38:00.000-08:00</published><updated>2010-05-18T23:33:48.161-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-18T23:33:48.161-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><title>Изменяем дизайн блога Blogger(blogspot.com)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vHskg_bPzDneEpyZKhziruWihGI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vHskg_bPzDneEpyZKhziruWihGI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vHskg_bPzDneEpyZKhziruWihGI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vHskg_bPzDneEpyZKhziruWihGI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design.jpg"/&gt;&lt;/div&gt;Талант дизайнера явно не в первой десятке моих сильных сторон. И вот, узнав о новом инструменте "&lt;b&gt;Blogger Template Designer&lt;/b&gt;", который был анонсирован на сайте &lt;a href="http://bloggerindraft.blogspot.com/2010/03/blogger-template-designer.html"&gt;Blogger in Draft&lt;/a&gt;, решил его опробовать.&lt;br /&gt;&lt;br /&gt;С первого же знакомства меня поразили доступные шаблоны дизайнов, а самое пожалуй главное, что настраивать их стало намного легче. Хоть и пришлось повозиться с переносом своего дизайна, но результат мне нравится намного больше :). &lt;br /&gt;&lt;br /&gt;Хочу в этом посте рассказать о самом инструменте и о некоторых тонкостях с которыми пришлось столкнутся.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Как войти в Blogger Template Designer?&lt;/h2&gt;&lt;br /&gt;Новый инструмент изменения дизайна "Blogger Template Designer" доступен в версии "Blogger in Draft" о которой я писал ранее в статье "&lt;a href="/2010/02/blogger-blogger-in-draft.html"&gt;Новые возможности Blogger (Blogger in Draft)&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Для доступа к шаблону сперва необходимо зайти в "&lt;a href="http://draft.blogger.com/home"&gt;Панель инструментов Blogger in Draft&lt;/a&gt;" и перейти в меню "Дизайн" необходимого блога.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design1.png"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;При клике на меню "Дизайнер шаблонов" попадем в новый инструмент настройки дизайна.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design2.png" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Возможности инструмента по изменению дизайна&lt;/h2&gt;&lt;br /&gt;Используя новый инструмент, вы сможете получить доступ к следующим сладостям:&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;15 новых шаблонов дизайна&lt;/b&gt; (на мой взгляд очень прикольных, по крайней мере на порядок лучше чем старые!).&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design3.jpg"&gt;&lt;img width="600px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design3.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;- масса высококачественных &lt;b&gt;фоновых картинок и 12 наборов цветовой схемы&lt;/b&gt; блога.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design4.jpg"&gt;&lt;img width="600px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design4.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;- множество &lt;b&gt;макетов расположения колонок в шаблоне&lt;/b&gt;, а самое главное появилась &lt;b&gt;возможность изменить ширину блога и боковой панели&lt;/b&gt;. Раньше для увеличения размера блога приходилось брать бубен побольше и шаманить с разметкой макета.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design5.jpg"&gt;&lt;img width="600px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design5.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design6.jpg"&gt;&lt;img width="600px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design6.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;- в секции "Дополнительно" вы сможете нужным образом настроить некоторые из блоков вашего блога. Разбивка по блокам немного изменилась, и не всегда с первого раза находишь необходимое свойство, но что действительно радует, так это новая секция "&lt;b&gt;Добавить CSS&lt;/b&gt;". FireBug + данная секция позволят с меньшими усилиями преобразить дизайн вашего блога.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;a href="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design7.jpg"&gt;&lt;img width="600px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_template_design7.jpg"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Дополнительные особенности о которых необходимо знать&lt;/h2&gt;&lt;br /&gt;Данный инструмент и шаблоны имеют ряд небольших особенностей:&lt;br /&gt;&lt;br /&gt;- Template Designer точно &lt;b&gt;не поддерживает Internet Explorer 6&lt;/b&gt;. Так посетителей использующих IE 6 на моем блоге всего 2%, то думаю пора ребята проапгрейдить ваш браузер.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Закругление и Тени могут не отображаться в старых версиях браузеров&lt;/b&gt;. Пользователям использующим Opera придется подождать версии 10.5. А кто использует IE7 и IE8 эффекта в дизайнере не получат, но большинство из них будут отображаться на самом блоге.&lt;br /&gt;&lt;br /&gt;- Некоторые &lt;b&gt;гаджеты по разному могут сбоить&lt;/b&gt;, перед применением лучше примените дизайн к тестовому блогу.&lt;br /&gt;&lt;br /&gt;- Перед применением шаблона сохраните старый. Для этого воспользуйтесь функцией "Дизайн"-&gt;"Изменить HTML"-&gt;"Загрузить весь шаблон".&lt;br /&gt;&lt;br /&gt;- В &lt;b&gt;Opera&lt;/b&gt; есть небольшой глюк с фоновым изображением при прокрутки блога вниз. Для исправления добавьте следующий стиль в секцию "Добавить CSS".&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;.body-fauxcolumn-outer {&lt;br /&gt;  height: 100%;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- Если вы хотите &lt;b&gt;изменить фоновое изображение на свое&lt;/b&gt; добавьте следующий стиль.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;.body-fauxcolumn-outer {&lt;br /&gt;  background: url(&lt;Путь к вашему фоновому изображению&gt;) no-repeat fixed center bottom;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Пользуйтесь и наслаждайтесь!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-4465351090526262731?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/Q2zdcGas0Ic" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/4465351090526262731/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/03/bloggerblogspotcom.html#comment-form" title="Комментарии: 6" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4465351090526262731?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4465351090526262731?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/Q2zdcGas0Ic/bloggerblogspotcom.html" title="Изменяем дизайн блога Blogger(blogspot.com)" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>6</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/03/bloggerblogspotcom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQAQHk5fCp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-936624088741562823</id><published>2010-03-10T02:47:00.000-08:00</published><updated>2010-04-23T05:05:41.724-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T05:05:41.724-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><title>Кнопка "Ссылки@Mail.Ru" на Blogger(blogspot.com)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EuCaubHt5VZdP9oLi7CbYFWnQE8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EuCaubHt5VZdP9oLi7CbYFWnQE8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EuCaubHt5VZdP9oLi7CbYFWnQE8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EuCaubHt5VZdP9oLi7CbYFWnQE8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/link_mail_ru.png"/&gt;&lt;/div&gt;Mail.ru реализовала новый сервис &lt;a href="http://share.mail.ru/" rel="ext_link"&gt;Ссылки@mail.ru&lt;/a&gt;. Данный сервис позволяет пользователям Моего Мира@Mail.Ru делиться с друзьями ссылками на страницы с любых сайтов. Ссылки на страницы появляются в потоке "Что нового" пользователя в Моем Мире и у всех его друзей.&lt;br /&gt;&lt;br /&gt;Это мне немного напоминает копипаст тенденций :). Но все же для того, что бы задавать тенденции, нужно сначала иметь возможность воспользоваться текущими. Так что берем на вооружение этот инструмент.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Внедрение кнопки "Ссылки@mail.ru" на сайт&lt;/h2&gt;&lt;br /&gt;Для того что бы добавить кнопку сервиса Ссылки@mail.ru, необходимо внедрить следующий кусок html.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;a class=&amp;quot;mrc__share&amp;quot; href=&amp;quot;http://connect.mail.ru/share&amp;quot;&amp;gt;Поделиться&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;script src=&amp;quot;http://connect.mail.ru/js/api/share.js&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Тут проблем не должно возникнуть.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Добавления кнопки "Ссылки@mail.ru" на блог Blogger (blogspot.com)&lt;/h2&gt;&lt;br /&gt;А вот если вам захотелось добавить такую кнопку на блог Blogger, то необходимо будет воспользоваться расширенным синтаксисом.&lt;br /&gt;&lt;br /&gt;Заходим в редактирование шаблона блога ('Дизайн'-&gt;'Изменить Html'), и установив галку 'Расширить шаблоны виджета', находим секцию&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;b:includable id=&amp;#39;post&amp;#39; var=&amp;#39;post&amp;#39;&amp;gt;&lt;br /&gt;  &amp;lt;div class=&amp;#39;post hentry&amp;#39;&amp;gt;&lt;br /&gt;   //Место для добавления кнопки Ссылки@mail.ru!&lt;br /&gt;   ...&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/b:includable&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Добавляем следующий фрагмент кода&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;div style=&amp;#39;float:right;&amp;#39;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;a class=&amp;#39;mrc__share&amp;#39; expr:href=&amp;#39;&amp;amp;quot;http://connect.mail.ru/share?share_url=&amp;amp;quot; + data:post.url&amp;#39;&amp;gt;Поделиться&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;script src=&amp;#39;http://connect.mail.ru/js/api/share.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Выбор стиля кнопки "Ссылки@mail.ru"&lt;/h2&gt;&lt;br /&gt;Вы можете выбрать нужный вам стиль кнопки. Для этого в теге "а" необходимо задать параметр "type".&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;a class=&amp;quot;mrc__share&amp;quot; type=&amp;quot;button_count&amp;quot; href=&amp;quot;http://connect.mail.ru/share&amp;quot;&amp;gt;Поделиться&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- "&lt;b&gt;big&lt;/b&gt;". &lt;img src="http://cdn.night-fairy-tales.com/nft/sr/link_mail_ru_big.png"/&gt;&lt;br /&gt;- "&lt;b&gt;button_count&lt;/b&gt;" (используется по умолчанию). &lt;img src="http://cdn.night-fairy-tales.com/nft/sr/link_mail_ru_button_count.png"/&gt;&lt;br /&gt;- "&lt;b&gt;button&lt;/b&gt;". &lt;img src="http://cdn.night-fairy-tales.com/nft/sr/link_mail_ru_button.png"/&gt;&lt;br /&gt;- "&lt;b&gt;micro&lt;/b&gt;". &lt;img src="http://cdn.night-fairy-tales.com/nft/sr/link_mail_ru_micro.png"/&gt;&lt;br /&gt;&lt;br /&gt;Детальную информацию можно найти &lt;a href="http://developers.my.mail.ru/wiki/%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B8@Mail.Ru"&gt;в описании Ссылки@Mail.Ru&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-936624088741562823?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/jSwIAqLUAtI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/936624088741562823/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/03/mailru-bloggerblogspotcom.html#comment-form" title="Комментарии: 2" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/936624088741562823?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/936624088741562823?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/jSwIAqLUAtI/mailru-bloggerblogspotcom.html" title="Кнопка &quot;Ссылки@Mail.Ru&quot; на Blogger(blogspot.com)" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>2</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/03/mailru-bloggerblogspotcom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAFQ3s6cSp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-6550351047582260898</id><published>2010-03-07T07:15:00.000-08:00</published><updated>2010-04-23T05:11:52.519-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T05:11:52.519-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Buzz" /><title>Как добавить Google Buzz Feed на свой сайт/блог за 5 мин?</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5A0U72dblpwN5hCKcjPiU8Kavn0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5A0U72dblpwN5hCKcjPiU8Kavn0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5A0U72dblpwN5hCKcjPiU8Kavn0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5A0U72dblpwN5hCKcjPiU8Kavn0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img width="300px" src="http://cdn.night-fairy-tales.com/nft/sr/google-buzz-widget.png"/&gt;&lt;/div&gt;В одном из постов я уже писал про то, как можно добавить кнопку Google Buzz в свой блог. Но, как всегда, когда есть возможность написать про пост в своем Google Buzz, то и хочется иметь возможность так же отобразить ленту из Google Buzz. Сейчас хочу описать как можно добавить такой фид на свой сайт.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Подключаем Google Buzz Feed&lt;/h2&gt;&lt;br /&gt;Чтобы добавить Google Buzz Feed на свой сайт, воспользуемся готовым решением &lt;a href="http://code.google.com/p/google-buzz-widget/"&gt;google-buzz-widget от mikedotmore&lt;/a&gt;. Для этого необходимо выполнить 2 шага:&lt;br /&gt;1. Добавляем скрипты jQuery (выше версии 1.3.2) и google-buzz-widget на страницу.&lt;br /&gt;2. Добавляем инициализацию google-buzz-widget.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://google-buzz-widget.googlecode.com/files/jquery.google-buzz-1.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;   $(document).ready(function(){&lt;br /&gt;      $(&amp;#39;div.my-buzz&amp;#39;).googleBuzz({&lt;br /&gt;         username:&amp;#39;Sergey.Melnichenko&amp;#39;&lt;br /&gt;         ,n:6&lt;br /&gt;         ,show_n:3&lt;br /&gt;      });&lt;br /&gt;   });&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div class=&amp;quot;my-buzz&amp;quot;&amp;gt;loading..&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;где username нужно заменить на ваше имя пользователя Google.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Дополнительные настройки Google Buzz Widget&lt;/h2&gt;&lt;br /&gt;Google Buzz Widget имеет несколько настроек, которыми вы можете воспользоваться:&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;debug&lt;/b&gt; - включает debug режим. Если установить значение в 1, то будут выводиться ошибки. По умолчанию имеет значени 0.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;username&lt;/b&gt; - имя пользователя Google.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;n&lt;/b&gt; - число записей Google Buzz, которое будет запрошено. Максимальное значение 100, по умолчанию 1.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;show_n&lt;/b&gt; - число записей Google Buzz которое будет отображаться на странице. По логике вещей данное число должно быть меньше чем параметр &lt;b&gt;n&lt;/b&gt;. Если данное число установить в 0, то будет отключен режим переходов между отображениями и будет отображаться простой список. По умолчанию данное поле имеет значение 1.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;stay_time&lt;/b&gt; - время отображения записи в миллисекундах . По умолчанию 5000.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;enter_time&lt;/b&gt; - время анимации за которое будет происходить отображение новых записей в миллисекундах. По умолчанию - 200.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;exit_time&lt;/b&gt; - время за которое будут скрыты старые записи при смене в миллисекундах. По умолчанию - 200.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;animate&lt;/b&gt; - какой режим анимации будет при смене записей. Доступны: 'opacity', 'height', 'width', 'fontSize', 'lineHeight'. По умолчанию - 'opacity'.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;header&lt;/b&gt; - Html разметка, которая будет помещена в начало виджета в качестве заголовка.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;snippet&lt;/b&gt; - режим отображения каждой записи. Если установить в 1, то будет отображаться краткое содержание, 0 - полностью запись. По умолчанию - 1.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;show_source&lt;/b&gt; - отображать источник записи (Twitter, Google Reader и т.д.). По умолчанию - 1.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;show_date&lt;/b&gt; - отображать дату записи или нет. По умолчанию - 1&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;info&lt;/b&gt; - Html, в котором находится ссылка на сайт создателя виджета. Можно удалить ее, установив значение данного поля в &lt;b&gt;""&lt;/b&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-6550351047582260898?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/-GZVB5QiC_Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/6550351047582260898/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/03/google-buzz-feed-5.html#comment-form" title="Комментарии: 8" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/6550351047582260898?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/6550351047582260898?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/-GZVB5QiC_Y/google-buzz-feed-5.html" title="Как добавить Google Buzz Feed на свой сайт/блог за 5 мин?" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>8</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/03/google-buzz-feed-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4NSXw8fyp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-9058622432194020587</id><published>2010-03-03T14:03:00.000-08:00</published><updated>2010-04-23T05:16:38.277-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T05:16:38.277-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery tips" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><title>jQuery tips. Часть 2. Советы и уловки</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Dmc5GEoW7jpR3wOfuyBzKDnveoE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dmc5GEoW7jpR3wOfuyBzKDnveoE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Dmc5GEoW7jpR3wOfuyBzKDnveoE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Dmc5GEoW7jpR3wOfuyBzKDnveoE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/jquery-tips.jpg"/&gt;&lt;/div&gt;Серия статей про jQuery немного затянулась :), как всегда какие то другие идеи вытесняют намеченные планы. Попробую осилить 2 статьи из данной серии за неделю, тем более, что и накопилось материала, и появилось немного свободного времени. В этом небольшом посте хотел рассказать про советы и уловки, которые периодически делают жизнь легче :).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Альтернативный путь Document Ready&lt;/h2&gt;&lt;br /&gt;Одной из первых функций с которой я познакомился изучая jQuery, была "$(document).ready". Есть и альтернативный вариант вызова данной функции.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(document).ready(function() {&lt;br /&gt; //document ready&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;//Альтернативный путь, и заметьте, так короче! :)&lt;br /&gt;$(function(){&lt;br /&gt; //document ready&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Используем jQuery для разбора xml(parse xml)&lt;/h2&gt;&lt;br /&gt;Используя jQuery, вы можете с легкостью обрабатывать и манипулировать xml данными. Следующий пример демонстрирует как можно преобразовать xml данные в jQuery объект.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var jquery_xml_parse = $(&amp;quot;&amp;lt;xml&amp;gt;&amp;lt;title&amp;gt;jQuery parse xml&amp;lt;/title&amp;gt;&amp;lt;data&amp;gt;Xml data&amp;lt;/data&amp;gt;&amp;lt;/xml&amp;gt;&amp;quot;);&lt;br /&gt;var data_node = $(&amp;quot;data&amp;quot;, jquery_xml_parse);&lt;br /&gt;var result = data_node.text(); // результат &amp;quot;Xml data&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Экранирование символов используя jQuery&lt;/h2&gt;&lt;br /&gt;jQuery настолько крут, что легко справляется с экранированием символов. Рассмотрим следующий пример.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var htmlString = &amp;quot;&amp;lt;scr&amp;quot;+&amp;quot;ipt&amp;gt;alert(&amp;#39;hi!&amp;#39;);&amp;lt;/scr&amp;quot;+&amp;quot;ipt&amp;gt;&amp;quot;;&lt;br /&gt;$(&amp;quot;#jquery_escape_html&amp;quot;).text(htmlString);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В результате отработки данного скрипта получим HTML&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;jquery_escape_html&amp;quot;&amp;gt;&amp;amp;lt;script&amp;amp;gt;alert(&amp;amp;#39;hi!&amp;amp;#39;);&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;А на экране будет отображен текст: "&lt;b&gt;&amp;lt;script&amp;gt;alert(&amp;#39;hi!&amp;#39;);&amp;lt;/script&amp;gt;&lt;/b&gt;"&lt;br /&gt;&lt;h2&gt;Отложенная загрузка контента&lt;/h2&gt;&lt;br /&gt;Очень прикольно смотрятся сайты в которых некоторые секции загружаются динамически. jQuery позволяет делаеть такие вещи крайне просто.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$('#jquery_page_load').load('content/load_form.html', function() {&lt;br /&gt;    // Код, который будет выполнен после загрузки контента&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Открываем ссылки в новом окне&lt;/h2&gt;&lt;br /&gt;Для того чтобы &lt;b&gt;ссылки открывались в popup окне&lt;/b&gt; добавьте на свою страницу следующий код.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;a.popup_window&amp;#39;).live(&amp;#39;click&amp;#39;, function(){&lt;br /&gt;    newwindow=window.open($(this).attr(&amp;#39;href&amp;#39;),&amp;#39;&amp;#39;,&amp;#39;height=200,width=150&amp;#39;);&lt;br /&gt;    if (window.focus) { newwindow.focus(); }&lt;br /&gt;    return false;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Теперь, при клике на ссылку у которой будет установлен класс "popup", страница будет открыта в popup окне.&lt;br /&gt;&lt;br /&gt;Если вам необходимо чтобы &lt;b&gt;ссылки открывались в новом табе&lt;/b&gt;, то воспользуйтесь следующим кодом.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery('a.tab').live('click', function(){&lt;br /&gt;    jQuery(this).attr("target","_blank");&lt;br /&gt;    return true;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;События&lt;/h2&gt;&lt;br /&gt;&lt;b&gt;Пространство имен при работе с событиями&lt;/b&gt;&lt;br /&gt;С версии 1.2 в событиях появилась возможность задавать пространство имен. Для добавление имени в операторе bind после имени события через точку можно указать пространство имен. Данный механизм будет удобен при работе в модулях, в случае когда необходимо удалить все обработчики событий текущего модуля. Рассмотрим это на примере&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$("a").bind("click.event_tracking", function(){&lt;br /&gt;  //ваш код&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$("a").bind("click.animation", function(){&lt;br /&gt;  //ваш код&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$("a").unbind(".event_tracking");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;При необходимости пользуйтесь своими типами событий&lt;/b&gt;&lt;br /&gt;Используя jQuery можно создавать свои типы событий, которые будет привязаны к определенным DOM элементам. При использовании таких событий, код получается более чистым, и можно убрать жесткие связи между модулями.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;//Добавления обработчика события "custom_event"&lt;br /&gt;$("p").bind("custom_event", function(e, count) {&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;//Вызов события&lt;br /&gt;$("p").trigger("custom_event", [ 5 ]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Определяем позицию курсора&lt;/h2&gt;&lt;br /&gt;Если вам необходимо отслеживать позицию курсора, то можно воспользоваться следующим примером.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$().mousemove(function(e){  &lt;br /&gt;    //Записываем координату x и y в элемент с идентификатором "cursor_position"&lt;br /&gt;    $('#cursor_position').html("X: " + e.pageX + "; Y:" + e.pageY + ".");&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Как получить координаты DOM элемента?&lt;/h2&gt;&lt;br /&gt;С помощью jQuery получить координаты DOM элемента очень просто. Используйте следующий код:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var сe = $("#сoordinate_element");&lt;br /&gt;var left_offset_position = сe.offset().left; //это координата left&lt;br /&gt;var top_offset_position = сe.offset().top; //это координата top&lt;br /&gt;var right_offset_position = сe.offset().left+сe.width(); //это координата right&lt;br /&gt;var bottom_offset_position = сe.offset().top + сe.height(); //это координата bottom&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Как определить какую кнопку нажали?&lt;/h2&gt;&lt;br /&gt;Если вам необходимо отслеживать какую кнопку нажали, то воспользуйтесь следующим примером.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(function() {&lt;br /&gt;    $(document).keypress(function(e){&lt;br /&gt;        //e.which содержит код нажатой кнопки&lt;br /&gt;        switch(e.which){&lt;br /&gt;            // "ENTER"&lt;br /&gt;            case 13:&lt;br /&gt;                alert('enter pressed');&lt;br /&gt;            break;&lt;br /&gt;&lt;br /&gt;            // "s"&lt;br /&gt;            case 115:&lt;br /&gt;                alert('s pressed');&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Возврат к началу страницы&lt;/h2&gt;&lt;br /&gt;В случаях, когда материал на страницах больше чем несколько экранов, стоит задуматься о возможности перехода к началу страницы. Используя jQuery и плагин &lt;a href="http://plugins.jquery.com/project/ScrollTo"&gt;jQuery.ScrollTo&lt;/a&gt; реализация такого возврата занимает минимум времени.&lt;br /&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;js/jquery.scrollTo-min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;......  &lt;br /&gt;&amp;lt;a id=&amp;quot;top&amp;quot; style=&amp;quot;cursor:hand;cursor:pointer&amp;quot;&amp;gt;Вверх!&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$('#go_top').click(function() {  &lt;br /&gt;    $(document).scrollTo(0,500);  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Используйте клонирование для создания элементов&lt;/h2&gt;&lt;br /&gt;Для создания DOM элементов максимально используйте метод jQuery ".clone".&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;// клонируем элемент с идентификатором "cloneHtmlElement"&lt;br /&gt;var cloned = $('#cloneHtmlElement').clone();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;К сожалению, данный метод не клонирует JavaScript объекты. Для этого можно воспользоваться следующим кодом:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;// Simple clone&lt;br /&gt;var clone_object = jQuery.extend({}, source_object);&lt;br /&gt;&lt;br /&gt;// Deep clone&lt;br /&gt;var clone_object1 = jQuery.extend(true, {}, source_object);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simple clone - клонирование всех свойств объекта, исключая сложные свойства.&lt;br /&gt;Deep clone - рекурсивное клонирования всех свойств объекта.&lt;br /&gt;&lt;h2&gt;Проверка элемента на соответствие&lt;/h2&gt;&lt;br /&gt;Селекторы в jQuery являются одной из самых сильных сторон. Используя их, можно не только выбрать необходимые элементы, но и проверить уже имеющийся элемент на соответствие селектору.&lt;br /&gt;&lt;br /&gt;Возьму банальный пример, который демонстрирует всю мощь механизма. Определим является элемент видимым или нет.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;if($(element).is(":visible")) {&lt;br /&gt;       //элемент видимый УРА (Visible!)&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Жизнь стала легче? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-9058622432194020587?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/p1vdBnWw2Fs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/9058622432194020587/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/01/jquery-tips-2.html#comment-form" title="Комментарии: 5" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/9058622432194020587?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/9058622432194020587?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/p1vdBnWw2Fs/jquery-tips-2.html" title="jQuery tips. Часть 2. Советы и уловки" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>5</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/01/jquery-tips-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UBRnw6eCp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-4925781938072697802</id><published>2010-02-12T09:52:00.001-08:00</published><updated>2010-04-23T05:20:57.210-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T05:20:57.210-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Buzz" /><title>Добавляем кнопку Google Buzz в свой блог Blogger(blogspot.com)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JHsrjemldXNHM1OIe_oznmrwzNU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JHsrjemldXNHM1OIe_oznmrwzNU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JHsrjemldXNHM1OIe_oznmrwzNU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JHsrjemldXNHM1OIe_oznmrwzNU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/buzz.png"/&gt;&lt;/div&gt;Совсем недавно Google анонсировал выход нового продукта "&lt;a rel="ext_link" href="http://www.google.com/buzz"&gt;Google Buzz (Google Живая Лента)&lt;/a&gt;". Направление на проекты с социальным уклоном Google взял уже давно, а данный сервис еще одна из таких социальных реализаций. Если вкратце, то суть сервиса "Делись всем со всеми". &lt;br /&gt;&lt;br /&gt;На данный момент уже появилось множество постов о Google Buzz, есть даже ярые противники этого продукта. Некоторые публикации в блогах смахивают на массовую истерию :), в одном из них Google Buzz значился как одна из 5 вещей, которые этот блогер никогда не будет использовать.&lt;br /&gt;&lt;br /&gt;Использовать или не использовать Buzz сервис решать вам,а в этом небольшом посте хотел лишь описать то, как можно добавить кнопку Google Buzz на ваш блог Blogger(blogspot.com).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для начала необходимо зайти в редактирование шаблона блога ('Дизайн'-&gt;'Изменить Html'), и установить галку 'Расширить шаблоны виджета'. Находим секцию&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;b:includable id=&amp;#39;post&amp;#39; var=&amp;#39;post&amp;#39;&amp;gt;&lt;br /&gt;  &amp;lt;div class=&amp;#39;post hentry&amp;#39;&amp;gt;&lt;br /&gt;   //Место для добавления Google Buzz Button!&lt;br /&gt;   ...&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/b:includable&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;и добавляем следующий Html&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;div style=&amp;quot;float:right;&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;a expr:href=&amp;#39;&amp;amp;quot;http://www.google.com/reader/link?url=&amp;amp;quot; + data:post.url + &amp;amp;quot;&amp;amp;amp;title=&amp;amp;quot; + data:post.title + &amp;amp;quot;&amp;amp;amp;srcURL=&amp;amp;quot; + data:blog.homepageUrl &amp;#39;&amp;gt;&amp;lt;img src=&amp;#39;http://sscaos.googlecode.com/svn/trunk/img/googlebuzz.png&amp;#39;/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Тег div можете убрать, он лишь заставляет кнопку прижаться к правому краю. Сохраняем шаблон и теперь справа у каждого поста будет кнопка "Google Buzz".&lt;br /&gt;&lt;br /&gt;Наслаждайтесь!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-4925781938072697802?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/VLo4vakreHk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/4925781938072697802/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/02/google-buzz-bloggerblogspotcom.html#comment-form" title="Комментарии: 8" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4925781938072697802?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4925781938072697802?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/VLo4vakreHk/google-buzz-bloggerblogspotcom.html" title="Добавляем кнопку Google Buzz в свой блог Blogger(blogspot.com)" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>8</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/02/google-buzz-bloggerblogspotcom.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04ARXo4eip7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-434961404644066399</id><published>2010-02-09T03:07:00.000-08:00</published><updated>2010-04-23T05:32:24.432-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T05:32:24.432-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="domain name" /><title>Новое доменное имя блога</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Bdl_o5fnwX3wSzCcBczIGxHmpY0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bdl_o5fnwX3wSzCcBczIGxHmpY0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Bdl_o5fnwX3wSzCcBczIGxHmpY0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Bdl_o5fnwX3wSzCcBczIGxHmpY0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/domain_name.png"/&gt;&lt;/div&gt;На прошлой неделе назрел вопрос о смене домена. Не то чтобы такой вопрос не возникал раньше, просто не видел существенных аргументов в пользу смены домена. Аргумент "Так круто!" не имел, да и не имеет для меня значения :). &lt;br /&gt;&lt;br /&gt;Но вот у меня появилась нормальная аргументация (о ней чуть дальше) и &lt;b&gt;блог "Сказки на ночь" переехал на новый домен &lt;a href="http://night-fairy-tales.com/"&gt;http://night-fairy-tales.com/&lt;/a&gt;&lt;/b&gt;. Сразу прошу прощения у всех пользователей, которые при этом ощутили какие-либо неудобства.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Как затронут данные изменения читателей блога?&lt;/h2&gt;&lt;br /&gt;Так как я не менял движок блога и оставил его на Blogger(blogspot.com), то на данный момент &lt;b&gt;никаких изменения для читателей почти не произойдет&lt;/b&gt;. Если вы были "Постоянными читателями" блога, то вы ими и останетесь. Если вы читали RSS ленту, то ничего менять вам не придется, адрес RSS ленты останется старым (связано с особенностями FeedBurner :) ).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Зачем менять домен?&lt;/h2&gt;&lt;br /&gt;Движок Blogger(blogspot.com) имеет некоторые недостатки и приходится или искать обходные пути, или мириться с ними в надежде, что программисты расщедрятся и исправят их :). &lt;br /&gt;&lt;br /&gt;Если же вы используете бесплатный хостинг Blogger, то придется потакать всем причудами этого движка всегда. &lt;i&gt;И чем больше времени вы пользуетесь бесплатным хостингом, тем меньше бескровных возможностей сменить движок.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Например, на текущий момент, при смене домена(*.blogspot.com) вы не сможете склеить ваш поисковый ранг Google(PR) или Yandex(ТИЦ). Для Google нужно указать в "Инструменты для веб-мастеров" для сайта "Изменение адреса", но сделать это можно исключительно для доменов корневого уровня, или вернуть страницу со статусом 301 c указанием на новый домен. Для Yandex необходимо в файле robots.txt добавить строчку "host: domain.zone". В Blogger нельзя реализовать ни один из перечисленных вариантов :(.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Особенности публикации блога Blogger(blogspot.com) на персональном домене&lt;/h2&gt;&lt;br /&gt;Дальше буду рассматривать ситуацию, когда вы уже купили домен и когда блог будет непосредственно на самом домене.&lt;br /&gt;&lt;br /&gt;Ну вот вы стали счастливым обладателям доменного имени. Что делать дальше?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Изменить настройки своего DNS сервера&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;В настройках вашего DNS сервера вам необходимо добавить 4-е записи типа A для следующих IP адресов: &lt;i&gt;216.239.32.21, 216.239.34.21, 216.239.36.21, 216.239.38.21&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Мой регистратор услугу "Primary и Seconadary DNS сервер" толкает за деньги, поэтому было решено воспользоваться бесплатным DNS сервером (список был найден в статье "&lt;a href="http://www.mastersite.org.ua/raznoe/10-besplatnykh-primary-i-seconadary-dns-serverov/"&gt;10 бесплатных Primary и Seconadary DNS серверов&lt;/a&gt;"). Выбор пал на &lt;a href="www.xname.org"&gt;www.xname.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/domain_name1.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Настройка публикации в Blogger&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для настройки публикации заходим в меню &lt;i&gt;"Настройки"-&gt;"Публикация"&lt;/i&gt; и нажимаем на ссылку "Персональный домен". Так как домен у нас уже есть жмем &lt;i&gt;"Перейти к расширенным настройкам"&lt;/i&gt;, вводим в поле &lt;i&gt;"Ваш домен"&lt;/i&gt; имя домена (для меня это "night-fairy-tales.com"), ломая мозг пытаемся понять, что же написано в капче, вбиваем текст и жмем &lt;i&gt;"Сохранить настройки"&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;И вот тут вы должны уже были начать радоваться, но УВЫ вы видите сообщение "&lt;b&gt;Блоги нельзя размещать на доменах без субдоменов&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/domain_name0.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В принципе можно было разместить и c субдоменом, если бы перед этим я не тестировал на другом блоге, на котором все получилось. Это меня очень удивило и ввело в ступор на пару часов. &lt;br /&gt;&lt;br /&gt;Все оказалось проще простого, если вы введете название домена в верхнем регистре, то Blogger опубликует его без ошибок. Для меня необходимо было ввести - &lt;b&gt;NIGHT-FAIRY-TALES.COM&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Странный момент, но это работает :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-434961404644066399?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/S_VrBEyWwdY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/434961404644066399/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/02/blog-post.html#comment-form" title="Комментарии: 26" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/434961404644066399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/434961404644066399?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/S_VrBEyWwdY/blog-post.html" title="Новое доменное имя блога" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>26</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/02/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMCRnw_eSp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-6259968618955813459</id><published>2010-02-06T03:49:00.000-08:00</published><updated>2010-04-23T05:57:47.241-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T05:57:47.241-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><title>Новые возможности Blogger (Blogger in Draft)</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4CKMYSp_A8Ss5X0pwCPUQGfSXyQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4CKMYSp_A8Ss5X0pwCPUQGfSXyQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4CKMYSp_A8Ss5X0pwCPUQGfSXyQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4CKMYSp_A8Ss5X0pwCPUQGfSXyQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft.png"/&gt;&lt;/div&gt;В поисках информации по статистики посещения блогов Blogger наткнулся на упоминание &lt;a rel="ext_link" href="http://draft.blogger.com/"&gt;draft.blogger.com&lt;/a&gt;. Название меня заинтересовало, решил посмотреть, что же все таки это за блог. &lt;br /&gt;&lt;br /&gt;Как оказалось это новый разрабатываемый сайт для управления блогом &lt;a rel="ext_link" href="http://www.blogger.com"&gt;Blogger(blogspot.com)&lt;/a&gt;. То, что я нашел, меня приятно удивило. &lt;br /&gt;&lt;br /&gt;Возможно не только я прозевал такие замечательные фичи. Дальше кратко расскажу про некоторые из них.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Пенель инструментов&lt;/h2&gt;Для того что бы вам были доступны новые возможности &lt;b&gt;Blogger in Draft&lt;/b&gt; , вам необходимо входить через &lt;a rel="ext_link" href="http://draft.blogger.com"&gt;draft.blogger.com&lt;/a&gt;. Каждый раз менять url с blogger.com на draft.blogger.com не очень удобно, для упрощения доступа заходим на &lt;a rel="ext_link" href="http://draft.blogger.com"&gt;draft.blogger.com&lt;/a&gt; и ставим галочку "Сделать Черновик Blogger панелью инструментов по умолчанию".&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img width="610px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft5.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;При всех следующих входах на Панель инструментов Blogger вы будете автоматически попадать на Blogger in Draft. &lt;br /&gt;&lt;br /&gt;Заметил небольшую особенность, при входе в редактирования постов из ленты блога, вы будете попадать на старую страницу.&lt;br /&gt;&lt;h2&gt;Дополнительные страницы&lt;/h2&gt;Один из самых неудобных моментов, которые меня раздражали на &lt;a rel="ext_link" href="http://www.blogger.com"&gt;Blogger(blogspot.com)&lt;/a&gt; - это отсутствие возможности добавлять дополнительные страницы. Из этой ситуации можно выйти добавив страницу в качестве поста и запретив добавлять комментарии, но такая страница попадает в общий список постов :(, что тоже неудобно.&lt;br /&gt;&lt;br /&gt;С помощью &lt;a rel="ext_link" href="http://draft.blogger.com/"&gt;Blogger in Draft&lt;/a&gt; вы можете добавить такие страницы(до 10 страниц) на свой блог. Эта фича настолько естественна и необходима, что для меня это оказалось самым востребованным нововведением!&lt;br /&gt;&lt;br /&gt;Для добавления страницы вам необходимо зайти в меню "Отправка"-&gt;"Изменить страницы".&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img width="610px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft0.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Жмем "Создать страницу" и заполняем страницу как при обычном написании поста. Чтобы она появилась в блоге, необходимо нажать "Опубликовать страницу". &lt;br /&gt;&lt;br /&gt;Для удобства разработчики дали возможность выбрать, куда именно в блог будет добавлена данная страница.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img width="610px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft2.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Есть 3 варианта добавления:&lt;br /&gt;- &lt;b&gt;Боковая панель блога&lt;/b&gt;. В боковую панель будет добавлен гаджет со списком таких дополнительных страниц, аналог бокового меню.&lt;br /&gt;- &lt;b&gt;Вкладки блога&lt;/b&gt;. В шапку будет так же добавлен гаджет со списком дополнительных страниц, аналог меню в шапке.&lt;br /&gt;- &lt;b&gt;Без гаджета&lt;/b&gt;. В данном случае вам необходимо будет вручную поместить ссылку на данную страницу в своем блоге.&lt;br /&gt;&lt;br /&gt;При использовании первого или второго способа список страниц будет обновляться автоматически. Вы можете настроить отображение и порядок страниц в этом гаджете.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img width="610px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft3.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;Что немного разочаровало, так это дизайн гаджета, он, конечно, просто ужасен. Думаю можно разобрать устройство этого гаджета и реализовать на его основе обычное меню, чтобы и вид был по-лучше, и меню обновлялось автоматически.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Изменения даты публикации&lt;/h2&gt;Иногда видишь, что информация в посте морально устарела и не соответствует действительности. В этих случаях можно изменить старый пост, внеся поправки, но читатели увидят изменения, только когда опять зайдут в этот пост. Или другая ситуация, вы начали писать пост и это затянулось у вас на месяцок :), если вы не изменили "&lt;b&gt;Дату и время публикации&lt;/b&gt;" вручную, то после публикации будет казаться, что ваш пост был написан месяц назад.&lt;br /&gt;&lt;br /&gt;В новой реализации при опубликовании у сообщения будет автоматически изменена дата публикации на текущую. Если вам необходимо определенная дата, то вы сможете ее указать в настройках.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img width="610px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft4.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Ярлыки местоположения&lt;/h2&gt;В &lt;a rel="ext_link" href="http://draft.blogger.com/"&gt;Blogger in Draft&lt;/a&gt;, кроме обычных ярлыков вы можете добавить и ярлык местоположения. Очень интересная фича :), а главное добавить местоположения действительно просто.&lt;br /&gt;&lt;br /&gt;Для добавление местоположение находим кнопку "&lt;b&gt;Добавить местоположение&lt;/b&gt;" при редактировании поста и смело жмем ее.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img width="610px" src="http://cdn.night-fairy-tales.com/nft/sr/blogger_in_draft1.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;Находим нужное нам местоположение и сохраняем его. При публикации в конце вашего поста будет отображена ссылка на указанное местоположение, при клике на которую оно будет отображено в &lt;a rel="ext_link" href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Местоположения добавленные таким образом будут доступны в RSS и Atom лентах с использованием стандарта &lt;a rel="ext_link" href="http://georss.org/"&gt;GeoRSS&lt;/a&gt;. Это даст возможность RSS-агригаторам и поисковым движкам ассоциировать ваш пост с указанным местоположением.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Добавил ярлык местоположения, а ссылка не появилась?&lt;/b&gt;&lt;br /&gt;В старых версиях шаблона отсутствует секция вывода ярлыков местоположения. Решить проблему можно двумя способами:&lt;br /&gt;1. &lt;b&gt;Установить обновленный шаблон&lt;/b&gt;. Этим решением лучше воспользоваться если вы сами не правили шаблон, в противном случае смотрите решение 2.&lt;br /&gt;2. &lt;b&gt;Добавить секцию вывода ярлыка местоположения в шаблон&lt;/b&gt;. Для этого вам необходимо перейти в меню "Дизайн"-&gt;"Изменить HTML" и установить флаг "Расширить шаблоны виджета". После чего необходимо найти секцию&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;div class=&amp;#39;post-footer-line post-footer-line-3&amp;#39;/&amp;gt;&lt;/pre&gt;и заменить ее следующим фрагментом&lt;br /&gt;&lt;pre class="brush:xml"&gt;&amp;lt;div class=&amp;#39;post-footer-line post-footer-line-3&amp;#39;&amp;gt;&lt;br /&gt;    &amp;lt;span class=&amp;#39;post-location&amp;#39;&amp;gt;&lt;br /&gt;    &amp;lt;b:if cond=&amp;#39;data:post.location&amp;#39;&amp;gt;&lt;br /&gt;        &amp;lt;data:postLocationLabel/&amp;gt;&lt;br /&gt;        &amp;lt;a expr:href=&amp;#39;data:post.location.mapsUrl&amp;#39; target=&amp;#39;_blank&amp;#39;&amp;gt;&amp;lt;data:post.location.name/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;    &amp;lt;/b:if&amp;gt;&lt;br /&gt;    &amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ну вот и все, что хотел описать в данном посте. Надеюсь, данные возможности помогут вам при ведении блога.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-6259968618955813459?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/q1KlLkIkNdQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/6259968618955813459/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/02/blogger-blogger-in-draft.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/6259968618955813459?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/6259968618955813459?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/q1KlLkIkNdQ/blogger-blogger-in-draft.html" title="Новые возможности Blogger (Blogger in Draft)" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>4</thr:total><georss:featurename>Россия, Москва</georss:featurename><georss:point>55.755786 37.617633</georss:point><georss:box>55.369384000000004 36.683794999999996 56.142188 38.551471</georss:box><feedburner:origLink>http://night-fairy-tales.com/2010/02/blogger-blogger-in-draft.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4FSHo7fip7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-7206134689954966877</id><published>2010-01-29T23:39:00.000-08:00</published><updated>2010-04-23T06:05:19.406-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:05:19.406-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="блог" /><category scheme="http://www.blogger.com/atom/ns#" term="Blogger" /><category scheme="http://www.blogger.com/atom/ns#" term="мнение" /><title>Мнение</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Zd-oMPBSgz7nCwSzNWvVcjqT_0I/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zd-oMPBSgz7nCwSzNWvVcjqT_0I/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Zd-oMPBSgz7nCwSzNWvVcjqT_0I/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Zd-oMPBSgz7nCwSzNWvVcjqT_0I/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img height="165px" src="http://cdn.night-fairy-tales.com/nft/sr/opinion.png"/&gt;&lt;/div&gt;Мой блог еще молод и как ни странно, наверное, я самый благодарный читатель своего блога :). К каждому написанному посту я возвращаюсь со временем чтобы прочитать и получить ту частичку информации о которой я помню, что она есть, но забываю, в чем ее суть. Так наверное происходит из-за того, что когда проверяешь каждый рецепт, находишь интересные моменты, а со временем просто забываешь о них.&lt;br /&gt;&lt;br /&gt;Ну и как благодарный читатель периодически думаю над вопросами&lt;br /&gt;- &lt;i&gt;О каких интересных вещах написать?&lt;/i&gt;&lt;br /&gt;- &lt;i&gt;Как можно улучшить свой блог?&lt;/i&gt;&lt;br /&gt;- &lt;i&gt;Чего не хватает в самом блоге и его статьях?&lt;/i&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Как показывает практика одна голова хорошо, а две лучше :). Поэтому решил, что необходимо сделать следующие:&lt;br /&gt;&lt;br /&gt;1. Поучаствовать в &lt;b&gt;акции "Свежая голова"&lt;/b&gt;. Автор блога "&lt;a rel="ext_link" href="http://www.pi­saka.in.ua"&gt;Школа фрилансера&lt;/a&gt;" предлагает услуги по бесплатному &lt;a rel="ext_link" href="http://dra­corex.ru/?p=307"&gt;обзору блогов&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;2. Попросить вас, моих читателей, высказать свое мнение и пожелания по поводу моего блога. Будут приняты и учтены даже самые неординарные из них :).&lt;br /&gt;&lt;br /&gt;3. Переработать свой блог с точки зрения дизайна и структуры.&lt;br /&gt;&lt;br /&gt;Дорогие читатели, прошу вас оставить в комментариях ваше мнение о моем блоге и ваши пожелания и замечания! Кто первый? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-7206134689954966877?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/DfC_b3LOz_Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/7206134689954966877/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/01/blog-post.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/7206134689954966877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/7206134689954966877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/DfC_b3LOz_Q/blog-post.html" title="Мнение" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>4</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/01/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4MRXs9fyp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-3973042134347734712</id><published>2010-01-29T10:06:00.000-08:00</published><updated>2010-04-23T06:06:24.567-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:06:24.567-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="404 error" /><category scheme="http://www.blogger.com/atom/ns#" term="Google App Engine" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><category scheme="http://www.blogger.com/atom/ns#" term="self.error" /><title>Google App Engine. Обработка запросов  с ошибками в webapp фреймворке</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ktI7sNm6z2EAu7cxxqVstCpcATg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ktI7sNm6z2EAu7cxxqVstCpcATg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ktI7sNm6z2EAu7cxxqVstCpcATg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ktI7sNm6z2EAu7cxxqVstCpcATg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/app_engine.png"/&gt;&lt;/div&gt;Идея переработать блог летала вокруг уже давно, назрело так сказать. Разделив работу на этапы, для начала решил перенести все ресурсы на &lt;a href="http://ru.wikipedia.org/wiki/Content_Delivery_Network"&gt;CDN&lt;/a&gt;. Но как всегда захотелось халявы :).&lt;br /&gt;&lt;br /&gt;Вспомнил о своем аккаунте на &lt;a href="http://appengine.google.com/"&gt;Google App Engine&lt;/a&gt;, промелькнула мысль "Можно же построить свой CDN, практически без затрат денег и управлять им так, как душа пожелает". Реализации, которые есть на текущий момент меня немного не устроили и работа закипела.&lt;br /&gt;&lt;br /&gt;В качестве основы был выбран webapp фреймворк. Но речь как раз не о моей реализации, а о тонкостях самого фреймворка. Краткий пост хотел посвятить небольшому хаку по обработке запросов, в которых произошла ошибка.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;В документации данная тема раскрыта в статье "&lt;a href="http://googleappengine.ru/docs/webapp/redirects.html"&gt;Перенаправления, заголовки и коды статуса&lt;/a&gt;". И приведен следующий пример.&lt;br /&gt;&lt;pre class="brush: py"&gt;&lt;br /&gt;class MyHandler(webapp.RequestHandler):&lt;br /&gt;  def get(self):&lt;br /&gt;    self.response.out.write("Вы попросили что-то сделать.")&lt;br /&gt;    try:&lt;br /&gt;      doSomething()&lt;br /&gt;      self.response.out.write("Это сделано!")&lt;br /&gt;&lt;br /&gt;    except Error:&lt;br /&gt;      # Очистить вывод и вернуть сообщение об ошибке.&lt;br /&gt;      self.error(500)&lt;br /&gt;&lt;/pre&gt;Вроде бы все понятно, если вызвать self.error(500), то все данные которые записаны в ответ будут удалены и будет возвращено сообщение об ошибке.&lt;br /&gt;&lt;br /&gt;Но при выполнении сразу можно заметить один маленький нюанс, сервер нам вернет пустую страницу в случае, когда отработает команда &lt;b&gt;self.error(500)&lt;/b&gt; или &lt;b&gt;self.error(404)&lt;/b&gt;, или будет вызван данный метод с любой другой ошибкой. Но как и написано в документации, ответ будет имеет код ошибки 500 или 404, или любой другой, соответственно.&lt;br /&gt;&lt;br /&gt;Поведение метода можно посмотреть в исходниках.&lt;br /&gt;&lt;b&gt;google.appengine.ext.webapp.RequestHandler&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: py"&gt;&lt;br /&gt;class Request(webob.Request):  &lt;br /&gt;  ...&lt;br /&gt;  def error(self, code):&lt;br /&gt;    """Clears the response output stream and sets the given HTTP error code.&lt;br /&gt;&lt;br /&gt;    Args:&lt;br /&gt;      code: the HTTP status error code (e.g., 501)&lt;br /&gt;    """&lt;br /&gt;    self.response.set_status(code)&lt;br /&gt;    self.response.clear()&lt;br /&gt;  ...&lt;br /&gt;&lt;/pre&gt;Он всего лишь устанавливает нужный статус и очищает ответ. А хотелось же получить страницу с сообщением об ошибке :(!!!&lt;br /&gt;&lt;br /&gt;Просто редиректить на страницу ошибки как-то не интересно. Добавлять после каждого вызова "&lt;b&gt;self.error&lt;/b&gt;" рендер страницы ошибки тоже как-то не кошерно. Решил добавить небольшой хак&lt;br /&gt;&lt;pre class="brush: py"&gt;&lt;br /&gt;import os&lt;br /&gt;import logging&lt;br /&gt;from google.appengine.ext import webapp&lt;br /&gt;from google.appengine.ext.webapp import util&lt;br /&gt;from google.appengine.ext.webapp import RequestHandler&lt;br /&gt;&lt;br /&gt;template_path = os.path.join(os.path.dirname(__file__), "templates")&lt;br /&gt;&lt;br /&gt;def get_template_path(file_name):    &lt;br /&gt;  return os.path.join(template_path, file_name)&lt;br /&gt;&lt;br /&gt;def error_decorator(func):    &lt;br /&gt;    def wrapper(*args, **kwarg):&lt;br /&gt;        handler = args[0]&lt;br /&gt;        status_code = args[1]&lt;br /&gt;        result = func(*args, **kwarg)&lt;br /&gt;        try:&lt;br /&gt;            html = {&lt;br /&gt;                404 : "404.html",&lt;br /&gt;                500 : "500.html"&lt;br /&gt;                }[status_code]&lt;br /&gt;            if not html:&lt;br /&gt;                return;&lt;br /&gt;            handler.response.out.write(template.render(get_template_path(html), template_values))&lt;br /&gt;        except Exception, e:&lt;br /&gt;            logging.error('Raise error in error_decorator. %s' % e)&lt;br /&gt;        return result&lt;br /&gt;    return wrapper&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt;    RequestHandler.error = error_decorator(RequestHandler.error)&lt;br /&gt;    application = webapp.WSGIApplication(&lt;br /&gt;          [('/', MainHandler),&lt;br /&gt;          ], debug=True)&lt;br /&gt;    util.run_wsgi_app(application)&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;    main()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;При вызове метода "self.error(404)" кроме установки статуса и очистки данных response в ответ будет добавлена страница с сообщением об ошибке. Такой подход имеет ряд преимуществ. &lt;br /&gt;&lt;br /&gt;Пользуйтесь! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-3973042134347734712?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/rHkLi4wFU0s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/3973042134347734712/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/01/google-app-engine-webapp.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/3973042134347734712?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/3973042134347734712?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/rHkLi4wFU0s/google-app-engine-webapp.html" title="Google App Engine. Обработка запросов  с ошибками в webapp фреймворке" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/01/google-app-engine-webapp.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcNRHk5fSp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-9219134681491428069</id><published>2010-01-22T10:37:00.000-08:00</published><updated>2010-04-23T06:08:15.725-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:08:15.725-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="feature" /><title>Необычные особенности JavaScript</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4Mawc-kSmIXQ260y-KLfj6QF5q0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4Mawc-kSmIXQ260y-KLfj6QF5q0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4Mawc-kSmIXQ260y-KLfj6QF5q0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4Mawc-kSmIXQ260y-KLfj6QF5q0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/javascript.png"/&gt;&lt;/div&gt;В веб разработке не найдется людей, которым не приходилось бы работать с JavaScript. Сам язык является диалектом &lt;a href="http://ru.wikipedia.org/wiki/ECMAScript"&gt;ECMAScript&lt;/a&gt;, основаным на спецификации ECMA-262. В результате реализации спецификации, язык JavaScript просто напичкан "интересными возможностями". Иногда некоторое поведение языка вызывает бурю негодования. Чтобы зверь не укусил тебя за задницу, нужно знать его повадки. В этой статье попробую описать необычные "повадки" JavaScript. &lt;a name='more'&gt;&lt;/a&gt; &lt;h2&gt;Операции суммирования и вычитания&lt;/h2&gt;В суммирование однотипных простых значений(типа строка, число) нет ничего особенного, и все они проводятся согласно логическим правилам исходя из типа. Многие из вас, наверное, знают про маленькую особенность, которою можно наблюдать при суммировании строки и числа. Такие моменты обусловлены правилом неявного преобразования типов. Но знаете ли вы обо всех?  &lt;pre class="brush: js"&gt;var p1 = "3" + 1; // p1 = "31" (строка)
var p2 = "3" - 1;    // p2 = 2 (число)
var p3 = "3" - -"1"; // p3 = 4 (число)
&lt;/pre&gt;Как оказывается, в результате сложения строки и числа, вы получаете строку, а вот если вы будете вычитать из строки число или из строки строку, то получите опять- таки число. &lt;h2&gt;Сравнения&lt;/h2&gt;Сравнение имеет тоже свою магию. И, порой, можно получить просто неожиданный результат. &lt;pre class="brush: js"&gt;var n = ''=='0'; //false
var n1 = 0==''; //true
var n2 = 0=='0'; //true
var n3 = false=='false'; //false
var n4 = false=='0'; //true
var n5 = false==undefined; //false
var n6 = false==null; //false
var n7 = null==undefined; //true
var n8 = " \t\r\n"==0; //true
&lt;/pre&gt;Еще один из интересных моментов связан со &lt;b&gt;сравнением массивов&lt;/b&gt;. &lt;pre class="brush: js"&gt;var n = 2==[2]; // результат true&lt;/pre&gt;Еще более удивительным может показаться следующие сравнение &lt;pre class="brush: js"&gt;var n1 = 2==[[[2]]]; // результат true&lt;/pre&gt;Ну и что бы окончательно убедится, что сравнение массивов обладает истинной магией, посмотрите на вот этот пример. &lt;pre class="brush: js"&gt;var a = { "item" : 1 };
var n2 = a[[[["item"]]]]==a["item"]; // результат true
&lt;/pre&gt;&lt;h2&gt;Особенность работы с типом undefined&lt;/h2&gt;Этот тип состоит из единственного значения undefined. Данное значение принимают все переменные, которые объявлены, но которым еще не присвоено значение. &lt;pre class="brush: js"&gt;var i = {};
var n = i.j===undefined; // результат true, значение свойства b не установлено
&lt;/pre&gt;Особенность заключается в том, что если данной переменной undefined присвоить другое значение, то результат при сравнении не заданного свойства с этим значением будет давать значение false; &lt;pre class="brush: js"&gt;undefined = 1;
var n1 = i.j===undefined; // результат false
&lt;/pre&gt;Для избежания ошибок в коде лучше использовать сравнение типов. &lt;pre class="brush: js"&gt;var n2 = typeof i.j=="undefined"; // результат всегда true&lt;/pre&gt;&lt;h2&gt;Преобразования строки в число&lt;/h2&gt;Функция parseInt преобразует строку в число по указанному основанию. &lt;pre class="brush: js"&gt;var n1 = parseInt('06'); // результат 6
var n2 = parseInt('07'); // результат 7
var n3 = parseInt('08'); // результат 0
var n4 = parseInt('09'); // результат 0
var n5 = parseInt('10'); // результат 10
&lt;/pre&gt;Будьте бдительны при использовании этого метода :). &lt;h2&gt;Преобразование в логический тип&lt;/h2&gt;Что бы преобразовать значение в логический тип, вам необходимо сделать следующим образом: &lt;pre class="brush: js"&gt;var n = Boolean(value);
&lt;/pre&gt;Но есть и другой способ, для этого вам необходимо воспользоваться двойным логическим отрицанием. &lt;pre class="brush: js"&gt;var n1 = !!0; // результат false
var n2 = !!1; // результат true
var n3 = !!4; // результат true
var n4 = !!""; // резульатат false
var n5 = !!"0"; //результат true
var n6 = !!"12"; // результат true
&lt;/pre&gt;Операции преобразования будут проведена согласно правилам преобразование к логическому типу.  &lt;h2&gt;Округление чисел&lt;/h2&gt;Для округления в JavaScript вы можете воспользоваться функциями Math.floor(x) или parseInt(x,10). Двойное побитовое NOT (~~) можно так же использовать для округления. &lt;pre class="brush: js"&gt;var n = Math.PI; // результат 3.141592653589793
var n1 = Math.floor(n); // результат 3
var n2 = parseInt(n, 10); // результат 3
var n3 = ~~n; // результат 3&lt;/pre&gt;Очень необычный способ, но результат возвращает корректно :).  &lt;h2&gt;Тип Date&lt;/h2&gt;Дата в JavaScript измеряется в миллисекундах, начиная от полуночи 01 января 1970 года GMT+0. Для получения даты вам нужно создать объект типа Date и передать туда необходимые параметры даты. &lt;pre class="brush: js"&gt;var currentDate = new Date(); //Текущая дата
var date = new Date(2008,07,06); // 06.07.2008
&lt;/pre&gt;Есть интересный момент при работе с датой, связан с тем, что вы можете указывать смещение по годам, месяцам, дням, минутам, секундам. Например, вам необходимо от даты 10.10.2010 узнать дату 1024 дня. &lt;pre class="brush: js"&gt;var futureDate = new Date(2010,10,10+1024); // 30.08.2013
alert(futureDate);
&lt;/pre&gt;&lt;h2&gt;Особенность работы try, catch, finally&lt;/h2&gt;Как мы все прекрасно знаем, для обработки исключений в javascript нам необходимо использовать конструкцию try...[catch]...[finally]. Казалось, какие особенности может иметь такая конструкция.  Рассмотрев в примере от &lt;a href="http://neil.fraser.name/news/2009/10/27/"&gt;Neil Fraser&lt;/a&gt;, мы можем убедится, что все же тут имеется некоторые особенности.  Как вы думаете, что какое значение вернет функция f()? &lt;pre class="brush: js"&gt;function f() {
  try {
      return true;
  } 
  finally {
    return false;
  }
}

j = f(); // j == false;
&lt;/pre&gt;Как оказывается данный метод вернет значение "false".  &lt;h2&gt;Обращение к свойствам&lt;/h2&gt;Javascript имеет два способа используя которые можно получить значение свойства. Первый, обращение через ".", удобней для написания, второй, обращение как к элементу массива, будет полезен в программного доступе к значениям. &lt;pre class="brush: js"&gt;a['title'] = "JavaScript array";
a.title = "JavaScript свойства объекта";
&lt;/pre&gt;Именно из-за этой особенности можно ответить на вопрос "Как узнать все свойства объекта?". &lt;pre class="brush: js"&gt;var obj = { param1 : JavaScript string", param2 : "Javascript date" };
var result = '';
for (var i in obj) {
  // обращение к свойствам объекта по индексу
  result += i + " = " + obj[i] + "\n";
}
alert(result);
&lt;/pre&gt;&lt;h2&gt;Аргументы функции&lt;/h2&gt;При вызове функции вы можете не передавать значение параметров. Но вот если вы передали параметры, а в функции не определены входящие параметры, то вы можете воспользоваться переменной arguments для получения доступа ко всей коллекции полученным параметрам. &lt;pre class="brush: js"&gt;function wow(param1){
  var params = arguments; // ["hello", "world"];
}
wow("JavaScript tips", "Используем arguments JavaScript");
&lt;/pre&gt;Что-то упустил?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-9219134681491428069?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/J_iFFAujAyk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/9219134681491428069/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/01/javascript.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/9219134681491428069?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/9219134681491428069?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/J_iFFAujAyk/javascript.html" title="Необычные особенности JavaScript" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>4</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/01/javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYNQns_eSp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2038177047382960137</id><published>2010-01-16T03:25:00.000-08:00</published><updated>2010-04-23T06:09:53.541-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:09:53.541-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery 1.4" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>Исследуем новые возможности jQuery 1.4</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CKsXj2-S_GQbASTYgYdEJnoU6-s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CKsXj2-S_GQbASTYgYdEJnoU6-s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CKsXj2-S_GQbASTYgYdEJnoU6-s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CKsXj2-S_GQbASTYgYdEJnoU6-s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img style="background-color:#0f1923" src="http://cdn.night-fairy-tales.com/nft/sr/jquery.png"/&gt;&lt;/div&gt;14 января был 4-й день рождения jQuery. К этому дню и был приурочен выпуск релиза &lt;a rel="ext_link" href="http://jquery14.com/day-01/jquery-14"&gt;jQuery 1.4&lt;/a&gt;. Цельного понимания изменений не было, информация была немного скупа, вот я и решил попробовать его в действии, вследствие чего и родилась данная статья.&lt;br /&gt;&lt;br /&gt;Так как версию jQuery 1.3.2 я использовал уже довольно долго, то хотелось найти ответ на следующий вопрос: "&lt;b&gt;Стоит ли переходить и что придется менять в старом коде для перехода на jQuery 1.4?&lt;/b&gt;".&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Совместимость с другими версиями jQuery&lt;/h2&gt;&lt;br /&gt;Разработчики, которые раньше использовали версию jQuery 1.3.2, могут смело переходить на использование версии jQuery 1.4, они &lt;b&gt;полностью совместимы&lt;/b&gt; (одна оговорка, см. &lt;a href="#jQuery.param"&gt;jQuery.param&lt;/a&gt;). Во всех остальных случаях вам придется проверить совместимость вашего кода с jQuery 1.4.&lt;br /&gt;&lt;br /&gt;Данная версия обладает рядом преимуществ, одним из которых является оптимизация и повышения быстродействия методов addClass, removeClass, append, html и других.&lt;br /&gt;&lt;br /&gt;Производительность методов(&lt;a rel="ext_link" href="http://jquery14.com/day-01/jquery-14"&gt;источник&lt;/a&gt;)&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/jquery14_performance.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;СSS&lt;/h2&gt;&lt;br /&gt;Как видно из графика, была проведена работа по оптимизации методов взаимодействующих с css. Для удобства был расширен функционал методов .css(), .addClass(), .removeClass(), .toggleClass(), .offset().&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.css(propertyName,function(index,value))&lt;/b&gt;.&lt;br /&gt;Метод css необходим для определения и установки css свойств. Теперь определять значение css свойства можно в динамике.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;Внимание&lt;/span&gt;: &lt;i&gt;В документации по jQuery 1.4 в описании данного метода допущена ошибка. Данный метод принимает объект map, где значение может быть определено функцией function(index,value).&lt;/i&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(this).css({&lt;br /&gt;  width : function(index, value) {&lt;br /&gt;        //index - индекс текущего элемента&lt;br /&gt;        //value - старое значение этого свойства&lt;br /&gt;        return parseFloat(value) * 1.2;&lt;br /&gt;      },&lt;br /&gt;  height: &amp;quot;20px&amp;quot; &lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.addClass(function(index,class))&lt;/b&gt;, &lt;b&gt;.removeClass(function(index,class))&lt;/b&gt;, &lt;b&gt;.toggleClass(function(index,class),[switch])&lt;/b&gt;&lt;br /&gt;Группа данных методов необходима для добавления/удаления css классов. Теперь методы могут в качестве значений принимать функцию, которая должна вернуть &lt;i&gt;строку с значением класса&lt;/i&gt;. Если нужно передать несколько классов, то они должны быть разделены пробелом.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).addClass(function(index, className) {&lt;br /&gt; //index - индекс текущего элемента&lt;br /&gt; //className - старое значение class&lt;br /&gt; return &amp;quot;myclass&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).removeClass(function(index, className){&lt;br /&gt; if (index==0) {&lt;br /&gt;    return &amp;quot;myclass&amp;quot;;&lt;br /&gt; } else {&lt;br /&gt;    return &amp;quot;&amp;quot;;&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.offset(coordinates)&lt;/b&gt;, &lt;b&gt;.offset(function(index,coords))&lt;/b&gt;&lt;br /&gt;Метод .offset() в предыдущих версиях jQuery возвращал объект, который описывал положение DOM элемента относительно объекта document. В текущей версии функционал данного метода был расширен, и теперь можно не только узнать положение, но и установить его.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;//Смещаем элемент на 20 пикселей по оси X, и на 10 по оси Y&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).offset(function(index, coordinate){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  //coordinate - текущие координаты смещение элемента&lt;br /&gt;  return { top: coordinate.top+20, left: coordinate.left+10 };&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;//Перемещаем элемент в левый верхний угол экрана&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).offset({ top: 0, left: 0 });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red;"&gt;Внимание&lt;/span&gt;: &lt;i&gt;При исследовании заметил маленькую особенность в работе метода offset принимающего функцию.&lt;br /&gt;1. Если изменить значение coordinate.top или/и coordinate.left, а в качестве значения вернуть объект coordinate, то смещение &lt;b&gt;НЕ произойдет&lt;/b&gt;. &lt;br /&gt;2. Если изменить значение coordinate.top или/и coordinate.left, а в качестве значения вернуть новый объект с необходимыми координатами, то при смещении элемент &lt;b&gt;НЕ будет находится в задаваемой точке&lt;/b&gt;.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/css/"&gt;css&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/addClass/"&gt;addClass&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/removeClass/"&gt;removeClass&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/toggleClass/"&gt;toggleClass&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/offset/"&gt;offset&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Создание/добавление DOM элементов&lt;/h2&gt;&lt;br /&gt;Была проведена существенная работа и по доработке методов создания/добавления DOM элементов.&lt;br /&gt;&lt;br /&gt;- cоздание DOM элементов &lt;b&gt;jQuery(html,props)&lt;/b&gt;&lt;br /&gt;В своей статье "&lt;a href="http://night-fairy-tales.com/2009/12/jquery-tips-1-11.html"&gt;jQuery tips. Часть 1. 11 моментов о которых необходимо знать&lt;/a&gt;" я описывал возможность jQuery  по созданию html элементов. В версии 1.4 появилась возможность добавлять атрибуты при создании элемента, передавая их вторым параметром:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;&amp;lt;a/&amp;gt;&amp;#39;, {  &lt;br /&gt;  id: &amp;#39;jquery14&amp;#39;,  &lt;br /&gt;  href: &amp;#39;http://jquery14.com/day-01/jquery-14&amp;#39;,  &lt;br /&gt;  title: &amp;#39;jQuery 1.4&amp;#39;,  &lt;br /&gt;  rel: &amp;#39;ext_link&amp;#39;,  &lt;br /&gt;  text: &amp;#39;Release jQuery 1.4&amp;#39;  &lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Как вы могли уже заметить тег "a" не имеет атрибута text. В jQuery 1.4 была добавлена возможность устанавливать не только атрибуты, но и вызывать методы jQuery. Так, в данном случае будет вызван метод ".text()" и в качестве параметра будет передано значение "Release jQuery 1.4"&lt;br /&gt;&lt;br /&gt;Вот пример который продемонстрирует всю мощь таких атрибутов в jQuery 1.4&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;&amp;lt;div/&amp;gt;&amp;#39;, {&lt;br /&gt;  id: &amp;#39;jquery&amp;#39;,  &lt;br /&gt;  css: {&lt;br /&gt;         fontWeight: 500,&lt;br /&gt;         color: &amp;#39;red&amp;#39;&lt;br /&gt;  },&lt;br /&gt;  click: function(){&lt;br /&gt;         alert(&amp;#39;Используем jQuery 1.4!&amp;#39;);&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Кроме присвоения значения атрибуту id, в данном примере устанавливается значение css свойств и добавляется обработчик событий click.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.after(function(index))&lt;/b&gt;, &lt;b&gt;.before(function(index))&lt;/b&gt;&lt;br /&gt;Метод after/before добавляет передаваемый в параметре контент после/до каждого элемента в выборке. Теперь данные методы могут принимать функцию, которая должна вернуть &lt;i&gt;Html строку или DOM элемент&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).after(function(index){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  return document.createTextNode(&amp;quot;Используем jQuery 1.4.&amp;quot;);&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).before(function(index){&lt;br /&gt;  return &amp;quot;&amp;lt;div&amp;gt;jQuery уже подрос, ему 4 года :).&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.append(function(index,html))&lt;/b&gt;, &lt;b&gt;.prepend(function(index,html))&lt;/b&gt;&lt;br /&gt;Метод append/prepend добавляет передаваемый в параметре контент в конец/начало каждого элемента в выборке. И в эти методы также можно передавать первым параметром функцию, она должна вернуть &lt;i&gt;Html строку или DOM элемент&lt;/i&gt;.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).append(function(index, html){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  //html - innerText найденного элемента&lt;br /&gt;  return &amp;quot;А вы используете jQuery 1.4?&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.html(function(index,html))&lt;/b&gt;, &lt;b&gt;.text(function(index,text))&lt;/b&gt;, &lt;b&gt;.val(function)&lt;/b&gt;&lt;br /&gt;Возможности этих методов были расширены, и теперь каждая может принимать функцию.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).text(function(index, text){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  //text - старое значение текста&lt;br /&gt;  return &amp;quot;А вы участвуете в акции &amp;#39;14 Days of jQuery, 15 Days of prizes.&amp;#39;?&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).html(function(index, html){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  //html - старое значение html&lt;br /&gt;  return &amp;quot;&amp;lt;a href=&amp;#39;http://mediatemple.net/jquery14/&amp;#39;&amp;gt;14 Days of jQuery, 15 Days of prizes.&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).val(function(index, value){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  //value - старое значение value&lt;br /&gt;  return &amp;#39;13” Apple MacBook Pro хороший приз для конкурса :)&amp;#39;;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/jQuery/"&gt;jQuery&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/after/"&gt;after&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/before/"&gt;before&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/append/"&gt;append&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/prepend/"&gt;prepend&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/html/#html2"&gt;html&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/text/#text2"&gt;text&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/val/#val2"&gt;val&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Работа с DOM элементами&lt;/h2&gt;&lt;br /&gt;В новой версии также добавлены некоторые интересные методы по работе с DOM элементами.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.wrap(wrappingFunction)&lt;/b&gt;, &lt;b&gt;.wrapInner(wrappingFunction)&lt;/b&gt;, &lt;b&gt;.wrapAll(wrappingFunction)&lt;/b&gt;&lt;br /&gt;Эти методы для каждого элемента в выборке создают дополнительную обертку. Они были доступны с версии 1.2, но в версии 1.4 эти методы могут принимать функцию. Функция должна вернуть структуру, которая будет использована в качестве обертки.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).wrap(function(index){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  return &amp;quot;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).wrapInner(function(index){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  return document.createElement(&amp;quot;b&amp;quot;);&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.unwrap()&lt;/b&gt;&lt;br /&gt;Также был добавлен метод ".unwrap()", который осуществляет противоположное действие методу ".wrap()", т.е. удаляет родительский элемент(обертку) у всех элементов в выборке.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).unwrap();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.detach()&lt;/b&gt;&lt;br /&gt;Данный метод удаляет элемент из DOM. Действует подобно методу &lt;b&gt;.remove()&lt;/b&gt;, но сохраняет все ассоциации jQuery с этим объектом, т.е. все данные добавлены к этому элементу методом &lt;b&gt;.data()&lt;/b&gt; и все обработчики событий добавленные через jQuery будут сохранены. &lt;br /&gt;&lt;br /&gt;Этот метод будет полезен в том случае, если вам необходимо удалить элемент, но вы знаете, что через время его все равно придется создавать.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;myEl = $(&amp;quot;#myID&amp;quot;).detach(); //удаляем объект из DOM&lt;br /&gt;....&lt;br /&gt;myEl.appendTo(&amp;quot;body&amp;quot;); //добавляем объект&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.toArray()&lt;/b&gt;&lt;br /&gt;Очень простой метод, возвращает список элементов, которые были выбраны селектором.&lt;br /&gt;Html:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;jQuery 1.2&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;jQuery 1.3&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;jQuery 1.4&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;more&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;JavaScript:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var list = $(&amp;quot;li&amp;quot;).toArray();&lt;br /&gt;//list = [li, li, li, li];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.replaceWith(function)&lt;/b&gt;&lt;br /&gt;Данный метод заменит каждый выбранный элемент значением, которое будет возвращено функцией. Функция может возвращать &lt;i&gt;Html код или DOM элемент&lt;/i&gt;.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myId&amp;quot;).replaceWith(function(index){&lt;br /&gt;  //index - индекс текущего элемента&lt;br /&gt;  return &amp;quot;&amp;lt;div&amp;gt;Use replaceWith method in jQuery 1.4!&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.index()&lt;/b&gt;, &lt;b&gt;.index(selector)&lt;/b&gt;&lt;br /&gt;Метод ".index(element)" доступен с версии 1.0, но теперь у него появилось еще несколько вариантов использования.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var listItem = $(&amp;#39;#myID&amp;#39;);&lt;br /&gt;alert(&amp;#39;Index: &amp;#39; + $(&amp;#39;li&amp;#39;).index(listItem));&lt;br /&gt;&lt;br /&gt;$(&amp;#39;li&amp;#39;).click(function(){&lt;br /&gt;  alert(&amp;#39;Index: &amp;#39; + &amp;#39;$(this).index());&lt;br /&gt;})&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/wrap/"&gt;wrap&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/wrapAll/"&gt;wrapAll&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/wrapInner/"&gt;wrapInner&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/detach/"&gt;detach&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/toArray/"&gt;toArray&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/replaceWith/"&gt;replaceWith&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/index/"&gt;index&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Сохранение области видимости&lt;/h2&gt;&lt;br /&gt;Думаю, одним из самых интересных и в тоже время простых методов, которые были добавлены в jQuery 1.4, является jQuery.proxy(). Данный метод имеет следующий синтакс &lt;b&gt;jQuery.proxy(function,scope)&lt;/b&gt;, &lt;b&gt;jQuery.proxy(scope,name)&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Продемонстрирую на примере, описанном в документации jQuery 1.4&lt;br /&gt;Html:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;button id=&amp;quot;test&amp;quot; name=&amp;quot;test&amp;quot;&amp;gt;Test button&amp;lt;/button&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;JavaScript:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var obj = {&lt;br /&gt;  name: &amp;quot;John&amp;quot;,&lt;br /&gt;  test: function() {&lt;br /&gt;    alert(this.name);&lt;br /&gt;  }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Если выполнить функцию "&lt;b&gt;obj.test()&lt;/b&gt;", то при выполнении, область действия функции будет объект obj, т.е. переменная this будет иметь значение obj, и this.name будет равняться "John".&lt;br /&gt;&lt;br /&gt;Добавим в качестве обработчика клика данную функцию&lt;br /&gt;JavaScript:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#test&amp;quot;).click(obj.test);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В этом случае при выполнении область действия функции будет кнопка button, т.е. переменная &lt;b&gt;this&lt;/b&gt; будет иметь значение "[button id="test"]", и this.name будет равняться "test".&lt;br /&gt;&lt;br /&gt;Для того чтобы можно было сохранить области действия функции, был добавлен метод jQuery.proxy(). Работа данного метода заключается в том, что он вместо непосредственного обработчика &lt;i&gt;возвращает "proxy" функцию&lt;/i&gt;, которая при выполнении вызовет необходимую(в нашем случае obj.test) с переопределением области вызова(this) на необходимый(в нашем случае obj).&lt;br /&gt;&lt;br /&gt;JavaScript:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#test&amp;quot;).click(jQuery.proxy(obj,&amp;quot;test&amp;quot;));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот таким простым способом можно сохранить область действия.&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/jQuery.proxy/"&gt;jQuery.proxy&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Методы проверки вхождения&lt;/h2&gt;&lt;br /&gt;- &lt;b&gt;.has()&lt;/b&gt;&lt;br /&gt;Добавлена новый метод .has(), который проверяет вхождения. Действует он аналогично селектору ":has()". В качестве аргумента проверки метод может принимать &lt;i&gt;jQuery селектор или DOM элемент&lt;/i&gt;.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;div&amp;#39;).has(&amp;#39;ul&amp;#39;);&lt;br /&gt;//аналогично&lt;br /&gt;jQuery(&amp;#39;div:has(ul)&amp;#39;);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;- &lt;b&gt;jQuery.contains()&lt;/b&gt;&lt;br /&gt;Это новый метод в версии 1.4, который проверяет вхождения одного DOM элемента в другой. Использовать его чрезвычайно просто.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery.contains(document.documentElement, document.body); // true&lt;br /&gt;jQuery.contains(document.body, document.documentElement); // false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/has/"&gt;has&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/jQuery.contains/"&gt;contains&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Выбор элементов "До"&lt;/h2&gt;&lt;br /&gt;В тяжелый арсенал селекторов былы добавлены 3 метода: "&lt;b&gt;nextUntil&lt;/b&gt;", "&lt;b&gt;prevUntil&lt;/b&gt;", "&lt;b&gt;parentsUntil&lt;/b&gt;". &lt;br /&gt;&lt;br /&gt;Методы "nextUntil", "prevUntil" предназначены для ограничения выбора элементов. Выбор элементов будет прекращен, когда условие, переданное в качестве первого аргумента, не будет истина. Например, если у вас есть следующий html&lt;br /&gt;Html:&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;jQuery 1.2&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;jQuery 1.3&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;jQuery 1.4&amp;lt;/li&amp;gt;&lt;br /&gt;    &amp;lt;li&amp;gt;more&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;JavaScript:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;ul li:contains(jQuery 1.2)&amp;#39;).nextUntil(&amp;#39;:contains(more)&amp;#39;);&lt;br /&gt;// будут выбраны значения jQuery 1.3, jQuery 1.4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Метод "parentsUntil" действует похожим способом с двумя предыдущими аналогами, но выбирает все родительские элементы пока условие селектора ложно.&lt;br /&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/prevUntil/"&gt;nextUntil&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/nextUntil/"&gt;prevUntil&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/parentsUntil/"&gt;parentsUntil&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Множественное добавление обработчиков событий&lt;/h2&gt;&lt;br /&gt;В статье "&lt;a href="http://night-fairy-tales.com/2009/12/jquery-tips-1-11.html"&gt;jQuery tips. Часть 1. 11 моментов о которых необходимо знать&lt;/a&gt;" я уже писал об интересном решении от Keegan Watkins, которое позволяло добавлять множество обработчиков событий в одном методе.&lt;br /&gt;&lt;br /&gt;Как видим, разработчики jQuery добавили такую возможность в jQuery 1.4.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var i = 0;&lt;br /&gt;//Добавляем обработчики событий&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).bind({&lt;br /&gt; click : function(event) {&lt;br /&gt;  //обработчик события click&lt;br /&gt;  i += 1;&lt;br /&gt;  if (i&amp;gt;=100) {&lt;br /&gt;     $this.unbind(event);&lt;br /&gt;  }&lt;br /&gt; },&lt;br /&gt; mouseover : mouseoverHandler,&lt;br /&gt; mouseout : mouseoutHandler&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function mouseoverHandler(e) {&lt;br /&gt; //обработчик события mouseover&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function mouseoutHandler(e) {&lt;br /&gt; //обработчик события mouseout&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).unbind(&amp;quot;click&amp;quot;); //Удаляем все обработчики события click&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).unbind(); //Удаляем ВСЕ обработчики событий&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/bind/"&gt;bind&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/unbind/"&gt;unbind&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Новые события в jQuery&lt;/h2&gt;&lt;br /&gt;В jQuery 1.4 можно выделить 2 интересных связанных с событиями новшества, были добавлены новые события ".focusin()", ".focusout()" и появилась возможность делегировать дополнительные типы событий используя метод ".live()".&lt;br /&gt;&lt;br /&gt;- "&lt;b&gt;.focusin(handler(eventObject))&lt;/b&gt;" возникает, когда элемент или дочерние элементы получают фокус, "&lt;b&gt;.focusout(handler(eventObject))&lt;/b&gt;", когда элемент или дочерние элементы теряют фокус.&lt;br /&gt;&lt;br /&gt;Добавление этих событий меня немного удивило. &lt;i&gt;Чем не устроили события "focus", "blur"?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Объяснение было найдено при прослушивании &lt;a rel="ext_link" href="http://content.jquery.com/podcast/jQueryPodcast-007-jQuery14.mp3"&gt;jQuery Podcast with John Resig&lt;/a&gt;. Суть заключается в том, что события "focus", "blur" по спецификации W3C &lt;a href="http://www.w3.org/TR/DOM-Level-2-Events/events.html"&gt;Document Object Model (DOM) Level 2 Events Specification&lt;/a&gt; не имеют возможности "всплывания"(bubbles) событий(крайне важный момент при использовании в делегировании событий :) ). Во всех современных браузерах, кроме IE, данный момент был реализован в точности со спецификацией.&lt;br /&gt;&lt;br /&gt;Но в тоже врямя, в спецификации W3C описаны событий &lt;b&gt;DOMFocusIn&lt;/b&gt;, &lt;b&gt;DOMFocusOut&lt;/b&gt;, которые как раз имеют указанную возможность. Команда разработчиков приняла решение упростить названия и добавить еще 2 новых события. Возможность всплывания и реализация данных событий позволила расширить возможности их делегирования, используя метод ".live()".&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).focusin(function(){&lt;br /&gt;  //элемент получил фокус&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;$(&amp;quot;#myID&amp;quot;).focusout(function() {&lt;br /&gt;  //элемент потерял фокус&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;.live()&lt;/b&gt;&lt;br /&gt;Расширен список событий, которые можно делегировать с помощью данного метода. Добавлена поддержка &lt;b&gt;"submit"&lt;/b&gt;, &lt;b&gt;"change"&lt;/b&gt;, &lt;b&gt;"focusin"&lt;/b&gt; и &lt;b&gt;"focusout"&lt;/b&gt; событий. Также появилась расширенная аннотация "&lt;b&gt;.live(eventType,[eventData],handler)&lt;/b&gt;".&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;input&amp;#39;).live(&amp;#39;focusin&amp;#39;, function(){&lt;br /&gt;    // фокус передан элементу&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/focusin/"&gt;.focusin()&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/focusout/"&gt;.focusout()&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/live/"&gt;.live()&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Расширенные возможности анимации&lt;/h2&gt;&lt;br /&gt;В данную версию jQuery был внесен ряд интересных функций для анимации.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Удаление событий с очереди&lt;/b&gt;&lt;br /&gt;Появился новый метод "&lt;b&gt;.clearQueue([queueName])&lt;/b&gt;". При вызове метода без параметров все события, которые были добавлены в очередь с использованием метода ".queue()" и не были запущены, удаляются. &lt;br /&gt;&lt;br /&gt;Параметр queueName необходим для удаления событий в определенной очереди, по умолчанию - fx. Данный метод выполняет те же действия, что и вызов метода ".stop(true)", но в отличии от метода ".stop()" может применяться не только в анимации.&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;Пауза при анимации&lt;/b&gt;&lt;br /&gt;До версии 1.4 не было реализовано возможности паузы в анимации. Для реализации необходимо было использовать javascript функцию "setTimeout". На базе плагина &lt;a rel="ext_link" href="http://blindsignals.com/index.php/2009/07/jquery-delay/"&gt;jQuery Delay&lt;/a&gt; от Clint Helfers был добавлен функционал реализующий задержку. Необходимо вызвать метод "delay()", передав первым параметром количество миллисекунд задержки.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery(&amp;#39;#myId&amp;#39;)&lt;br /&gt;    .fadeOut()&lt;br /&gt;    .delay(300) // Задержка на 300 мс&lt;br /&gt;    .fadeIn();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/clearQueue/"&gt;.clearQueue()&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/delay"&gt;.delay()&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h2&gt;Методы по работе с объектами&lt;/h2&gt;&lt;br /&gt;- &lt;b&gt;jQuery.isEmptyObject(object)&lt;/b&gt;&lt;br /&gt;Данный метод проверяет пустой ли объект. Вернет значение false в случае, когда объект будет иметь хотя бы одно свойство.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery.isEmptyObject({}); //true&lt;br /&gt;jQuery.isEmptyObject(null); //true&lt;br /&gt;jQuery.isEmptyObject({ item: null }); //false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- &lt;b&gt;jQuery.isPlainObject(object)&lt;/b&gt;&lt;br /&gt;Этот метод проверяет, является ли объект плоским, т.е. он должен иметь тип "Object", не должен иметь своих конструкторов и не может иметь свойств от других объектов. На практике такие объекты могут быть созданы 2-мя путями:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var plainObject1 = {};&lt;br /&gt;var plainObject2 = new Object();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery.isPlainObject({}); // true&lt;br /&gt;jQuery.isPlainObject(new Object()); // true&lt;br /&gt;jQuery.isPlainObject({ release: &amp;quot;jQuery 1.4&amp;quot; }); // true&lt;br /&gt;jQuery.isPlainObject(document.createTextNode(&amp;quot;Используем jQuery 1.4.&amp;quot;)); //false&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;- сериализация объектов &lt;b&gt;jQuery.param&lt;/b&gt;&lt;a name="jQuery.param"&gt;&lt;/a&gt;&lt;br /&gt;В jQuery 1.4 добавлена поддержка вложенных сериализаций параметров с использованием метода jQuery.param, который пользуется популярностью в PHP и поддерживается в Ruby on Rails.&lt;br /&gt;&lt;br /&gt;При сериализации объекта "{foo: ["bar", "baz"]}" мы получим следующий результат:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;jQuery.param({foo: [&amp;quot;bar&amp;quot;, &amp;quot;baz&amp;quot;]});&lt;br /&gt;//jQuery 1.4 - &amp;quot;foo[]=bar&amp;amp;foo[]=baz&amp;quot;&lt;br /&gt;//jQuery 1.3.2 - &amp;quot;foo=bar&amp;amp;foo=baz&amp;quot;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;При переходе на jQuery 1.4 данное изменение может нарушить работу вашего кода.&lt;/i&gt; Если вы хотите использовать старый способ, то вам необходимо будет воспользоваться следующим решением:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;// Включаем старый способ сериализации на уровне всего фреймворка&lt;br /&gt;jQuery.ajaxSettings.traditional = true;&lt;br /&gt; &lt;br /&gt;// Включаем старый способ сериализации для одной операции&lt;br /&gt;jQuery.param( stuff, true );&lt;br /&gt; &lt;br /&gt;// Включаем старый способ сериализации для одного Ajax запроса&lt;br /&gt;$.ajax({ data: stuff, traditional: true });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="hl"&gt;&lt;i&gt;Детальная информация:&lt;/i&gt; &lt;a rel="ext_link" href="http://api.jquery.com/jQuery.isPlainObject/"&gt;jQuery.isPlainObject&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/jQuery.isEmptyObject/"&gt;jQuery.isEmptyObject&lt;/a&gt;, &lt;a rel="ext_link" href="http://api.jquery.com/jQuery.param/"&gt;jQuery.param&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Еще несколько &lt;strike&gt;бесполезных&lt;/strike&gt; функций:&lt;br /&gt;jQuery() - возвращает пустой список.&lt;br /&gt;jQuery.noop() - возвращает пустую функцию.&lt;br /&gt;&lt;br /&gt;Детальную информацию вы можете найти на сайте &lt;a rel="ext_link" href="http://jquery.com/"&gt;jQuery&lt;/a&gt;, &lt;a rel="ext_link" href="http://jquery14.com/"&gt;14 Days of jQuery&lt;/a&gt;, &lt;a href="http://futurecolors.ru/jquery/"&gt;jQuery 1.4 API Cheat Sheet&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2038177047382960137?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/UFPzuJK3EaY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2038177047382960137/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2010/01/jquery-14.html#comment-form" title="Комментарии: 4" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2038177047382960137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2038177047382960137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/UFPzuJK3EaY/jquery-14.html" title="Исследуем новые возможности jQuery 1.4" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>4</thr:total><feedburner:origLink>http://night-fairy-tales.com/2010/01/jquery-14.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkACQX89fSp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2200768080562320885</id><published>2009-12-29T09:39:00.000-08:00</published><updated>2010-04-23T06:19:20.165-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:19:20.165-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="test" /><category scheme="http://www.blogger.com/atom/ns#" term="FireFox" /><category scheme="http://www.blogger.com/atom/ns#" term="FireBug" /><title>Используем FireBug для удобной отладки JavaScript</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QbSedXExCVIyuoJJe8jlUkiDiz0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QbSedXExCVIyuoJJe8jlUkiDiz0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QbSedXExCVIyuoJJe8jlUkiDiz0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QbSedXExCVIyuoJJe8jlUkiDiz0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/firebug-web-development.png"/&gt;&lt;/div&gt;FireBug один из прекраснейших плагинов разработанных для FireFox. Он сочетает в себе удобство, широкий функционал и возможность написания своих дополнений. Вот уже долгое время FireBug стал для меня незаменимым помощником в веб программировании. Чего стоит возможность просмотра и редактирования html разметки, CSS стилей, мониторинг сетевых запросов и т.д. Каждый из инструментов, предоставляемый FireBug, отличается простой.&lt;br /&gt;&lt;br /&gt;В данной статье хотел рассказать про то, как может помочь FireBug при отладке JavaScript кода, а именно про функции и возможности объекта console.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Логирования&lt;/h2&gt;&lt;br /&gt;Одной из самых незаменимых возможностей при разработке JavaScript сценариев является логирование. Используя FireBug вы получаете 3 преимущества:&lt;br /&gt;1. Возможность задавать разные типы сообщений при логировании.&lt;br /&gt;3. Можете воспользоваться строкой форматирования вывода.&lt;br /&gt;4. Можете группировать сообщения логирования.&lt;br /&gt;&lt;br /&gt;При логировании иногда важно разделять сообщения по &lt;b&gt;типам критичности&lt;/b&gt;, что бы однозначно определить сбой ли это, небольшое отклонение, или просто сообщение про выполнения каких либо действий. FireBug поддерживает 5 типов логирования:&lt;br /&gt;1. log - обычное сообщение.&lt;br /&gt;3. debug - отладочное сообщение. В консоль возле такой записи будет добавлена ссылка на строку вызова.&lt;br /&gt;2. info - информационное сообщение. Будет отображаться иконка информации (&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_info.png"/&gt;), а в тексте будет ссылка на строку вызова.&lt;br /&gt;4. warn - сообщение предупреждение. Будет отображаться иконка предупреждения (&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_warn.png"/&gt;), строка сообщение будет подсвечена цветом, а в тексте будет ссылка на строку вызова.&lt;br /&gt;5. error - сообщения об ошибки. Текст такого сообщения будет красного цвета, будет отображаться иконка ошибки (&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_error.png"/&gt;) и так же как у всех важных сообщений будет ссылка на строку вызова.&lt;br /&gt;&lt;br /&gt;Методы имеют следующий формат:&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;console.log(object[, object, ...]); //обычное сообщений&lt;br /&gt;console.debug(object[, object, ...]); //отладочное сообщение&lt;br /&gt;console.info(object[, object, ...]); //информационное сообщение&lt;br /&gt;console.warn(object[, object, ...]); //сообщение предупреждение&lt;br /&gt;console.error(object[, object, ...]); //сообщения об ошибки&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Первым параметром передается строка форматирования, дальше вы можете указать параметры для вывода. При этом будет поддерживаются следующие правила вывода параметров&lt;br /&gt;&lt;div class="hl"&gt;&lt;br /&gt;%s  - сторока&lt;br /&gt;%d, %i  - целое число&lt;br /&gt;%f  - дробное число&lt;br /&gt;%o  - ссылка на объект&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Если вы не задали в строке форматирования вывод какого то из параметров, то не беспокойтесь, данный параметр будет добавлен в конце строки. При выводе параметра типа объекта (%o) кроме текстового значение будет отображаться еще и ссылка, при клике на которую объект отобразится в табе DOM.&lt;br /&gt;&lt;br /&gt;При выводе данный функционал будет выглядеть следующим образом&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;console.log("Тип сообщения: %s. Обычное сообщение", "log");&lt;br /&gt;console.debug("Тип сообщения: %s. Отладочное сообщение", "debug");&lt;br /&gt;console.info("Тип сообщения: %s. Информационное сообщение", "info");&lt;br /&gt;console.warn("Тип сообщения: %s. Сообщение предупреждение", "warn");&lt;br /&gt;console.error("Тип сообщения: %s. Сообщения об ошибки", "error");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_logging.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Одной из интересных особенностей, которые обладает FireBug при логировании является &lt;b&gt;группирование логов&lt;/b&gt;. Для этого присутствуют 3 функции: console.group, console.groupCollapsed, console.groupEnd.&lt;br /&gt;&lt;br /&gt;Каждая из них имеет следующий формат&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;console.group(object[, object, ...]); //начало групирования&lt;br /&gt;console.groupCollapsed(object[, object, ...]); //начало группирования, с сворачиванием результата&lt;br /&gt;console.groupEnd(); //окончание групирования&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Начало группы определяется функциями console.group и console.groupCollapsed, для того чтобы закрыть группу, необходимо вызвать функцию console.groupEnd. Так же можно добавлять подгруппы, количество подгрупп ограничено, наверное, только здравым смыслом :).&lt;br /&gt;&lt;br /&gt;Например, у нас есть вот такой JavaScript. В котором желательно знать в каком из циклов возникли ошибки. &lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;for(i = 0; i &lt; 3; i++) {&lt;br /&gt;    if (i===0) {&lt;br /&gt;        console.groupCollapsed("Обработка вложенного цикла %s раз/а", i);&lt;br /&gt;    } else {&lt;br /&gt;        console.group("Обработка вложенного цикла %s раз/а", i);  &lt;br /&gt;    }&lt;br /&gt;    for(j = i-2; j &lt; i+2; j++) {&lt;br /&gt;        if (i-j&gt;0){&lt;br /&gt;            console.error("ошибка в коде! i = %i; j = %i", i, j); //сообщения об ошибки&lt;br /&gt;        } else {&lt;br /&gt;            console.log("i = %i; j = %i", i, j);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    console.groupEnd();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Вывод сообщений будет иметь следующий вид&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_grouping.png"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Одна из интересных функций для отображения количество вызовов методов &lt;b&gt;console.count&lt;/b&gt;.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;for(i = 0; i &lt; 3; i++) {&lt;br /&gt; for(j = i-2; j &lt; i+2; j++) {&lt;br /&gt;  console.count("Count set j = ");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Результат исполнения&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_count.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Отслеживаем время выполнения&lt;/h2&gt;&lt;br /&gt;Для определения узких мест при разработке сценариев на JavaScript иногда приходиться отслеживать время выполнения. Для таких целей FireBug имеет два метода &lt;b&gt;console.time, console.timeEnd&lt;/b&gt; и &lt;b&gt;console.profile, console.profileEnd&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;Если вам необходимо определить время выполнение части когда, пользуйтесь функциями &lt;b&gt;console.time, console.timeEnd&lt;/b&gt;. При этом можете инициализировать множество таймеров. Рассмотрим работу на примере.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;console.time("Весь цикл");&lt;br /&gt;for(i = 0; i &lt; 3; i++) {&lt;br /&gt;    console.time("Одна итерация");&lt;br /&gt;    if (i===0) {&lt;br /&gt;        console.groupCollapsed("Обработка вложенного цикла %s раз/а", i);&lt;br /&gt;    } else {&lt;br /&gt;        console.group("Обработка вложенного цикла %s раз/а", i);&lt;br /&gt;    }&lt;br /&gt;    for(j = i-2; j &lt; i+2; j++) {&lt;br /&gt;        if (i-j&gt;0){&lt;br /&gt;            console.error("ошибка в коде! i = %i; j = %i", i, j); //сообщения об ошибки&lt;br /&gt;        } else {&lt;br /&gt;            console.log("i = %i; j = %i", i, j);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    console.groupEnd();&lt;br /&gt;    console.timeEnd("Одна итерация");&lt;br /&gt;}&lt;br /&gt;console.timeEnd("Весь цикл");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Результат логирования&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_timing.png"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Если же вы хотите определить время выполнения функции, количество вызовов каждой функции, процентное распределение между временем каждой функции, то вам лучше воспользоваться &lt;b&gt;console.profile, console.profileEnd&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Для того чтобы начать отслеживание вызовете функцию console.profile, для окончания отслеживания, вам будет необходимо вызвать функцию console.profileEnd.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;function first(){&lt;br /&gt; for(i = 0; i &lt; 3; i++) {&lt;br /&gt;  second(i);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function second(i) {&lt;br /&gt; for(j = i-2; j &lt; i+2; j++) {&lt;br /&gt;  var p = i*2-j%2+i*j;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;console.profile("first");&lt;br /&gt;first();&lt;br /&gt;console.profileEnd();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_profiling.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Тестирование&lt;/h2&gt;&lt;br /&gt;Для построение тестовых сценариев можно воспользоваться функцией &lt;b&gt;console.assert&lt;/b&gt;. Если выражение, которое будет передано в функцию ложь, то возникнет ошибка.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;function first(){&lt;br /&gt; for(i = 0; i &lt; 3; i++) {&lt;br /&gt;  second(i);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function second(i) {&lt;br /&gt; for(j = i-2; j &lt; i+2; j++) {&lt;br /&gt;  var p = i*2-j%2+i*j;&lt;br /&gt;  console.log("Значение p=%i.",p);&lt;br /&gt;  console.assert(p&gt;=0); &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;first();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Результат&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_assert.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Просмотр значение элементов&lt;/h2&gt;&lt;br /&gt;Тяжелый арсенал FireBug завершает функции &lt;b&gt;console.dir и console.dirxml&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;console.dir&lt;/b&gt; необходим для вывода в лог всех свойств или методов доступных у объекта.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;function first() {&lt;br /&gt; for(i = 0; i &lt; 2; i++) {&lt;br /&gt;  for(j = i-1; j &lt; i+1; j++) {&lt;br /&gt;   var p = i*2-j%2+i*j;&lt;br /&gt;   var m = ({ "item" : p, "item1" : p*100 });&lt;br /&gt;   console.dir(m);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;first();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Результат выполнения&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_dir.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;console.dirxml&lt;/b&gt; необходим для отображения xml дерева html элемента.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;table id=&amp;quot;test&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;пример 1&amp;lt;/td&amp;gt;&lt;br /&gt;        &amp;lt;td&amp;gt;пример 2&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;    var t = document.getElementById(&amp;#39;test&amp;#39;);&lt;br /&gt;    console.dirxml(t);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Рузультат выполнения&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/console_dirxml.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Использования FireBug в разных браузерах&lt;/h2&gt;&lt;br /&gt;FireBug поставляется как плагин к FireFox. Если вы в сценарий внедряете такие функции, то при проверке в IE, Opera (Safari поддерживает такие же методы логирования) у вас возникнет исключение. Ситуацию можно исправить 2-мя способами.&lt;br /&gt;&lt;br /&gt;Если вам не нужна проверка в остальных браузерах, то можете воспользоватся решением от &lt;a href="http://stackoverflow.com/questions/1441860/console-log-statements-do-not-appear-in-safari-error-log"&gt;Eric Nguyen&lt;/a&gt;, добавите на свою страницу следующий код.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;if (!("console" in window) || !("firebug" in console))&lt;br /&gt; {&lt;br /&gt;     var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",&lt;br /&gt;     "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];&lt;br /&gt;&lt;br /&gt;     window.console = {};&lt;br /&gt;     for (var i = 0; i &lt; names.length; ++i)&lt;br /&gt;         window.console[names[i]] = function() {}&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Если же вам все же необходимы данные функции, то можете подключить &lt;a href="http://getfirebug.com/wiki/index.php/Firebug_Lite"&gt;FireBug Lite&lt;/a&gt;, который может работать в других браузерах. Для этого добавить следующий код себе на страницу.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;window.onload = function() {&lt;br /&gt;    if (window.console) { return; };&lt;br /&gt;    firebug=document.createElement(&amp;#39;script&amp;#39;);&lt;br /&gt;    firebug.setAttribute(&amp;#39;src&amp;#39;,&amp;#39;http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js&amp;#39;);&lt;br /&gt;    document.body.appendChild(firebug);&lt;br /&gt;    (function(){if(window.firebug.version){firebug.init();}else{setTimeout(arguments.callee);}})();void(firebug);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот и все магия о которой я хотел вам рассказать.&lt;br /&gt;&lt;br /&gt;&lt;div class="hl"&gt;Эта моя последняя статья в этом году :). &lt;b&gt;Хочу всех поздравить с Новым Годом&lt;/b&gt;. И пожелать, чтобы наступающий год принес вам больше счастья и радости, чем позволят ваши самые смелые желания!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2200768080562320885?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/ZGHZY2pF0VQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2200768080562320885/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/12/firebug-javascript.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2200768080562320885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2200768080562320885?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/ZGHZY2pF0VQ/firebug-javascript.html" title="Используем FireBug для удобной отладки JavaScript" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/12/firebug-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4ARX86cCp7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2739362057480865571</id><published>2009-12-23T23:44:00.000-08:00</published><updated>2010-04-23T06:22:24.118-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:22:24.118-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="lazy load" /><category scheme="http://www.blogger.com/atom/ns#" term="dynamic load" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><title>Используем отложенную загрузку и анализ JavaScript кода</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Mt7C6Aq1AfLfvo_QGtjtXmuKLyo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Mt7C6Aq1AfLfvo_QGtjtXmuKLyo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Mt7C6Aq1AfLfvo_QGtjtXmuKLyo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Mt7C6Aq1AfLfvo_QGtjtXmuKLyo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/speedometer.png"/&gt;&lt;/div&gt;При разработке сайтов использования JavaScript стало давно привычной и необходимой технологией. И чем больше мы используем сценарии написанные на JavaScript, тем больше получается кода, т.е. размер скриптов увеличивается. Увеличение размера загружаемых скриптов приводит к увеличению времени загрузки страниц, что в свою очередь плохо влияет на реакцию посетителей сайта.&lt;br /&gt;&lt;br /&gt;Например, при поиске информации, я открываю первые 5 результатов, и практически всегда, первые два результатах дают 100% информации, просматриваю конечно те страницы, которые загрузились первыми. Но, как ни странно, это может влиять и на получения прибыли от сайтов. Google констатировал, что после переработки страниц, время загрузки страницы увеличилось на 0.4 секунды для 10 и на 0.9 для 30 поисковых результатов, это привело к &lt;b&gt;уменьшению поискового трафика и доход от рекламы на 20%&lt;/b&gt; (Linden, 2006)!&lt;br /&gt;&lt;br /&gt;Если разобраться на что уходит время при работе с Javascript на этапе загрузки страницы, то можно выделить 3 этапа:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;1. Загрузка файла/кода JavaScript&lt;br /&gt;2. Анализ/разбор JavaScript кода браузером&lt;br /&gt;3. Выполнения JavaScript кода на этапе загрузки страницы&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Первый и второй этап в большинстве случаев и вызывают задержку. Одним из оптимизационных действий, которые рекомендуется делать, является перенос JavaScript кода в отдельные файлы и добавление ссылки на эти файлы перед закрывающимся тегом body.&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;    //ваш html разметка секции head&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;    //ваш html разметка секции body&lt;br /&gt;    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;myJavaScript.js&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Первое делается для того, чтобы браузер мог закешировать JavaScript код. Второй, чтобы дизайн страницы отрисовался раньше, чем начнут загружаться файлы с JavaScript кодом.&lt;br /&gt;&lt;br /&gt;При оптимизации некоторых вещей иногда думаешь, а зачем это вообще все нужно? Как оказывается, данный вопрос можно применить к JavaScript скриптам.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;А почему скрипты должны загружаться и анализироваться в начале загрузки страницы? Сколько процентов кода выполняется на этапе загрузки?!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Скорей всего ответ будет приблизительно следующий - незначительная часть кода будет выполнятся при первой загрузке страницы и, думаю, бывают моменты, когда большая часть JavaScript кода вообще не используется.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Динамическая загрузка JavaScript кода&lt;/h2&gt;&lt;br /&gt;Вы можете предусмотреть такие ситуации и воспользоваться возможностью динамической загрузкой JavaScript кода.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Динамическое изменение свойства src&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;script src=&amp;#39;&amp;#39; id=&amp;quot;s1&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var s1 = document.getElementById(&amp;quot;s1&amp;quot;);&lt;br /&gt;s1.src= &amp;quot;myJavaScript.js&amp;quot;;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Динамическое создание script тега&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;var script = document.createElement(&amp;#39;script&amp;#39;);&lt;br /&gt;script.src = &amp;quot;myJavaScript.js&amp;quot;;&lt;br /&gt;document.getElementsByTagName(&amp;#39;head&amp;#39;)[0].appendChild(script);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Уловка от John Resig&lt;/b&gt;&lt;br /&gt;Если совместить динамическую загрузку JavaScript кода с интересной уловкой описанной John Resig в статье &lt;a href="http://ejohn.org/blog/degrading-script-tags/"&gt;Degrading Script Tags&lt;/a&gt;, то выполнения скриптов после загрузки страницы можно реализовать следующим образом.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;window.onload = function() {&lt;br /&gt;    var script = document.createElement(&amp;#39;script&amp;#39;);&lt;br /&gt;    script.src = &amp;quot;myJavaScript.js&amp;quot;;&lt;br /&gt;    script.text = &amp;quot;my.init()&amp;quot;; // выполняем свои скрипты&lt;br /&gt;    document.getElementsByTagName(&amp;#39;head&amp;#39;)[0].appendChild(script);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Скрипт "my.init()" будет выполнен, когда будет успешно загружен JavaScript код. При этом, если при загрузки возникнет ошибка, скрипт не будет выполнен. Работает в Firefox, Opera, Safari, и всеми "уважаемом" IE.&lt;br /&gt;&lt;h2&gt;Отложенный анализ/разбор JavaScript кода браузером&lt;/h2&gt;&lt;br /&gt;Как показывает практика, при нормальном скорости интернета файлы с JavaScript кодом закачиваются быстро(кеширования тоже спасает ситуацию), но при больших скриптах много уходит времени на анализ и разбор кода браузером. Для уменьшения времени отклика можно воспользоваться отложенным анализом/разбором, в качестве метода загрузки воспользуемся классом XmlHttpRequest.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;  function loadFile(url) {&lt;br /&gt;     function callback() {&lt;br /&gt;      if (req.readyState == 4) { // 4 = Loaded&lt;br /&gt;        if (req.status == 200) {&lt;br /&gt;          //можно реализовать анализ скриптов по требованию&lt;br /&gt;          eval(req.responseText);&lt;br /&gt;        } else {&lt;br /&gt;          // ошибка в получении ответа&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    };&lt;br /&gt;    var req = new XMLHttpRequest();&lt;br /&gt;    req.onreadystatechange = callback;&lt;br /&gt;    req.open(&amp;quot;GET&amp;quot;, url, true);&lt;br /&gt;    req.send(&amp;quot;&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Для загрузки и анализа скриптов вам понадобится вызвать метод "loadFile" с указанием url ардеса файла. Ключевым моментом в данной реализации есть функция &lt;b&gt;eval&lt;/b&gt;, которая и производит анализ/разбор полученного кода.&lt;br /&gt;&lt;br /&gt;На данный момент у меня пока не сложилось цельное решение, которое можно будет применить для любой ситуации. Но вот такие методики работы с загрузкой и анализом JavaScript файл позволят уменьшить время "отклика" при загрузке сайта, что благоприятно повлиять на отношения пользователей.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2739362057480865571?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/HHn-iWHYAuE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2739362057480865571/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/12/javascript.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2739362057480865571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2739362057480865571?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/HHn-iWHYAuE/javascript.html" title="Используем отложенную загрузку и анализ JavaScript кода" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/12/javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cFSXo5eip7ImA9WxFREE8.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-3308968048892502533</id><published>2009-12-14T13:34:00.001-08:00</published><updated>2010-04-23T06:23:38.422-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T06:23:38.422-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery tips" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><title>jQuery tips. Часть 1.  11 моментов о которых необходимо знать</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YCCu4P8zFPIKm0bw68o04V2VHNU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YCCu4P8zFPIKm0bw68o04V2VHNU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YCCu4P8zFPIKm0bw68o04V2VHNU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YCCu4P8zFPIKm0bw68o04V2VHNU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="topimg"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/jquery-tips.jpg"/&gt;&lt;/div&gt;jQuery сейчас один из самых популярных javascript фреймворков, который радует нас своей простой и легкостью в использовании.&lt;br /&gt;&lt;br /&gt;Хочу начать серию статей в которых расскажу про секреты и особенности jQuery. Одни из них помогут вам упростить процесс программирования, другие покажут как повысить производительность или как воспользоваться многогранностью jQuery.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Определяем тип браузера&lt;/h2&gt;&lt;br /&gt;Сразу вспомнились мои первые робкие шаги в веб программировании и то, сколько недовольства возникало при одной мысли о том, что html,css и javascript необходимо проверять в разных браузерах, а в случае с IE и в разных версиях :(. Используя jQuery сам процесс определения типа браузера стал очень прост и удобен.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;$.browser.safari //Safari browser&lt;br /&gt;$.browser.opera //Opera browser&lt;br /&gt;$.browser.msie //IE browser&lt;br /&gt;$.browser.mozilla //FireFox browser&lt;br /&gt;&lt;br /&gt;if ($.browser.mozilla) {&lt;br /&gt;  alert('ОоО. Так держать!');&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Так же вы можете узнать версию браузера&lt;br /&gt;&lt;pre class="brush:js"&gt;$.browser.version&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Проверка на конфликтность&lt;/h2&gt;&lt;br /&gt;jQuery в качестве упрощенного обращения использует переменную "$". Но как же быть, если данную переменную использует другой фреймворк? Для того чтобы определить, конфликтует ли использование данной переменной, нужно вызвать функцию&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;jQuery.noConflict();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Например, если конфликт имеет место, то чтобы задать выбор всех дивов, вместо конструкции &lt;b&gt;$('div')&lt;/b&gt;, вам необходимо будет использовать &lt;b&gt;jQuery('div')&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;В случае написание своих скриптов вы можете воспользоваться следующей конструкцией&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;$jq=jQuery.noConflict();&lt;br /&gt;$jq('div');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Такое решение в большинстве случаев избавит вас от возможных проблем при конфликтах.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Создание html элемента&lt;/h2&gt;&lt;br /&gt;Очень простой функционал, но действительно необходимый :).&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;var newDiv = $('&lt;div&gt;&lt;/div&gt;'); //Создание div элемента&lt;br /&gt;newDiv.attr("id","myNewDiv").appendTo("body"); //Добавление на страницу&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Изменение текста в элементе&lt;/h2&gt;&lt;br /&gt;Таких способом можно не только изменить текст, но и поломать разметку, будьте осторожны при использования данного функционала.&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;var el = $('#id');&lt;br /&gt;el.html(el.html().replace(/mytext/ig, ""));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Проверяем существования элемента&lt;/h2&gt;&lt;br /&gt;Чтобы не допускать ошибок в коде, перед работой с элементами, необходимо проверять их наличие и обрабатывать ситуацию когда они отсутствуют.&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;if ($('#author').length) {  &lt;br /&gt;    //ура. существует&lt;br /&gt;} else {&lt;br /&gt;    // :(. отсутствует&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Получаем значение элемента&lt;/h2&gt;&lt;br /&gt;Используя javascript код, для того чтобы получить значение элемента "select" вам понадобится выбрать сам элемент, перебрать дочерние и определить какой же элемент выбран. В jQuery данная задача решается одной строчкой&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var value = $('#author').val(); // возвращает значение&lt;br /&gt;$('#author').val(value); // устанавливает значение&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Запоминание данных в элементе&lt;/h2&gt;&lt;br /&gt;Для хранения данных в элементах управления можно использовать функцию data. Детальную информацию вы сможете найти на &lt;a href="http://docs.jquery.com/Core/data"&gt;сайте разработчиков&lt;/a&gt;.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$("#formComment").data("myData", { name : "my name", description : "my description"}); //Сохранение данных в элемент с идентификатором "formComment"&lt;br /&gt;&lt;br /&gt;var myData = $("#formComment").data("myData"); //Получение данных&lt;br /&gt;&lt;br /&gt;$("#formComment").removeData("myData"); //удаление данных&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Сбор данных&lt;/h2&gt;&lt;br /&gt;Вот вы написали скрипты для асинхронной отправки данных на сервер, сбор данных сделали через выбор необходимых элементов и выбор из них значений. Но тут оказалось, что должны быть другие поля для заполнения. Как избежать дополнительной работы?&lt;br /&gt;&lt;br /&gt;Разработчики jQuery добавили в свой арсенал "тяжелой артиллерии" функции по сбору данных с элементов ввода. Используя функции &lt;b&gt;serialize&lt;/b&gt;, &lt;b&gt;serializeArray&lt;/b&gt; вам не потребуется собирать данные вручную.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;form id=&amp;quot;commentform&amp;quot; method=&amp;quot;post&amp;quot; &amp;gt;&lt;br /&gt;   &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;author&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;   &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;email&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;   &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;url&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;   &amp;lt;textarea rows=&amp;quot;10&amp;quot; cols=&amp;quot;100%&amp;quot; name=&amp;quot;comment&amp;quot;/&amp;gt;&amp;lt;/br&amp;gt;&lt;br /&gt;   &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Submit Comment&amp;quot; name=&amp;quot;submit&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Javascript&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;var str = $("#commentform").serialize(); //Строка. Результат "email=emailData&amp;url=urlData&amp;comment=commentData"&lt;br /&gt;&lt;br /&gt;var array = $("#commentform").serializeArray(); //Массив значений. Результат "[{ name:"email", value:"emailData" }, { name:"url", value:"urlData" }, {name:"comment", value:"commentData"}]"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Есть одно маленькое ограничение, данные с элемента &lt;b&gt;&amp;lt;input type=&amp;quot;file&amp;quot;/&amp;gt;&lt;/b&gt; не собираются!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Работа с обработчиками событий: bind и unbind&lt;/h2&gt;&lt;br /&gt;Для добавления обработчиков событий можете воспользоваться функциями bind и unbind.&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;function send_ajax_submit(){&lt;br /&gt; //ваш код&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$("form").bind("submit", send_ajax_submit); //Добавляет обработчик send_ajax_submit на событие "submit"&lt;br /&gt;&lt;br /&gt;$("form").unbind("submit", send_ajax_submit); //Удаляет обработчик send_ajax_submit с события "submit"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Для прерывания процесса "всплывания" события и отмены действий по умолчанию вы можете воспользоваться следующими функциями&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;function send_ajax_submit(){&lt;br /&gt;   event.preventDefault(); //отменяет действие по умолчанию. Для данного примера отменит отправку данных с формы.&lt;br /&gt;&lt;br /&gt;   event.stopPropagation(); //прерывает процесс "всплывания" события&lt;br /&gt;&lt;br /&gt;   return false; //прерывает процесс "всплывания" события и отменяет действие по умолчанию, т.е. заменяет event.preventDefault() и event.stopPropagation().&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В случае, если вы определяете несколько событий, можно воспользоваться &lt;a href="http://www.learningjquery.com/2009/06/shorthand-methods-for-unbind/comment-page-1#comment-78469"&gt;интересным решением от Keegan Watkins&lt;/a&gt;. Добавляем следующий скрипт&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;(function($) {&lt;br /&gt;&lt;br /&gt;// Keep a copy of the old methods&lt;br /&gt;$.fn._bind = $.fn.bind;&lt;br /&gt;$.fn._unbind = $.fn.unbind;&lt;br /&gt;&lt;br /&gt;// Redefine $().bind()&lt;br /&gt;$.fn.bind = function( type, data, fn ) {&lt;br /&gt; // If only a map of handlers was passed...&lt;br /&gt; return (arguments.length === 1) ? &lt;br /&gt;&lt;br /&gt; this.each(function(key, node) {&lt;br /&gt;  // Iterate over the map...&lt;br /&gt;  $.each(type, function(event, handler) {&lt;br /&gt;   event == "unload" ?&lt;br /&gt;    // ... using $.fn.one() for "unload" events...&lt;br /&gt;    $(this).one(event, handler) :&lt;br /&gt;    // ... and $.event.add() for others&lt;br /&gt;    jQuery.event.add( this, event, handler );&lt;br /&gt;  });&lt;br /&gt; }) :&lt;br /&gt;&lt;br /&gt; // Otherwise, use the existing implementation as of 1.3.2,&lt;br /&gt; // with slight syntactic modifications&lt;br /&gt; this.each(function(key, node) {&lt;br /&gt;  type == "unload" ?&lt;br /&gt;   // Use $.fn.one() for "unload" events...&lt;br /&gt;   $(this).one(type, fn) :&lt;br /&gt;   // ... and $.event.add() for others&lt;br /&gt;   jQuery.event.add( this, type, fn || data, fn &amp;&amp; data );&lt;br /&gt; });&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Redefine $().unbind()&lt;br /&gt;$.fn.unbind = function(type, fn) {&lt;br /&gt; // If only a map of handlers was passed...&lt;br /&gt; return (arguments.length === 1) &lt;br /&gt;&lt;br /&gt; this.each(function(){&lt;br /&gt;  // Iterate over the map...&lt;br /&gt;  $.each(type, function(event, handler) {&lt;br /&gt;   // ... and unbind each using event.remove()&lt;br /&gt;   jQuery.event.remove( this, event, handler );&lt;br /&gt;  });&lt;br /&gt; }) :&lt;br /&gt;&lt;br /&gt; // Otherwise, use the existing implementation as of 1.3.2,&lt;br /&gt; // copied verbatim&lt;br /&gt; this.each(function(){&lt;br /&gt;  jQuery.event.remove( this, type, fn );&lt;br /&gt; });&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;})(jQuery);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;А в своем коде используем следующий синтаксис&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;//Добавляем обработчики событий&lt;br /&gt;$("#myID").bind({&lt;br /&gt; click : function(e) {&lt;br /&gt;  //обработчик события click&lt;br /&gt; },&lt;br /&gt; mouseover : mouseoverHandler,&lt;br /&gt; mouseout : mouseoutHandler&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function mouseoverHandler(e) {&lt;br /&gt; //обработчик события mouseover&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function mouseoutHandler(e) {&lt;br /&gt; //обработчик события mouseout&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Удаляем обработчики событий&lt;br /&gt;$("#myID").unbind({&lt;br /&gt; mouseover : mouseoverHandler,&lt;br /&gt; mouseout : mouseoutHandler&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Работа с массивами&lt;/h2&gt;&lt;br /&gt;Стандартные средства javascript по работе с массивами не всегда удовлетворяют потребности, а порой даже по разному себя ведут &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Определяем количество элементов&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;//количество элементов&lt;br /&gt;$('element').size();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Преобразования выборки элементов в массив&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var arr = $("div").get();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Перебор элементов массива&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var arr = ["Запад", "Север", "Восток", "Юг"];&lt;br /&gt;jQuery.each(arr, function() {&lt;br /&gt;  //работа с элементом массива&lt;br /&gt;  var value = this;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Фильтрация элементов массива&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var arr = [1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1];&lt;br /&gt;arr = jQuery.grep(arr, function(n, i){&lt;br /&gt;    //n - текущий элемент&lt;br /&gt;    //i - номер элемента&lt;br /&gt;    return n &gt; i;&lt;br /&gt;});&lt;br /&gt;//результат [1, 9, 3, 8, 6, 9]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Обработка элементов массива&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var arr = [ "a", "b", "c", "d", "e" ]&lt;br /&gt;arr = jQuery.map(arr, function(n, i){&lt;br /&gt;  // n - элемент массива&lt;br /&gt;  // i - индекс элемента в массиве&lt;br /&gt;  return (n.toUpperCase() + i);&lt;br /&gt;});&lt;br /&gt;//результат [ "A0", "B1", "C2", "D3", "E4" ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Поиск вхождения элемента&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;var arr = [4, "Pete", 8, "John"];&lt;br /&gt;var index = jQuery.inArray("John", arr); // Если элемент не найден то возвращается значение -1&lt;br /&gt;//результат index = 3&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Объединения массивов&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$.merge([0,1,"a"],["a",3,4]); &lt;br /&gt;//результат [0,1,"a","a",3,4]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Является ли объект массивом&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;$.isArray([]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Отключаем контекстное меню&lt;/h2&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;    $(document).bind("contextmenu",function(e){&lt;br /&gt;        return false;&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Работает в : Firefox, Internet Explorer 6 &amp; 7, &lt;span style="text-decoration: line-through;"&gt;Opera&lt;/span&gt;, Safari &amp; Chrome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-3308968048892502533?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/4AdzxVapERo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/3308968048892502533/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/12/jquery-tips-1-11.html#comment-form" title="Комментарии: 3" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/3308968048892502533?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/3308968048892502533?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/4AdzxVapERo/jquery-tips-1-11.html" title="jQuery tips. Часть 1.  11 моментов о которых необходимо знать" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://4.bp.blogspot.com/-g48p_4Mz4IY/TVzI_h__I3I/AAAAAAAABT4/6MIk0ZQqWqc/s220/myphoto.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/12/jquery-tips-1-11.html</feedburner:origLink></entry></feed>

