<?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:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEYHQHc-fyp7ImA9Wx5QGEg.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634</id><updated>2010-09-07T02:35:31.957-07:00</updated><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></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>51</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;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="Комментарии: 0" /><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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="Комментарии: 4" /><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>4</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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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="Комментарии: 0" /><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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="Комментарии: 3" /><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>3</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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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="Комментарии: 22" /><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>22</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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>4</thr:total><georss:point>55.755786 37.617633</georss:point><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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="Комментарии: 2" /><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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>2</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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></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:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>3</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/12/jquery-tips-1-11.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YGSHc7fip7ImA9WxFREE4.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2166824583183143839</id><published>2009-12-02T03:49:00.000-08:00</published><updated>2010-04-23T09:12:09.906-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T09:12:09.906-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google Translation Bar" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Translate" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><title>Панель Google Translation для нуждающихся</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Oj-i-TLjrJc5Y5ADNPx3nLUF7eg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Oj-i-TLjrJc5Y5ADNPx3nLUF7eg/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/Oj-i-TLjrJc5Y5ADNPx3nLUF7eg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Oj-i-TLjrJc5Y5ADNPx3nLUF7eg/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/technical_translation.png"/&gt;&lt;/div&gt;В очередной раз, при просмотре статистики Google Analytics понял, что люди которые не понимают русский язык периодически заходят в мой блог, но так же быстро и уходят. Сразу хочется сказать: "Учите русский язык - пригодится!" :).&lt;br /&gt;&lt;br /&gt;Дабы дать возможность воспользоваться информацией блога решил добавить возможность перевода страниц. В качестве такого инструмента взял панель Google Translation. Google уже подумал за нас и добавление панели занимает считанные минуты. Но внедрив это решение понял, что мне то эта панель не нужна. После небольших "потуг" родилось решение, панель необходимо отображать только пользователям у которых язык, определяемый браузером, указан не русский.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для использования вам понадобится следующий кусок javascript-а:&lt;br /&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 ignoreLanguage = [&amp;#39;ru&amp;#39;];&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;if (!hl(ignoreLanguage)){&lt;br /&gt;d=document;b=d.body;o=d.createElement('scri'+'pt');o.setAttribute('src','http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit');o.setAttribute('type','text/javascript');b.appendChild(o);v=b.insertBefore(d.createElement('div'),b.firstChild);v.id='google_translate_element';v.style.display='none';p=d.createElement('scri'+'pt');p.text='function googleTranslateElementInit(){new google.translate.TranslateElement({pageLanguage:""},"google_translate_element");}';p.setAttribute('type','text/javascript');b.appendChild(p);&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function hl(ls) {&lt;br /&gt;if (!ls instanceof Array) { return false; }&lt;br /&gt;var cl = get_current_language();&lt;br /&gt;for(i=0;i&amp;lt;ls.length;i++) { if (cl.indexOf(ls[i])==0){ return true; } }&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function get_current_language(){&lt;br /&gt; return window.navigator.language?window.navigator.language:window.navigator.systemLanguage;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;В переменную "ignoreLanguage" можно добавить дополнительные языки, для который не будет отображаться панель перевода.&lt;br /&gt;&lt;br /&gt;При использовании данного скрипта вам понадобится &lt;a href="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" rel="download" class="tracked"&gt;jQuery&lt;/a&gt;, но вы без труда сможете исключить его из кода. Работает в IE, FireFox, Google Chrome, Opera, Safari.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;UPDATE: Исключение секций перевода&lt;/h2&gt;&lt;br /&gt;Иногда бывает необходимо исключить некоторые секции текста из перевода. Например, текст программного кода или цитату. Для этого мы можем воспользоваться Google Translator Toolkit Data API, часть тескта помещаем в html тег и зададим класс "notranslate".&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;div class="notranslate"&amp;gt;&lt;br /&gt;//Текст который не будет переведен!&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2166824583183143839?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/iaumrGtcb38" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2166824583183143839/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/12/google-translation.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2166824583183143839?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2166824583183143839?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/iaumrGtcb38/google-translation.html" title="Панель Google Translation для нуждающихся" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/12/google-translation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YDRX4_cCp7ImA9WxBTF0Q.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-4509749698974114985</id><published>2009-12-01T04:53:00.000-08:00</published><updated>2009-12-14T05:59:34.048-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-14T05:59:34.048-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flex" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="JAX-WS" /><category scheme="http://www.blogger.com/atom/ns#" term="SOAPFault" /><category scheme="http://www.blogger.com/atom/ns#" term="soap" /><title>Flex. Как правильно обработать ошибки SOAP веб-сервисов.</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/LePgwiXTJEkN1YF2ORyk9FUD0cY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LePgwiXTJEkN1YF2ORyk9FUD0cY/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/LePgwiXTJEkN1YF2ORyk9FUD0cY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/LePgwiXTJEkN1YF2ORyk9FUD0cY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Программируя на Flex, как и везде, можно встретить массу интересных моментов. Иногда можно часами ломать голову о том, на что ты наткнулся: на ошибку или на фичу. Вот один из таких моментов хотелось бы описать. &lt;br /&gt;&lt;br /&gt;Создание SOAP клиента и работа с &lt;a href="http://ru.wikipedia.org/wiki/SOAP"&gt;SOAP веб-сервисами&lt;/a&gt; (SOAP Web Service) во Flex при использовании Flex Builder 3 - сплошное удовольствие, все делается в считанные минуты. В процессе работы с SOAP веб-сервисами в ответе вы можете получить сообщение об ошибке, тело самой ошибки будет помещено в атрибут &lt;a href="http://www.w3.org/TR/2007/REC-soap12-part1-20070427/#soapfault"&gt;SOAP Fault&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Для обработки ошибки добавляем слушателя события Fault.&lt;br /&gt;&lt;pre class="brush:as3"&gt;&lt;br /&gt;private function onServiceFault(evt:FaultEvent): void {&lt;br /&gt;   Alert.show("При получении данных произошла ошибка: " + evt.fault.faultString);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Но, как ни странно, при обработке ошибки во Flex приложении я получал сообщение: "&lt;b&gt;HTTP request error&lt;/b&gt;". Оригинальное сообщение, которое было помещено в SOAP Fault в ответе веб-сервиса получить не удалось.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Много времени ушло на выяснения обстоятельств и на поиск откуда "растут ноги". Просмотрев код обработки SOAP клиента, я понял, что в случае когда &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;Http Status&lt;/a&gt; ответа приходил 500, тело пакета не анализировалось и вызывалось событие mx.rpc.events.FaultEvent с mx.rpc.Fault ошибкой. Для решения необходим был Http Status 200, а само решение пришлось реализовать на серверной стороне в веб-сервисе.&lt;br /&gt;&lt;br /&gt;Серверная часть была написана на Java и построена с использованием &lt;a href="https://jax-ws.dev.java.net/"&gt;JAX-WS Reference Implementation&lt;/a&gt;. На мой взгляд, лучшим решением было написать свой handler-chain для веб-сервиса.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;sun-jaxws.xml&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: xml"&gt;&lt;br /&gt;&lt;endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'&gt;&lt;br /&gt;    &lt;endpoint&lt;br /&gt;        name='MyService'&lt;br /&gt;        implementation='MySystem.services.MyService'&lt;br /&gt;        url-pattern='/services/MyService'&gt;&lt;br /&gt;        &lt;javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee"&gt;&lt;br /&gt;            &lt;javaee:handler-chain&gt;&lt;br /&gt;                &lt;javaee:handler&gt;&lt;br /&gt;                    &lt;javaee:handler-class&gt;MySystem.services.MySOAPHandler&lt;/javaee:handler-class&gt;&lt;br /&gt;                &lt;/javaee:handler&gt;&lt;br /&gt;            &lt;/javaee:handler-chain&gt;&lt;br /&gt;        &lt;/javaee:handler-chains&gt;&lt;br /&gt; &lt;/endpoint&gt;&lt;br /&gt;&lt;/endpoints&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;MySOAPHandler.java&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: java"&gt;&lt;br /&gt;import java.util.Set;&lt;br /&gt;&lt;br /&gt;import javax.xml.namespace.QName;&lt;br /&gt;import javax.xml.ws.handler.MessageContext;&lt;br /&gt;import javax.xml.ws.handler.MessageContext.Scope;&lt;br /&gt;import javax.xml.ws.handler.soap.SOAPMessageContext;&lt;br /&gt;import javax.xml.ws.handler.soap.SOAPHandler;&lt;br /&gt;&lt;br /&gt;public class MySOAPHandler implements SOAPHandler&lt;SOAPMessageContext&gt; {&lt;br /&gt;&lt;br /&gt; public Set&lt;QName&gt; getHeaders() { &lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void close(MessageContext context) {&lt;br /&gt;  context.put(MessageContext.HTTP_RESPONSE_CODE, new Integer(200));&lt;br /&gt;  context.setScope(MessageContext.HTTP_RESPONSE_CODE, Scope.APPLICATION);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean handleFault(SOAPMessageContext context) {&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean handleMessage(SOAPMessageContext context) {&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;После этих манипуляций на стороне клиента Flex можно обрабатывать SOAP Fault.&lt;br /&gt;&lt;pre class="brush: as3"&gt;&lt;br /&gt;import mx.rpc.soap.SOAPFault;&lt;br /&gt;&lt;br /&gt;private function onServiceFault(evt:FaultEvent): void {&lt;br /&gt;   if (evt.fault is SOAPFault){&lt;br /&gt;      var soapData:String = evt.fault.faultDetail;&lt;br /&gt;      var soapError:String = evt.fault.faultString;&lt;br /&gt;   } else {&lt;br /&gt;      Alert.show("При получении данных произошла ошибка: " + evt.fault.faultString);&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-4509749698974114985?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/rpY_RYzKmfs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/4509749698974114985/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/12/flex-soap.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4509749698974114985?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4509749698974114985?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/rpY_RYzKmfs/flex-soap.html" title="Flex. Как правильно обработать ошибки SOAP веб-сервисов." /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/12/flex-soap.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QNQHgyfyp7ImA9WxFREE4.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-1360374131889810145</id><published>2009-11-25T02:38:00.000-08:00</published><updated>2010-04-23T09:16:31.697-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T09:16:31.697-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Html" /><category scheme="http://www.blogger.com/atom/ns#" term="FireFox" /><category scheme="http://www.blogger.com/atom/ns#" term="Opera" /><category scheme="http://www.blogger.com/atom/ns#" term="Google Chrome" /><title>Выполняем HTML или JavaScript код используя адресную строку</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZDLzLyWllIlghxl8fiyp_OnLyio/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZDLzLyWllIlghxl8fiyp_OnLyio/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/ZDLzLyWllIlghxl8fiyp_OnLyio/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZDLzLyWllIlghxl8fiyp_OnLyio/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;Иногда возникает потребность увидеть результат выполнения какого-то HTML или Javascipt кода без внедрения его на страницу. Например, вы желаете увидеть как будет выглядеть плеер на видео с &lt;a href="http://www.youtube.com"&gt;Youtube&lt;/a&gt; до внедрения его на свой сайт. Пример не очень хороший, но наглядно демонстрирует функционал.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для того что бы отобразить html или обработать javascript код вам необходимо добавить к вашему коду строку "&lt;b&gt;data:text/html,&lt;/b&gt;" и получившийся результат, выполнить. Рассмотрим это на примере &lt;a href="http://www.youtube.com/watch?v=j1Nf8TcdaH0&amp;feature=player_embedded"&gt;видео из Youtube&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Код видео будет выглядеть следующим образом:&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;&amp;lt;object width=&amp;quot;560&amp;quot; height=&amp;quot;340&amp;quot;&amp;gt;&amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;http://www.youtube.com/v/j1Nf8TcdaH0&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;rel=0&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowFullScreen&amp;quot; value=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowscriptaccess&amp;quot; value=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;embed src=&amp;quot;http://www.youtube.com/v/j1Nf8TcdaH0&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;rel=0&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; allowscriptaccess=&amp;quot;always&amp;quot; allowfullscreen=&amp;quot;true&amp;quot; width=&amp;quot;560&amp;quot; height=&amp;quot;340&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Добавим магические символы "&lt;b&gt;data:text/html,&lt;/b&gt;" в начало кода.&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;data:text/html,&amp;lt;object width=&amp;quot;560&amp;quot; height=&amp;quot;340&amp;quot;&amp;gt;&amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;http://www.youtube.com/v/j1Nf8TcdaH0&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;rel=0&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowFullScreen&amp;quot; value=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowscriptaccess&amp;quot; value=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;embed src=&amp;quot;http://www.youtube.com/v/j1Nf8TcdaH0&amp;amp;hl=ru_RU&amp;amp;fs=1&amp;amp;rel=0&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; allowscriptaccess=&amp;quot;always&amp;quot; allowfullscreen=&amp;quot;true&amp;quot; width=&amp;quot;560&amp;quot; height=&amp;quot;340&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вставляем результирующую строку в поле адреса и выполняем переход. В окне браузера отобразится плеер из Youtube. Все элементарно и просто!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/html_javascript_hacking.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Протестировано в Google Chrome, Firefox, Opera, Safari. Данное решение точно не работает в IE!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-1360374131889810145?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/w94bUMbFQGI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/1360374131889810145/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/11/html-javascript.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/1360374131889810145?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/1360374131889810145?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/w94bUMbFQGI/html-javascript.html" title="Выполняем HTML или JavaScript код используя адресную строку" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/11/html-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAMRng_fyp7ImA9WxBWFEg.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-843048511069067910</id><published>2009-11-13T06:14:00.000-08:00</published><updated>2010-02-06T04:03:07.647-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-06T04:03:07.647-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flex-htmlfilter" /><category scheme="http://www.blogger.com/atom/ns#" term="flex" /><category scheme="http://www.blogger.com/atom/ns#" term="google code" /><category scheme="http://www.blogger.com/atom/ns#" term="ActionScript3" /><title>Компилируем flex-htmlfilter в Windows за 10 минут</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/U1_tuqwzTuvWEVcpqJjryquA-NQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/U1_tuqwzTuvWEVcpqJjryquA-NQ/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/U1_tuqwzTuvWEVcpqJjryquA-NQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/U1_tuqwzTuvWEVcpqJjryquA-NQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;При программировании на Flex обращаешь внимание на разные библиотеки, одним из таких проектов, который привлек мое внимание, стал &lt;a rel="ext_link" href="http://code.google.com/p/flex-htmlfilter/"&gt;flex-htmlfilter&lt;/a&gt;. Он дает возможность поддержки дополнительный html тегов: ul, ol, table и т.д. Полный &lt;a rel="ext_link" href="http://flex-htmlfilter.googlecode.com/svn/trunk/base/com/htmlFilter/Supported%20Tags%20and%20Attributes"&gt;список тегов&lt;/a&gt; можно найти на сайте проекта. &lt;br /&gt;&lt;br /&gt;Посмотрев &lt;a rel="ext_link" href="http://stephen-m.appspot.com/htmlFilter"&gt;пример использования&lt;/a&gt; стало понятно, что нужно "пощупать" его поплотнее. Правда скомпилировать его из исходников оказалось не очень просто, на что и ушло уйма времени. Дальше о том как это сделать :).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Скачиваем исходники flex-htmlfilter&lt;/h2&gt;&lt;br /&gt;Используя svn клиент скачиваем исходники с &lt;a href="http://flex-htmlfilter.googlecode.com/svn/trunk/"&gt;http://flex-htmlfilter.googlecode.com/svn/trunk/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Установка MinGW&lt;/h2&gt;&lt;br /&gt;Для компиляции вам понадобится установить MinGW. Инструкцию по установке данного продукта вы можете найти в &lt;a href="http://code.google.com/p/flex-htmlfilter/wiki/Compiling"&gt;информации по проекту&lt;/a&gt;. Но, что бы не мучиться, советую устанавливать MinGW используя windows installer. Скачиваем &lt;a href="http://sourceforge.net/projects/mingw/files/Automated%20MinGW%20Installer/MinGW%205.1.6/MinGW-5.1.6.exe/download"&gt;MinGW-5.1.6.exe&lt;/a&gt;, устанавливаем. В данной реализации отсутствует файл "make", вместо него необходимо использовать "mingw32-make".&lt;br /&gt;&lt;br /&gt;При вызове "mingw32-make" у вас может возникнуть ошибка &lt;br /&gt;&lt;br /&gt;&lt;b&gt;'mingw32-make' is not recognized as an internal or external command, operable program or batch file.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для устранение вам необходимо добавить директорию "MinGw\bin" в переменную окружения компьютера "Path" (свойство "My Computer" -&gt; закладка "Advanced" -&gt; "Environment Varibles" -&gt; "System varibles", в переменную "PATH" добавляем путь к MinGW в конец параметра через ";"). У меня данное значение выглядит следующим образом "C:\MinGw\bin".&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Установка sed&lt;/h2&gt;&lt;br /&gt;Для работы вам понадобится установить утилита sed. Очень печально, что про это не упоминается в инструкции. Список инсталляций под Windows можно найти на &lt;a href="http://sourceforge.net/projects/gnuwin32/files/"&gt;sourceforge.net&lt;/a&gt;. Себе установил версию &lt;a href="http://sourceforge.net/projects/gnuwin32/files/sed/4.2-1/sed-4.2-1-src-setup.exe/download"&gt;sed-4.2-1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;При компиляции у вас может возникнуть ошибка &lt;br /&gt;&lt;br /&gt;&lt;b&gt;'sed' is not recognized as an internal or external command, operable program or batch file.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Так же как и для MinGW, вам необходимо прописать пути к файлу sed. Добавляем в перемунную окружения "Path" путь к расположению файла sed.exe(c:\Program Files\GnuWin32\bin\).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Пути к компилятору&lt;/h2&gt;&lt;br /&gt;При выполнении скриптов необходим компилятор mxmlc. Как и в случае с MinGW и sed, добавляем путь к директории в которой находится компилятор в переменную окружения Path. У меня установлен плагин Flex Builder для Eclipse и данный путь выглядит следующим образом "c:\Program Files\Adobe\Flex Builder 3 Plug-in\sdks\3.2.0\bin\". Если вы не добавите данный путь в переменную окружения вы получите ошибку при компиляции:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;'mxmlc' is not recognized as an internal or external command, operable program or batch file.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Компилируем swf&lt;/h2&gt;&lt;br /&gt;Последним шагом в компиляции является запуск скриптов. Для этого необходимо перейти в корень проекта и исполнить команду "mingw32-make". В папке "as" у вас появятся скомпилированные исходники и сам файл проекта index.swf.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Компилируем swc&lt;/h2&gt;&lt;br /&gt;В случае если данные проект вы хотите использовать как дополнительную библиотеку, то придется скомпилировать файл swc. Самым простым решением мне показалось воспользоваться компилятором compc и вручную прописать команду компиляции. Исходники которые можно использовать будут находится уже в папке "as" после выполнения предыдущего пункта.&lt;br /&gt;&lt;br /&gt;Ну вот и все действия, которые вам необходимо будет сделать, что бы получить библиотеку проекта из исходников. Для себя отметил, что данный проект хоть и расширяет поддержку дополнительных html тегов, но не позволяет гибко настраивать их :(.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-843048511069067910?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/n6OV8wesDZc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/843048511069067910/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/11/flex-htmlfilter-windows-5.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/843048511069067910?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/843048511069067910?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/n6OV8wesDZc/flex-htmlfilter-windows-5.html" title="Компилируем flex-htmlfilter в Windows за 10 минут" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/11/flex-htmlfilter-windows-5.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EGQHcycSp7ImA9WxFREE4.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-4284319573260109111</id><published>2009-11-10T03:47:00.002-08:00</published><updated>2010-04-23T09:20:21.999-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T09:20:21.999-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="clip" /><category scheme="http://www.blogger.com/atom/ns#" term="resize image" /><category scheme="http://www.blogger.com/atom/ns#" term="CSS" /><title>Как изменить размер изображений не потеряв в качестве используя CSS</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uYkMMcW_6_ebJm1EJr80RlyvlDo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uYkMMcW_6_ebJm1EJr80RlyvlDo/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/uYkMMcW_6_ebJm1EJr80RlyvlDo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uYkMMcW_6_ebJm1EJr80RlyvlDo/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/css.png"/&gt;&lt;/div&gt;Почти все из вас знают, что для изменения размера изображения используя CSS необходимо всего лишь задать нужную высоту или/и ширину. Но как сохранить качество изображения, если в исходной картинки и в необходимой, соотношение сторон разное? &lt;br /&gt;&lt;br /&gt;Например, у вас была картинка 300x200, а необходимо получить размер 120x120.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Воспользуйтесь css свойством &lt;a href="http://www.htmlbook.ru/css/clip.html"&gt;clip&lt;/a&gt;, которое поможет вам правильно изменить размер изображение:&lt;br /&gt;&lt;div style="margin:0 50px 0 0"&gt;&lt;img src="http://cdn.night-fairy-tales.com/nft/sr/demo_clip.jpg"/&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="position: relative;height: 120px;width: 120px;border: solid 1px #ccc;"&gt;&lt;img style="position: absolute; height:120px; clip: rect(0 150px 120px 30px); left:-30px;" src="http://cdn.night-fairy-tales.com/nft/sr/demo_clip.jpg"/&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/clip_resize.png"/&gt;&lt;/div&gt;&lt;br /&gt;Для реализации вам понадобится задать стиль и разметку для отображения картинки следующим образом.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CSS&lt;/b&gt;&lt;br /&gt;&lt;pre class="brush: css"&gt;&lt;br /&gt;.clip {&lt;br /&gt; position: relative;&lt;br /&gt; height: 120px;&lt;br /&gt; width: 120px;&lt;br /&gt; border: solid 1px #ccc;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;.clip img {&lt;br /&gt; position: absolute;&lt;br /&gt; height:120px;&lt;br /&gt; clip: rect(0 150px 120px 30px);&lt;br /&gt; left: -30px;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&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;&amp;lt;div class="clip"&amp;gt;&lt;br /&gt;&amp;lt;img src="demo_clip.jpg"/&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Вот и весь секрет, который поможет вам изменять размер изображения(resize image) без потери качества.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-4284319573260109111?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/Ps24WvvkdEc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/4284319573260109111/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/11/css.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4284319573260109111?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/4284319573260109111?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/Ps24WvvkdEc/css.html" title="Как изменить размер изображений не потеряв в качестве используя CSS" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/11/css.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08EQ3kzfSp7ImA9WxFREE4.&quot;"><id>tag:blogger.com,1999:blog-990982038141613634.post-2791743088410243571</id><published>2009-11-07T07:30:00.000-08:00</published><updated>2010-04-23T09:23:22.785-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T09:23:22.785-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Google Analytics" /><category scheme="http://www.blogger.com/atom/ns#" term="google analytics tracking" /><category scheme="http://www.blogger.com/atom/ns#" term="статистика google" /><category scheme="http://www.blogger.com/atom/ns#" term="file download" /><title>Быстро и удобно. Отслеживаем переходы и скачивания файлов на своем сайте с использованием Google Analytics</title><content type="html">
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/judC7JGroDBEG4YWPgNV9UHpMQA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/judC7JGroDBEG4YWPgNV9UHpMQA/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/judC7JGroDBEG4YWPgNV9UHpMQA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/judC7JGroDBEG4YWPgNV9UHpMQA/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-analytics-logo.png"/&gt;&lt;/div&gt;У вас возникла задача отслеживать переходы и скачивания файлов? В этом вам поможет &lt;a rel="ext_link" href="http://www.google.com/analytics"&gt;Google Analytics&lt;/a&gt;(видео по &lt;a rel="ext_link" href="http://www.vimeo.com/6779876"&gt;регистрация акаунта&lt;/a&gt;). Если вы уже используете данный продукт на вашем сайте, то вам осталось для выполнения этой задачи всего "полшага".&lt;br /&gt;&lt;br /&gt;По сути, Google Analytics предоставляет возможность для выполнения отслеживаний. Чтобы воспользоваться ими вам необходимо добавить javascript-овое событие onclick в ссылку.&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;a href="http://mysite.com/files/logo.jpg" onClick="javascript: pageTracker._trackPageview(’/download/logo’);"&amp;gt;click me&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Прописывать событие "onclick" возле каждой ссылке очень неудобно. Вот об упрощении работы и пойдет дальше речь.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Для упрощения можно воспользоваться проектом &lt;a rel="ext_link" href="http://github.com/christianhellsten/jquery-google-analytics"&gt;jquery-google-analytics&lt;/a&gt;. Хорош он тем, что позволяет использовать преимущество jQuery Selectors и сам выполняет работу по инициализации Google Analytics.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Подключения скриптов&lt;/h2&gt;&lt;br /&gt;Для работы вам понадобится &lt;a rel="download" href="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"&gt;jQuery&lt;/a&gt; и &lt;a rel="download" href="http://github.com/christianhellsten/jquery-google-analytics/raw/master/jquery.google-analytics.js"&gt;jquery-google-analytics&lt;/a&gt;. Подключить их можно следующим образом.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;script src=&amp;#39;http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;/&amp;gt;&lt;br /&gt;&amp;lt;script src=&amp;#39;http://github.com/christianhellsten/jquery-google-analytics/raw/master/jquery.google-analytics.js&amp;#39; type=&amp;#39;text/javascript&amp;#39;/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Инициализация&lt;/h2&gt;&lt;br /&gt;При использовании этого решения вам не придется добавлять скрыпты Google Analytics, данное решение сделает эту работу за вас. Необходимо лишь запустить trackPage с указанием вашего кода отслеживания.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&lt;br /&gt;$.trackPage(&amp;#39;UA-#######-#&amp;#39;, {status_code: 404});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Замените значение "UA-#######-#" на свой код.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Добавления отслеживания&lt;/h2&gt;&lt;br /&gt;Про все возможности отслеживания вы можете прочитать на &lt;a rel="ext_link" href="http://github.com/christianhellsten/jquery-google-analytics"&gt;странице проекта&lt;/a&gt;. Мне нужно было добавить отслеживание для скачиваемых файлов(категория "download"), и на переходы по внешним ссылкам(категория "ext_link"). В качестве атрибута, который указывает на необходимость такого отслеживания, выбрал "rel".&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;&amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;    $(&amp;#39;a[rel=download]&amp;#39;).track({&lt;br /&gt;        category : &amp;#39;download&amp;#39;&lt;br /&gt;    });&lt;br /&gt;    $(&amp;#39;a[rel=ext_link]&amp;#39;).track({&lt;br /&gt;        category : &amp;#39;ext_link&amp;#39;&lt;br /&gt;    });&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Использование&lt;/h2&gt;&lt;br /&gt;В заключении вам необходимо добавлять к ссылкам нужную категорию, для этого в теге "а" атрибута "rel" укажите значения категории следующим образом.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: js"&gt;&lt;br /&gt;&amp;lt;a rel=&amp;quot;download&amp;quot; href=&amp;quot;http://sscaos.googlecode.com/svn/trunk/nft/sr/actionscript3/n_VS_i_sum.mxml&amp;quot;&amp;gt;Исходник теста.&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;a rel=&amp;quot;ext_link&amp;quot; href=&amp;quot;http://www.adobe.com/devnet/flex/articles/server_perf.html&amp;quot; class=&amp;quot;tracked&amp;quot;&amp;gt;Flex Application Performance: Tips and Techniques for Improving Flex Server Performance&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;При таком использовании в Google Analytics появится категории "download" и "ext_link", и в каждой из них будут отображаться url страниц для которых вы установили отслеживания.&lt;br /&gt;&lt;br /&gt;Действительно, теперь достаточно создать необходимые категории и указать их на нужных ссылках, a всю остальную работу сделают за вас.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/990982038141613634-2791743088410243571?l=night-fairy-tales.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/night-fairy-tales/~4/gpuEcr1Sbtw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://night-fairy-tales.com/feeds/2791743088410243571/comments/default" title="Комментарии к сообщению" /><link rel="replies" type="text/html" href="http://night-fairy-tales.com/2009/11/google-analytics.html#comment-form" title="Комментарии: 0" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2791743088410243571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/990982038141613634/posts/default/2791743088410243571?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/night-fairy-tales/~3/gpuEcr1Sbtw/google-analytics.html" title="Быстро и удобно. Отслеживаем переходы и скачивания файлов на своем сайте с использованием Google Analytics" /><author><name>SMiGL</name><uri>http://www.blogger.com/profile/13633940848213271165</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="16440103740942454655" /></author><thr:total>0</thr:total><feedburner:origLink>http://night-fairy-tales.com/2009/11/google-analytics.html</feedburner:origLink></entry></feed>
