<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.wpal &#187; javascript</title>
	<atom:link href="http://blog.web2.com.ua/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.web2.com.ua</link>
	<description>web, programming and linux</description>
	<lastBuildDate>Fri, 20 May 2011 13:29:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>one.web2.com.ua &#8211; ускорение закрузки</title>
		<link>http://blog.web2.com.ua/2011/01/26/one-web2-com-ua-uskorenie-zakruzki/</link>
		<comments>http://blog.web2.com.ua/2011/01/26/one-web2-com-ua-uskorenie-zakruzki/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 10:06:23 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[one]]></category>
		<category><![CDATA[использовать!]]></category>
		<category><![CDATA[моё]]></category>
		<category><![CDATA[сервис]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/?p=1076</guid>
		<description><![CDATA[На днях решил написать парочку целей для Ant&#8217;а, а на чём же пробовать и тестировать, как не на своих проектиках. В качестве полигона взял свой one.web2.com.ua и описал систему сборки для этого проекта. Теперь сайт должен грузится быстро и все изменения в стилях будут применяться автоматом. Что же я опритимизировал: Все стили CSS собираются в [...]]]></description>
			<content:encoded><![CDATA[<p>На днях решил написать парочку целей для Ant&#8217;а, а на чём же пробовать и тестировать, как не на своих проектиках. В качестве полигона взял свой <a href="http://one.web2.com.ua">one.web2.com.ua</a> и описал систему сборки для этого проекта. Теперь сайт должен грузится быстро и все изменения в стилях будут применяться автоматом. Что же я опритимизировал:</p>
<ol>
<li>Все стили CSS собираются в один файл и сжимаются <a href="http://developer.yahoo.com/yui/compressor/" target="_blank">yuicompressor</a>.</li>
<li>Все Javascript-файлы собираются в один и тем же жжымаются.</li>
<li>Все библиотеки Javascript ( jQuery, jQuery UI ) просто собираются в один файл и будут перегружаться только, когда будут обновлены, а не при каждой сборке.</li>
<li>Zend Framefork файлы собираются в один и только нужные классы. Как я это сделал, напишу попозже.</li>
<li>Все классы моего фреймворка тоже, как и ZF, собираются в одном файле. Так как one.web2.com.ua состоит с одного контроллера, то он тоже склеен. Как вывод, подключаются только 2 файла PHP.</li>
<li>Когда меняю что-то в стилях, это сразу применяется на сайте, потому что система применяет трюк с версиями <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ol>
<p>Проверил и, по субъективному мнению, грузится просто реактивно! Осталось что-то сделать с CKEditor, но это в другой раз.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2011/01/26/one-web2-com-ua-uskorenie-zakruzki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Перевод: 25 возможностей, подсказок и техник HTML5 которые вы должны знать</title>
		<link>http://blog.web2.com.ua/2010/10/22/perevod-25-vozmozhnostej-podskazok-i-texnik-html5-kotorye-vy-dolzhny-znat/</link>
		<comments>http://blog.web2.com.ua/2010/10/22/perevod-25-vozmozhnostej-podskazok-i-texnik-html5-kotorye-vy-dolzhny-znat/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 07:54:58 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[верстка]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/?p=997</guid>
		<description><![CDATA[Перевод статьи &#8220;28 HTML5 Features, Tips, and Techniques you Must Know&#8220;. Это индустрия движется быстро, очень быстро! Если вы будете не внимательны, то останетесь не у дел. Итак, если вы слегка оконфужены предстоящими изменениями в HTML5, то эта статья может стать основой для вещей, которые вы должны знать. 1. Новый Doctype Всё ещё используете этот [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод статьи &#8220;<a href="http://net.tutsplus.com/tutorials/html-css-techniques/25-html5-features-tips-and-techniques-you-must-know/" target="_blank">28 HTML5 Features, Tips, and Techniques you Must Know</a>&#8220;.</p>
<p>Это индустрия движется быстро, очень быстро! Если вы будете не внимательны, то останетесь не у дел. Итак, если вы слегка оконфужены предстоящими изменениями в HTML5, то эта статья может стать основой для вещей, которые вы должны знать.<span id="more-997"></span></p>
<h2>1. Новый Doctype</h2>
<p>Всё ещё используете этот надоедливый, не запоминаемый XHTML doctype?</p>
<pre>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;</pre>
<p>Если это так, то почему? Переходите на новый HTML5 doctype. Вы будете жить долго , как бы сказал Douglas Quaid.</p>
<pre>&lt;!DOCTYPE html&gt;</pre>
<p>На самом деле, Вы знаете, что это даже не столь важно для HTML5? Тем не менее, он используется в текущих и старых браузерах, которые требуют указания <code>doctype</code>. Браузеры, которые не понимают этот doctype будут просто прорисовывать содержание разметки в стандартном режиме. По этому, не стоит беспокоится, а просто принять новый doctype.</p>
<h2>2. Елемент Figure</h2>
<p>Рассмотрим разметку для рисунка:</p>
<pre>&lt;img src="path/to/image" alt="About image" /&gt;
&lt;p&gt;Image of Mars. &lt;/p&gt;</pre>
<p>К сожалению, нет легкого и семантического пути для указания подписи к рисунку, которая завёрнута в тэг &lt;p&gt;. В HTML5 это исправлено с помощью элемента <code>&lt;figure&gt;</code>. В сочетании с тэгом <code>&lt;figcaption&gt;</code>, мы можем семантически ассоциировать подписи соответственным рисункам.</p>
<pre>&lt;figure&gt;
        &lt;img src="path/to/image" alt="About image" /&gt;
        &lt;figcaption&gt;
                &lt;p&gt;This is an image of something interesting. &lt;/p&gt;
        &lt;/figcaption&gt;
&lt;/figure&gt;</pre>
<h2>3. &lt;small&gt; переопределен</h2>
<p>Не так давно я использовал <code>&lt;small&gt;</code> для создания подзаголовков, которые тесно связаны с логотипом. Это полезный презентационный элемент; тем не менее, теперь это будет не корректным использованием. Элемент <code>small</code> был переопределён, отныне более уместен он для указания мелкого шрифта. Более корректно, согласно новому определению HTML5, его использовать для обрамления информации о авторских правах в футтере вашего сайта.</p>
<blockquote><p>Элемент <code>small</code> теперь означает «маленький шрифт».</p></blockquote>
<h2>4. Никаких <code>Type</code> для Script и Link</h2>
<p>Вы, возможно, всё ещё добавляете атрибут <code>type</code> к тэгам <code>link</code> и <code>script</code>.</p>
<pre>&lt;link rel="stylesheet" href="path/to/stylesheet.css" type="text/css" /&gt;
&lt;script type="text/javascript" src="path/to/script.js"&gt;&lt;/script&gt;</pre>
<p>Теперь это не требуется. Теперь подразумевается, что оба этих тэга ссылаются на CSS и скрипты соответственно. Таким образом, можно удалить атрибут <code>type</code>.</p>
<pre>&lt;link rel="stylesheet" href="path/to/stylesheet.css" /&gt;
&lt;script src="path/to/script.js"&gt;&lt;/script&gt;</pre>
<h2>5. To Quote or Not to Quote</h2>
<p>…Вот в чём вопрос. Помните же, что HTML5 не XHTML. Вы не должны оборачивать ваши атрибуты в кавычки, если вы это не хотите. Вы можете не закрывать тэги. Что уж говорить, нет ничего плохого в этом, коль вам так комфортнее. Как по мне, то это хорошо.</p>
<pre>&lt;p id=someId&gt; Start the reactor.</pre>
<p>Можете думать иначе. Если вы предпочитаете более структурированные документы, то можете лепить эти кавычки.</p>
<h2>6. Делайте Ваш контент редактируемым</h2>
<p style="text-align: center;"><a href="http://blog.web2.com.ua/wp-content/uploads/contenteditable.png"><img class="size-full wp-image-998 aligncenter" title="contenteditable" src="http://blog.web2.com.ua/wp-content/uploads/contenteditable.png" alt="" width="254" height="149" /></a></p>
<p>Новые браузеры поддерживают модный новый атрибут элементов <code>contenteditable</code>. Как говорит его название, он позволяет редактировать пользователем текст внутри его, включая и дочерние элементы. Это можно использовать в многих целях, включая приложение, столь простое, как список дел, которое к тому же может использовать локальное хранилище.</p>
<pre>&lt;!DOCTYPE html&gt;

&lt;html lang="en"&gt;
&lt;head&gt;
        &lt;meta charset="utf-8"&gt;
        &lt;title&gt;untitled&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
        &lt;h2&gt; To-Do List &lt;/h2&gt;
     &lt;ul contenteditable="true"&gt;
                &lt;li&gt; Break mechanical cab driver. &lt;/li&gt;
                &lt;li&gt; Drive to abandoned factory
                &lt;li&gt; Watch video of self &lt;/li&gt;
         &lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Или, как мы уже знаем с предыдущей подсказки, мы можем написать так:</p>
<pre>&lt;ul contenteditable=true&gt;</pre>
<h2>7. Email Inputs</h2>
<p>Если указать в атрибуте <code>type</code> значение  “email” в поле формы, мы укажем браузеру, что значение поля может быть только правильным адресом электронной почты. Всё правильно: скоро будет встроенная валидация форм! Мы не можем полагаться на это на все 100% по понятным причинам. Старые браузеры не понимают тип «email» и будут воспринимать его как простой текст.</p>
<pre>&lt;!DOCTYPE html&gt;

&lt;html lang="en"&gt;
&lt;head&gt;
        &lt;meta charset="utf-8"&gt;
        &lt;title&gt;untitled&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
        &lt;form action="" method="get"&gt;
                &lt;label for="email"&gt;Email:&lt;/label&gt;
                &lt;input id="email" name="email" type="email" /&gt;

                &lt;button type="submit"&gt; Submit Form &lt;/button&gt;
        &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p style="text-align: center;"><a href="http://blog.web2.com.ua/wp-content/uploads/email_validation.png"><img class="size-full wp-image-999 aligncenter" title="email_validation" src="http://blog.web2.com.ua/wp-content/uploads/email_validation.png" alt="" width="346" height="73" /></a></p>
<p>Следует упомянуть, что текущие браузеры слегка ненадёжны, когда дело доходит до того, какие элементы и атрибуты они поддерживают, а какие &#8211; нет. Например, Opera кажется поддерживает валидацию email только когда указан атрибут <code>name</code>. Тем не менее, она не поддерживает атрибут <code>placeholder</code>, который мы рассмотрим в следующей главе. Резюмируя: не стоит зависеть от этой валидации форм пока&#8230; Но можно использовать!</p>
<h2>8. Placeholder`ы</h2>
<p>Раньше мы должны были использовать JavaScript для создания placeholder`ов в текстовых полях. Конечно, мы можем просто инициализировать атрибут <code>value</code> как мы бы хотели, но потом, когда пользователь сотрёт этот текст и кликнет за границей поля, оно останется пустым. Атрибут <code>placeholder</code> исправляет положение.</p>
<pre>&lt;input name="email" type="email" placeholder="doug@givethesepeopleair.com" /&gt;</pre>
<p>Опять же, поддержка атрибута сомнительна в лучших браузерах, однако, это будет исправляться от релиза к релизу. По этому, если браузеры, такие как Firefox и Opera, сейчас не поддерживают <code>placeholder</code>, не стоит переживать по этому поводу.</p>
<p><a href="http://blog.web2.com.ua/wp-content/uploads/validation.png"><img class="size-full wp-image-1000 aligncenter" title="validation" src="http://blog.web2.com.ua/wp-content/uploads/validation.png" alt="" width="400" height="400" /></a></p>
<h2>9. Локальное хранилище</h2>
<p>Благодаря локальному хранилищу (официально ещё не HTML5, но сгруппировано для удобства), мы можем заставить продвинутые браузеры «вспомнить», что мы собирали даже когда браузер был закрыт или обновлена страница.<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/h0uZIljjElo?fs=1&amp;hl=ru_RU&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/h0uZIljjElo?fs=1&amp;hl=ru_RU&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<blockquote><p>“localStorage устанавливает поля для домена. Даже когда вы закроете ваш браузер, откроете и вернётесь на тот сайт, браузер вспомнит поля с localStorage.”<br />
-<a href="http://www.quirksmode.org/blog/archives/2009/06/html5_storage_t.html">QuirksBlog</a></p></blockquote>
<p>Пока, очевидно, это не поддерживается всеми браузерами, но можно ожидать, что, скоре всего, поддержка появится в Internet Explorer 8, Safari 4 и Firefox 3.5. Отметим, что старые браузеры могут не поддерживать локальное хранилище, поэтому следует проверить на существование window.localStorage.</p>
<p style="text-align: center;"><a href="http://blog.web2.com.ua/wp-content/uploads/20100409-cp7baa12xdc53tmuytg4kaqqe6.jpg"></a><a href="http://blog.web2.com.ua/wp-content/uploads/20100409-cp7baa12xdc53tmuytg4kaqqe6.jpg"><img class="alignnone size-medium wp-image-1001" title="20100409-cp7baa12xdc53tmuytg4kaqqe6" src="http://blog.web2.com.ua/wp-content/uploads/20100409-cp7baa12xdc53tmuytg4kaqqe6-400x82.jpg" alt="" width="400" height="82" /></a></p>
<h2>10. Семантические <code>Header</code> и <code>Footer</code></h2>
<p>В прошлом те дни, когда:</p>
<pre>&lt;div id="header"&gt;
        ...
&lt;/div&gt;

&lt;div id="footer"&gt;
        ...
&lt;/div&gt;</pre>
<p>Тэг div по своей природе, не имеет семантической составляющей — даже когда присуствует аттрибут <code>id</code>. Теперь в HTML5 есть возможность использовать <code>&lt;header&gt;</code> и <code>&lt;footer&gt;</code> елементы. Теперь структура, которая представлена выше, можно заменить на :</p>
<pre>&lt;header&gt;
        ...
&lt;/header&gt;

&lt;footer&gt;
        ...
&lt;/footer&gt;</pre>
<blockquote><p>Это также позволяет иметь несколько елементов <code>header</code> и <code>footer</code> в ваших проектах.</p></blockquote>
<p>Постарайтесь не путать эти  элементы с “header-ом” and “footer-ом” вашего сайта. Они просто ссылаются на своё содержимое. Например, его можно использовать для вывода мета-информации в посте блога. Это применимо и для  <code>header</code>.</p>
<h2>11. Больше возможностей с формами HTML5</h2>
<p>Давайте узнаем о полезных возможностях форм HTML5 с помощью этого короткого видео-урока.<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/spjOAFGxOP0?fs=1&amp;hl=ru_RU&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube.com/v/spjOAFGxOP0?fs=1&amp;hl=ru_RU&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h2>12. Internet Explorer и HTML5</h2>
<p>К сожалению, этот чёртов Internet Explorer  требует немного костылей, дабы заставить его понимать новые HTML5 элементы.</p>
<blockquote><p>Все элементы, по-умолчанию, имеют свойство <code>display</code><code>:</code><code>inline</code>.</p></blockquote>
<p>В целях обеспечения правильного отображения новых элементов HTML5 как блочных, следует указать такой стиль:</p>
<pre>header, footer, article, section, nav, menu, hgroup {
   display: block;
}</pre>
<p>К сожелению, Internet Explorer будет продолжать игнорировать эти стили, потому что не имеет понятия, что это, как элемент <code>header</code> например. К счастью, это легко исправить:</p>
<pre>document.createElement("article");
document.createElement("footer");
document.createElement("header");
document.createElement("hgroup");
document.createElement("nav");
document.createElement("menu");</pre>
<p>Как ни странно, но код как будто выстреливает в Internet Explorer. Чтобы упростить этот процесс, Remy Sharp <a href="http://remysharp.com/2009/01/07/html5-enabling-script/">создал скрипт</a>, как правило, называющийся «костылём» для HTML5. Он исправляет и некоторые проблемы с печатью.</p>
<pre>&lt;!--[if IE]&gt;
&lt;script src="http://html5shim.googlecode.com/svn/trunk/html5.js"&gt;&lt;/script&gt;
&lt;![endif]--&gt;</pre>
<h2>13. hgroup</h2>
<p>Представте, что в шапке ( header ) моего сайта есть название моего сайта, сразу под заголовком. По этому я могу использовать тэги <code>&lt;h1&gt;</code> и <code>&lt;h2&gt;</code>, соответственно, создать разметку, которая бы легко семантически указывала на их отношения. Кроме того, использование тэгов h2  принесёт много проблем, с точки зрения иерархии, когда дело дойдёт до отображения их в других частях сайта. Использовав элемент <code>hgroup,</code> можно группировать эти заголовки вместе, не переживая за схему документа.</p>
<pre>&lt;header&gt;
        &lt;hgroup&gt;
                &lt;h1&gt; Recall Fan Page &lt;/h1&gt;
                &lt;h2&gt; Only for people who want the memory of a lifetime. &lt;/h2&gt;
        &lt;/hgroup&gt;
&lt;/header&gt;</pre>
<h2>14.  Атрибут required</h2>
<p>Формы имеют новый атрибут <code>required</code>, который, разумеется, указывает, что данное поле ввода input обязательное. В зависимости от вашего стиля кодирования, этот атрибут вы можете описать одним с двух способов:</p>
<pre>&lt;input type="text" name="someInput" required&gt;</pre>
<p>Или более структурированным методом.</p>
<pre>&lt;input type="text" name="someInput" required="required"&gt;</pre>
<p>Любой метод будет работать. Благодаря этому коду, в браузерах, которые поддерживают этот атрибут, форма не может быть отправлена, если текстовое поле “someInput” пустое. Ниже простеньки пример; также мы добавили атрибут placeholder так как нет причины этого не делать:</p>
<pre>&lt;form method="post" action=""&gt;
        &lt;label for="someInput"&gt; Your Name: &lt;/label&gt;
        &lt;input type="text" id="someInput" name="someInput" placeholder="Douglas Quaid" required&gt;
        &lt;button type="submit"&gt;Go&lt;/button&gt;
&lt;/form&gt;</pre>
<p style="text-align: center;"><a href="http://blog.web2.com.ua/wp-content/uploads/placeholder_required.png"><img class="size-full wp-image-1008 aligncenter" title="placeholder_required" src="http://blog.web2.com.ua/wp-content/uploads/placeholder_required.png" alt="" width="263" height="41" /></a></p>
<p>Если поле ввода оставить пустым и попробовать отправить форму, то оно подсветится.</p>
<h2>15. Атрибут Autofocus</h2>
<p>Опять же, с приходом HTML5, потребность в JavaScript для решения этой проблемы отпала.   Если определённое текстовое поле должно быть выделенным или с фокусом ввода, можно использовать атрибут <code>autofocus</code>.</p>
<pre>&lt;input type="text" name="someInput" placeholder="Douglas Quaid" required autofocus&gt;</pre>
<p>Хотя я лично предпочитаю более XHTML-ый подход (используя кавычки и т. д.), записывая  <code>"autofocus=autofocus"</code>, но чувствую себя немножечко странно. Таким образом, ми будем придерживаться подхода с использованием одного слова.</p>
<h2>16. Поддержка аудио</h2>
<p>Не надо больше полагаться на сторонние плагины, чтобы играть аудио. В HTML5 предлагается использовать элемент <code>&lt;audio&gt;</code>. Ну, по крайней мере, в конце концов, не надо беспокоится о плагинах. Пока только несколько браузеров поддерживают <code>&lt;audio&gt;</code>. В то же время, хорошая практика использовать некоторые формы обратной совместимости.</p>
<pre>&lt;audio autoplay="autoplay" controls="controls"&gt;
        &lt;source src="file.ogg" /&gt;
        &lt;source src="file.mp3" /&gt;
        &lt;a href="#"&gt;Download file&lt;/a&gt;
&lt;/audio&gt;</pre>
<p>Mozilla и Webkit не полностью ещё готовы, когда заходит речь о поддержке аудио. Firefox хочет видеть файл .ogg, когда как Webkit-браузеры хорошо работают с .mp3. Это значит, по крайней мере сейчас, что вы должны сделать 2 версии аудиофайла.</p>
<p>Когда Safari загружает страницу, то не понимает формат .ogg и пропустит его, и, соответственно, дойдёт до mp3-версии. Прошу заметить, что IE, как всегда, не поддерживает этого и Opera 10 и ниже может работать только с wav-файлами.</p>
<h2>17. Поддержка видео</h2>
<p>Так же, как и <code>&lt;audio&gt;</code> элемент, в HTML5 есть видео! На самом деле, совсем недавно  <a href="http://apiblog.youtube.com/2010/07/new-way-to-embed-youtube-videos.html">YouTube анонсировали  поддержку нового HTML5 видео</a> для брузеров, которые его поддерживают. К сожалению, опять же из-за того, что спецификация HTML5 не указывет кодек для видео, это ложится на плечи браузера. В том время, пока Safari и Internet Explorer 9 поддерживают видео в H.264 формате (который Flash-прееры могут проигрывать), Firefox и  Opera остановились на открытых форматах Theora и Vorbis. Как следствие, для показа видео  HTML5 следует поддерживать оба формата.</p>
<pre>&lt;video controls preload&gt;
        &lt;source src="cohagenPhoneCall.ogv" type="video/ogg; codecs='vorbis, theora'" /&gt;
        &lt;source src="cohagenPhoneCall.mp4" type="video/mp4; 'codecs='avc1.42E01E, mp4a.40.2'" /&gt;
        &lt;p&gt; Your browser is old. &lt;a href="cohagenPhoneCall.mp4"&gt;Download this video instead.&lt;/a&gt; &lt;/p&gt;
&lt;/video&gt;</pre>
<blockquote><p>Chrome корректно отображает видео, кодированное обеими, “ogg” и «mp4»,  форматами.</p></blockquote>
<p>Есть несколько вещей, которые стоит отметить.</p>
<ol>
<li>Мы, технически, можем 	и не указывать атрибут <code>type</code>; 	тем не менее, если он не указан, браузер 	должен выяснить тип сам. Поберегите 	нервы и укажите его сами.</li>
<li>Не все браузеры 	поддерживают элемент video. Под элементом 	<code>source</code> надо указать ссылку 	на закачку или встроить Flash-плеер. Всё 	зависит от вас.</li>
<li>Атрибуты <code>controls</code> и 	<code>preload</code> будут рассмотрены 	в следующих друх главах.</li>
</ol>
<h2>18. Preload видео</h2>
<p>Атрибут <code>preload</code> не совсем то, что вы могли подумать. Хотя,  сначала вы должны решить хотите вы или не хотите, чтобы браузер начинал предварительно загружать видео. Важно это? Пожалуй, если пользователь попал на страницу, которая предназначена для показа видео, вы точно должны заставить браузер предварительно загружать его и сохранить пользователю время. Видео может загружаться предварительно установкой <code>preload="preload"</code>, или просто <code>preload</code>. Я предпочитаю второй вариант — меньше лишнего.</p>
<pre>&lt;video preload&gt;</pre>
<h2>19.  Вывод кнопок управления</h2>
<p>Если  вы внимательно следите за каждой главой этой статьи, вы могли заметить что видео выше в виде простой картинки, без каких либо средств для управления. Чтобы показать их, следует указать атрибут <code>controls</code> в обьекте <code>video</code>.</p>
<pre>&lt;video preload controls&gt;</pre>
<p style="text-align: center;"><a href="http://blog.web2.com.ua/wp-content/uploads/video.jpg"><img class="size-medium wp-image-1009 aligncenter" title="video" src="http://blog.web2.com.ua/wp-content/uploads/video-400x189.jpg" alt="" width="400" height="189" /></a></p>
<p>Заметьте, что каждый браузер по разному их рисует.</p>
<h2>20. Регулярные выражения</h2>
<p>Как часто вы находили в себе  желание быстренько вставить регулярное выражение для проверки значения какого-то текстового поля. Спасибо новому атрибуту <code>pattern</code>, мы можем вставлять регулярные выражения прямо в разметку.</p>
<pre>&lt;form action="" method="post"&gt;
        &lt;label for="username"&gt;Create a Username: &lt;/label&gt;
        &lt;input type="text"
           name="username"
           id="username"
           placeholder="4 &lt;&gt; 10"
           pattern="[A-Za-z]{4,10}"
           autofocus
           required&gt;
        &lt;button type="submit"&gt;Go &lt;/button&gt;
&lt;/form&gt;</pre>
<p>Если вы хоть как-то знакомы с регулярами, вы поймёте этот шаблон: <code>[A-Za-z]{4,10}</code> принимает только буквы в верхнам и нижнем регистре. Эта сторока должна быть минимум 4 символа и максимум 10.</p>
<p>Заметьте, что мы может обьединять эти замечательные выражения!</p>
<h2>21. Определение поддержки атрибутов</h2>
<p>Какой смысл от всех этих атрибутов, когда мы не знаем, поддержывает ли браузер их? Ну, резонный вопрос: но есть несколько способов выяснить это. Мы рассмотрим два. Первый — использовать чудесную библиотеку <a href="http://modernizr.com/">Modernizr</a>. Кроме того, мы можем создавать и анализировать эти елементы, чтобы определить способность браузеров понимать их. Например, в предыдущем примере, если мы хотим определить, может ли браузер реализовать атрибут <code>pattern</code>, может добавить кусок кода на JavaScript:</p>
<pre>alert( 'pattern' in document.createElement('input') ) // boolean;</pre>
<p>По сути, это популярный метод определения совместимости браузеров. Библиотека jQuery использует этот трюк. Выше, мы создали новый обьект <code>input</code> и определили, может ли браузер поддерживать <code>pattern</code>. Если это так, то браузер будет использывать эту функциональность. Иначе — се ля ви ).</p>
<pre>&lt;script&gt;
if (!'pattern' in document.createElement('input') ) {
        // do client/server side validation
}
&lt;/script&gt;</pre>
<p><em>Имейте ввиду, что это зависит от JavaScript!</em></p>
<h2>22. Елемент Mark</h2>
<p>Думайте о <code>&lt;mark&gt;</code> как о маркере. Строка, обрамлённая этим тэгом, должна быть связана с текущим действием пользователя.  Например, если я искал “Open your Mind” в блоге, я мог бы, с помощью некоторого Javascript-а, обернуть строку поиска в тэг <code>&lt;mark&gt;</code>.</p>
<pre>&lt;h3&gt; Search Results &lt;/h3&gt;
&lt;p&gt; They were interrupted, just after Quato said, &lt;mark&gt;"Open your Mind"&lt;/mark&gt;. &lt;/p&gt;</pre>
<h2>23. Когда же использовать &lt;div&gt;</h2>
<p>Некоторые теряются в сомнениях, когда же мы должны использовать обычный и привычный <code>div</code>. Теперь у нас есть <code>header</code>, <code>article</code>, <code>section </code><code>и</code> <code>footer</code>, когда же тогда исползовать …<code>div</code>? Непременно.</p>
<blockquote><p><code>Div </code>следует использовать, когда нет подходящего елемента.</p></blockquote>
<p>Например, если вы обнаружили, что надо обернуть кусок кода для позиционирования, <code>&lt;div&gt;</code> как раз кстати. Тем не менее, если вы собираетесь обернуть новый пост в блог или, возможно, список ссылок в подвале сайта, то следует подумать о <code>&lt;article&gt;</code> и <code>&lt;nav&gt;</code> соотведственно. Это более семантически правильно.</p>
<h2>24. Что уже сейчас использовать</h2>
<p>Рассказывая, что HTML5 <a href="http://blogs.techrepublic.com.com/programming-and-development/?p=718">не будет готов полностью до </a><a href="http://blogs.techrepublic.com.com/programming-and-development/?p=718">2022</a>, многие не используют его, что является большой ошибкой. В самом деле, есть несколько полезностей HTML5, которые можно использовать прямо сейчас! Простой и чистый код — это всегда хорошо. В сегодняшнем видео я покажу несколько примеров.<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/HzCkSv3s0-k?fs=1&amp;hl=ru_RU&amp;rel=0" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/HzCkSv3s0-k?fs=1&amp;hl=ru_RU&amp;rel=0" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><!-- p { margin-bottom: 0.21cm; }h2 { margin-bottom: 0.21cm; page-break-after: avoid; }h2.western { font-family: "Times New Roman",serif; font-size: 18pt; font-weight: bold; }h2.cjk { font-family: "Arial"; font-size: 18pt; font-weight: bold; }h2.ctl { font-family: "Arial"; font-size: 18pt; font-weight: bold; }strong { font-weight: bold; } --></p>
<h2>25. Что же не является HTML5</h2>
<p>Люди могут быть прощены за то, что  удивительные JavaScript подходы сгруппированы в всеобъемлющей HTML5. Эй, даже Apple за эту идею! (тоже мне, авторитет. Прим.пер). Для не-разработчиков, кому не всё равно: это лёгкий путь для внедрения web-стандартов. Но для нас важно понять, что такое <strong>не</strong> HTML5.</p>
<ol>
<li><strong>SVG: </strong>Не HTML5. 	Ему, по меньшей мере, лет 5.</li>
<li><strong>CSS3: </strong>Не HTML5. 	Это…CSS.</li>
<li><strong>Client Storage: </strong>Не 	HTML5. Это было в одной связке, но исключено, 	потому что многие переживали, что идея 	становится слишком сложной. Это теперь 	имеет свою собственную спецификацию.</li>
<li><strong>Web Sockets: </strong>Не HTML5. Опять же, 	имеет свою спецификацию.</li>
</ol>
<p>Не смотря на различия, все эти технологии можно сгруппировать в один современный web-стэк. В самом деле, многие с этих спецификаций курируются одними и теми же людьми.</p>
<h2>Заключение</h2>
<p><!-- p { margin-bottom: 0.21cm; } -->Спасибо за прочтение! Мы рассмотрели многое, но всё же это просто вершки от того, что  может HTML5. Надеюсь, этот обзор был вам полезен!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2010/10/22/perevod-25-vozmozhnostej-podskazok-i-texnik-html5-kotorye-vy-dolzhny-znat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Подсказка: private-переменные в Javascript</title>
		<link>http://blog.web2.com.ua/2010/02/24/podskazka-private-peremennyie-v-javascript/</link>
		<comments>http://blog.web2.com.ua/2010/02/24/podskazka-private-peremennyie-v-javascript/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 08:59:28 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[private variables]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[singelton]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/?p=942</guid>
		<description><![CDATA[Это перевод статьи Quick Tip: Private Variables in JavaScript. Подсказка: private-переменные в Javascript Из-за зависимости JavaScript от глобальных переменных, можно легко забыть, что создание часных переменных (private variables) может быть реализовано так же просто, как и замыкания. За несколько минут, я продемонстрирую две основные техники, предоставляющие часные переменные и медоды в ваших проектах. Первый метод [...]]]></description>
			<content:encoded><![CDATA[<p>Это перевод статьи <a href="http://net.tutsplus.com/videos/screencasts/quick-tip-private-variables-in-javascript/" target="_blank">Quick Tip: Private Variables in JavaScript</a>.</p>
<h2>Подсказка: private-переменные в Javascript</h2>
<p>Из-за зависимости JavaScript от глобальных переменных, можно легко забыть, что создание часных переменных (private variables) может быть реализовано так же просто, как и замыкания. За несколько минут, я продемонстрирую две основные техники, предоставляющие часные переменные и медоды в ваших проектах.<span id="more-942"></span></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="345" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="flashvars" value="i=49524" /><param name="allowFullScreen" value="true" /><param name="src" value="http://screenr.com/Content/assets/screenr_1116090935.swf" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="345" src="http://screenr.com/Content/assets/screenr_1116090935.swf" allowfullscreen="true" flashvars="i=49524"></embed></object></p>
<p>Первый метод заключается в том, чтобы создать переменную, которая равна возвращаемому значению переменной. Таким образом, мы можем контролировать какие переменные и методы доступны для проекта. Благодаря замыканиям, мы всё равно будем иметь доступ к этим часным переменным, даже после того, как обьект был возвращён с нашего Singelton&#8217;а.</p>
<pre><code>var MyObj = function() {

// Private переменные
  var priv1 = 'private 1',
      priv2 = 'private 2';

// Только методы и свойства в пределах этого  объекта будут доступны.
  return {
    doSomething : function() {
      // alert(priv1); // private 1
      alert(this.someProp); // someValue
    },

    someProp : 'someValue'
  }

}(); // эта функция выполняется, когда обьект инициализируется

  MyObj.doSomething();</code></pre>
<p><a href="http://jsbin.com/arayi" target="_blank">Демонстрация</a></p>
<p><em>От себя добавлю, что в скринкасте описывается ещё один метод, с помощью конструктора:</em></p>
<pre><code>
function myConctructor(){
  var private1='sss'; // приватная переменная
  this.public1 = 'seee'; // public переменная
}
</code></pre>
<p><em>Думаю, тут понятно всё.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2010/02/24/podskazka-private-peremennyie-v-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Паттерн Registry в Javascript</title>
		<link>http://blog.web2.com.ua/2009/10/19/pattern-registry-v-javascript/</link>
		<comments>http://blog.web2.com.ua/2009/10/19/pattern-registry-v-javascript/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 06:24:20 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[patterns]]></category>
		<category><![CDATA[registry]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/?p=880</guid>
		<description><![CDATA[Мне почему-то понадобилось реализовать паттерн проектирования Registry на Javascript.  Как сделать это на PHP для меня не представляло сложности, а вот понять объектную модель Javascript у меня никогда не получалось. Самое сложное для меня остаётся понять, почему вышло реализовать Singleton. Код пишу сюда, потому что могу и забыть как делается &#60;script type="text/javascript"&#62; function Registry(){ if(!this.instance){ [...]]]></description>
			<content:encoded><![CDATA[<p>Мне почему-то понадобилось реализовать паттерн проектирования Registry на Javascript.  Как сделать это на PHP для меня не представляло сложности, а вот понять объектную модель Javascript у меня никогда не получалось. Самое сложное для меня остаётся понять, почему вышло реализовать <a href="http://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%BE%D1%87%D0%BA%D0%B0_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29" target="_blank">Singleton</a>.</p>
<p>Код пишу сюда, потому что могу и забыть как делается <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<pre>&lt;script type="text/javascript"&gt;
 function Registry(){
   if(!this.instance){
     /* нет пока объекта
         создадим
     */
       function registry(){  }
       /* сборище хэшей для передаваемых объектов */
       registry.prototype.reg = {}
       /* метод для добавления объектов */
       registry.prototype.add = function(name, object){
          this.reg[name] = object;
       }
       /* метод для получение объектов */
       registry.prototype.get = function (name){
          return this.reg[name];
       }

      this.instance = new registry();
   }
 return this.instance;
 }

.* а так его использовать */
/* добавляем в реестр объект */
 Registry().add('test', 3);
/* получаем объект */
 alert(Registry().get('test'));

 &lt;/script&gt;</pre>
<p>Вот и всё. И даже не скажешь, что не спал ночь )</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2009/10/19/pattern-registry-v-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Функция отмены последнего действия (Undo) &#8211; это просто(Вторая часть): Срочные события</title>
		<link>http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/</link>
		<comments>http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/#comments</comments>
		<pubDate>Fri, 09 Nov 2007 13:12:12 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[Undo]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/</guid>
		<description><![CDATA[Это вторая часть серии &#8220;Функция отмены &#8211; это просто&#8221;. Если вы их пропустили, то прочитайте первую часть [ перевод ]. В предыдущий раз рассматривали метод очереди событий, как полностью клиентскую реализацию лёгкой многоуровневой функции отмены. Я упоминал о паре обмолвок: это не работает в многопользовательской среде и не работает в время-зависимых событиях, как отправка email. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.web2.com.ua/wp-content/uploads/undo.jpg" alt="undo.jpg" class="short" />Это вторая часть серии &#8220;Функция отмены &#8211; это просто&#8221;. Если вы их пропустили, то прочитайте <a href="http://humanized.com/weblog/2007/09/14/undo-made-easy-with-ajax-part-1/" title="part 1" class="new" target="_blank">первую часть</a> [ <a href="http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/" title="перевод">перевод</a> ].</p>
<p>В предыдущий раз рассматривали метод очереди событий, как полностью клиентскую реализацию лёгкой многоуровневой функции отмены. Я упоминал о паре обмолвок: это не работает в многопользовательской среде и не работает в время-зависимых событиях, как отправка email. Я пропустил существенную оговорку, на которой обратил внимание один с моих читателей, Alexander Botero-Lowry: два таба, в которых открыта одна и та же страница, не синхронизируются. Я написал, как это решить с помощью <a href="http://www.humanized.com/weblog/2007/09/21/undo-made-easy-with-ajax-part-15" class="new" target="_blank">cookies</a> [ <a href="http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/" title="перевод" id="v2o-">перевод</a> ].<span id="more-448"></span></p>
<p>На этот раз, давайте взглянем на решение Отмены для срочных действий.  В методе очереди событий, мы могли бы подождать, пока событие &#8220;onunload&#8221;  синхронизирует действия пользователя на стороне клиента с серверной стороной. Для срочных действий, таких как отправка email, у нас нет такой роскоши. Хуже всего, что email &#8211; это не push-технология. Отправивши раз email по диким трубам Internet, оно уже не может быть не отправленным.<a href="#s">*</a> Для несчастных, которые нажали “отправить” и лишь потом осознали, что переслали томное любовное письмо своему боссу, остаётся надеяться на перебои с электроэнергией и спам-фильтры. Учитывая, как часто спам проходит последние мои фильтры, перспективы не столь хороши.</p>
<p>Электронные письма нужно отправлять вскоре после того, как пользователь нажал на &#8220;Отправить&#8221; и операцию отправки нельзя отменить. Что мы можем сделать?</p>
<p>Для решения данной проблемы мы должны обратится к интерфейсу на основе времени. Как правило, интерфейсы на основе времени  не в состоянии быть действительно годным к употреблению, потому что расчёт времени, в действительности, неправильный. Для некоторых людей оно слишком быстро, для других &#8211; медленно. Даже ваше собственное восприятие изменений времени основанно на вашей умственной нагрузке. Когда вы о о чём-то сильно думаете, вы не замечаете течение времени:  что было слишком медленно прежде, теперь будет слишком быстрым. Старая поговорка: &#8220;Время летит, когда вы веселитесь&#8221; действительна для пользовательского интерфейса. Хорошим примером недостатка интерфейса на основе времени можно увидеть в наборе текста в мобильных телефонах, но эта тема подождёт до следующей заметки.</p>
<p>Когда посылается письмо, как правило в период “<a href="http://www.askoxford.com/concise_oed/ohnosecond?view=uk" class="new" target="_blank">‘о, НЕТ! секунду</a>“— доли секунды после нажатия &#8220;отправить&#8221; — вы понимаете, что отправили письмо на неправильный адрес. Желание не посылать электронную почту, которую послали час назад, происходит, но с намного меньшей частотой. Таким образом, решение на основе времени, когда пользователь может не послать письмо, имеет смысл только на коротком промежутке времени: back-end может просто отложить посылку письма на 30-60 секунд и, если пользователь захочет отменить отправку на протяжении нормального периода времени,  back-end уберёт с очереди email и письмо не отправится.</p>
<p>Теперь, я не особенно счастлив с поддержкой интерфейса на основе времени, но я зажат ограничениями. С одной стороны, отправка электронной почты в реальном мире, действие, которое невозможно отменить. С другой стороны, письма надо отправлять живчиком. Функция отмены для срочных событий не является канонической проблемой и единственное решение, которое я вижу &#8211; это компромисс (если кто-то знает другое решение, я весь во внимании!). В целом, многие ситуации, в которой мы, как проектировщики, попадали с непроходимыми препятствиями. Лучшее, что мы можем сделать  &#8211; разрабатывать системы, которые заботятся о наиболее вероятно использованных случаях, и позволяет пользователям изящно вернуться из наиболее распространенных ошибок. Undo на основе времени не решит всех  недостатков отмены отправки письма ( это не будет помогать с ночными электронными письмами, Вы обнаружите, что послали следующим утром), но он будет ловить большинство ошибочно отправленных писем (ошибки типа “‘о, нет!’ секунду!”  и вариант “Я-нажал-на-кнопку-случайно”). И это поймает намного больше ошибочных писем, чем банальное оповещение. Оказалось, что Paul Buchheit, создатель Gmail, <a href="http://paulbuchheit.blogspot.com/2007/06/quick-all-actions-should-have-undo.html" class="new" target="_blank">тоже так думает</a>. Как жаль, что это не было реализовано— это низковисячие фрукты, которые могли бы дать Gmail больший перевес в его превосходстве.</p>
<p>Не так то и много там этого метода. Для реализации его в стиле Ajax, вам просто понадобится mutex и таймер. Когда время истекает (или при переходе со страницы), письмо будет отправлено. Более продвинутый способ предполагает установление флага на сервере наряду с серверным обратным отсчётом. В сложной частью всего этого дело заключается в том, чтобы указать время, оставшееся таким образом, чтобы не запугать пользователей. Например, обратный отсчёт времени вызывает внутреннее чувство паники:<br />
<iframe style="border: medium none ; overflow: hidden; width: 500px; height: 500px;" src="http://humanized.com/weblog/images/resources/undo/email_count_down.html" ></iframe><br />
Не хорошее чувство, неправда-ли? Взамен, медленное затухание работает лучше:<br />
<iframe style="border: medium none ; overflow: hidden; width: 500px; height: 500px;" src="http://humanized.com/weblog/images/resources/undo/email_fade_out.html" ></iframe><br />
Обратный отсчет, который не начинает считать в обратном порядке до последних 10 секунд, мог бы также работать. Это прекрасная задача &#8211; разработать механизмы красивого отображения лимита времени для отмены. Поделитесь своими мыслями в разделе комментариев. Бонусы за предложения любого вида!</p>
<p id="result_box" dir="ltr">В следующий раз я буду говорить о некоторых искусных, более надежных методах введения Отмены с помощью Ajax.</p>
<p id="footnote" style="border-top: 1px dotted #888888; color: #888888; font-size: 80%">*<a title="s" name="s"></a><br />
Есть определенные решения &#8211; хотя и не очень &#8211; для этой проблемы. Для примера, письмо может состоять только с одного вложенного рисунка в виде текста. Если картинка хранится на вашем сервере, тогда для отмены отправки email, вы просто удаляете или меняете рисунок. Это эффективно не отправит контент письма (если уже не отправило). Так что кто-то будет знать только то, что вы отправили сообщение (с темой), но не содержание.</p>
<p><strong>Перевод: </strong><a href="http://humanized.com/weblog/2007/10/22/undo_with_ajax_2/" class="new" target="_blank">Undo Made Easy with Ajax (Part 2): Time-Sensitive Actions</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функция отмены последнего действия (Undo) &#8211; это просто (Часть 1.5)</title>
		<link>http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/</link>
		<comments>http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/#comments</comments>
		<pubDate>Wed, 26 Sep 2007 22:48:51 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[translate]]></category>
		<category><![CDATA[Undo]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/</guid>
		<description><![CDATA[Продолжаю переводить серию статей о реализации Undo. Это вторая часть первой части серии заметок &#8220;Функция отмены последнего действия (Undo)&#8221;. Если вы её пропустили, то сначала прочитайте первую часть (перевод первой части).Один с моих читателей, Alex Botero-Lowry, отметил большую проблему реализации Undo c очереди полностью на стороне клиента: если пользователь открывает эту же страницу на второй [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Продолжаю переводить серию статей о реализации Undo.</p></blockquote>
<p><img src="http://blog.web2.com.ua/wp-content/uploads/undo.jpg" class="short" height="135" width="180" />Это вторая часть первой части серии заметок &#8220;Функция отмены последнего действия (Undo)&#8221;. Если вы её пропустили, то сначала прочитайте <a href="http://humanized.com/weblog/2007/09/14/undo-made-easy-with-ajax-part-1/" class="new" target="_blank" title="Undo Made Easy with Ajax (Part 1)">первую часть</a> (<a href="http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/" class="new">перевод первой части</a>).Один с моих читателей, <a href="http://www.geekfire.com/%7Ealex/blog/" class="new" target="_blank" title="Alex Botero-Lowry">Alex Botero-Lowry</a>, отметил большую проблему реализации Undo c очереди полностью на стороне клиента: если пользователь открывает эту же страницу на второй вкладке браузера для просмотра, то эти страницы могут быть не синхронизированы. В примере to-do листа, если вы удаляете три to-do листа и открываете новую вкладку или окно  этой же страницы, то эти to-do всё-таки останутся. Почему? Потому что первая страница знает о удалении (хотя оно и не законченное), а вторая &#8211; нет.<span id="more-395"></span></p>
<p>Возьмем клиентский подход и запустим его. В том, что нет запутанного back-end&#8217;а есть что-то красивое. Мы можем исправить проблему множественных вкладок, синхронизируя очередь событий  со всех открытых страниц с помощью кукиз (cookie).</p>
<p>Хочу подчеркнуть, что метод очереди событий &#8211; очень легкое решение отмены действия. Существуют другие, более надёжные пути реализации Undo, такие как основаные на серверной стороне <a href="http://en.wikipedia.org/wiki/Command_pattern" title="command pattern" class="new">command pattern</a> (пару моих читателей обратили на это внимание и я, возможно, рассмотрю это в следующих заметках). Но это не относится к делу. Когда мы, как инженеры, стараемся решить сложные проблемы, мы часто слишком обобщаем и слишком абстрагируемся к своему back-end решению, не замечая других вариантов. Когда мы делаем это, мы пропускаем простые решения, которые могут помочь пользователям <em>уже сейчас</em>. Некоторые формы Undo как низко-висячие фрукты, почему же не сорвать их? Конец отступления.</p>
<p>Повторяю, мы решаем что случится, когда пользователь удалит некоторые элементы, откроет другую вкладку этой же страницы и те пункты, оказывается, не удалены. Предположим, что очередь событий хранит идентификаторы удалённых объектов и каждый раз когда элемент удаляется или удаление незаконченное, мы пишем очередь в cookie; когда страница закрывается &#8211; мы очищаем куки. Когда страница загружается &#8211; мы проверяем куки и если в них есть не пустой список, то мы на стороне клиента &#8220;удаляем&#8221; элементы и добавляем их в очередь. Теперь каждая новая вкладка/окно открывается, мы гарантировано синхронизируем их.</p>
<p>Проблема решена.</p>
<h2>Сложность</h2>
<p>Итак, что случится когда вы сделаете изменения на одной странице, а потом переключитесь на другую, уже открытую страницу? Это может усложнить жизнь. Мы спасены от необходимости иметь дело с всей проблемой, потому что web не технология &#8220;толчка&#8221;.  В настоящее время, никакое приложение сети, о котором я знаю, без возможности ручного обновления, не может обновить страницу, когда она изменена в другой вкладке. Пользователи используют обновление страницы, чтобы увидеть изменения. Это означает, что мы должны правильно обходится с вариантом, когда пользователь удаляет и восстанавливает данные в одной вкладке, возвращается в другую и нажимает refresh.</p>
<p>Чтобы решить эту проблему, мы должны сделать предположение, что последняя вкладка/окно, в котором пользователь что-то редактировал, содержит наиболее актуальную информацию. Это резонное предположение, потому что последнее с чем пользователь работал, наиболее вероятно будет тем, о чем пользователь думал как последняя версия.</p>
<p>Когда же пользователь обновляет страницу, вызывается метод onUnload. В нём мы должны проверить, совпадает ли очередь страницы с очередью последней сохранённой в кукисах очередью (помните, что очередь событий сохраняется в cookie, когда пользователь удаляет или отменяет удаление). Если две очереди одинаковые, то страница актуальна и мы продолжаем передачу изменений ксерверу. Если две очереди не одинаковые, то текущая страница требует синхронизации с сохранённой в куках очередью, в результате чего она обновляется.</p>
<h2>Попробуйте</h2>
<p>Поиграйте с <a href="http://humanized.com/weblog/images/resources/undo/todo_sync.html" class="new">этим</a>, затем откройте новое окно браузера. Теперь, измените что-то в новом окне и потом обновите старое окно. Всё правильно обновляется.</p>
<h2>Исходный код</h2>
<p><a href="http://humanized.com/weblog/images/resources/undo/source_sync.php" class="new" title="Находится  здесь">&#8230;находится здесь</a>.</p>
<h2><strong>Заключение</strong></h2>
<p>Польза от пути cookie заключается в том, что это улучшает положение с уже редком случае, когда пользователь теряет свою работу в случае краша браузера. Когда браузер &#8220;падает&#8221;, то все изменения сохраняются в куках, итак, когда пользователь загружает страницу опять, его изменения вся-таки применяться.</p>
<p>Система очереди событий с синхронизацией на куках &#8211; это низковисячий фрукт. Это работает не везде, но будет работать в поразительно большом количестве случаев. Это стоит сравнительно небольших сроков.</p>
<p>На следующей неделе, я напишу о решении Undo для время-зависимых действий.</p>
<p><strong>Перевод:</strong> <a href="http://humanized.com/weblog/2007/09/21/undo-made-easy-with-ajax-part-15/" target="_blank" class="new">Undo Made Easy with Ajax (Part 1.5)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Функция отмены последнего действия (Undo) &#8211; это просто (Часть 1)</title>
		<link>http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/</link>
		<comments>http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/#comments</comments>
		<pubDate>Mon, 24 Sep 2007 08:36:23 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/</guid>
		<description><![CDATA[Я почитываю материалы по многим темам Internet, в том числе и по usability. А тут попалась на глазуа статья, как делать отмену последнего действия под Web. Стало интересно &#8211; решил переводить. Как пользователи, мы делаем ошибки. Как дизайнеры, мы должны спроектировать интерфейсы с учётом этого, как я и утверждал в своей недавней статье Never Use [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Я почитываю материалы по многим темам Internet, в том числе и по usability. А тут попалась на глазуа статья, как делать отмену последнего действия под Web. Стало интересно &#8211; решил переводить.</p></blockquote>
<p><img src="http://blog.web2.com.ua/wp-content/uploads/undo.jpg" class="short" />Как пользователи, мы делаем ошибки. Как дизайнеры, мы должны спроектировать интерфейсы с учётом этого, как я и  утверждал в своей недавней статье <a href="http://www.alistapart.com/articles/neveruseawarning" class="new" target="_blank" title="never using a warning when you mean undo">Never Use a Warning When You Mean Undo</a> ( перевод этой статьи &#8211; <a href="http://designformasters.info/posts/never-use-warnings/" class="new" target="_blank" title="Реализуйте возможность отмены действия, вместо диалогов подтверждения">Реализуйте возможность отмены действия, вместо диалогов подтверждения</a> ). Undo &#8211; это отличный спасательный круг, придающий  потрясающее чувство надёжности работы интерфейса. Вот почему каждое десктопное приложение от Word до Photoshop предоставляет возможность многоуровневой отмены действия.</p>
<p>Так почему же Web-приложения которые предоставляют хоть какую-либо возможность отмены так немногочисленны? Ответ я часто получал, что эту функцию трудно реализовать.Я здесь, чтобы сказать вам, что это не так.<span id="more-394"></span></p>
<p>В этой серии записей в блоге, моя цель объяснить как легко реализовать функциональность отмены действия. Недавно, я дал предварительный вариант этой заметки на семинаре. После показа  демо того, как может работать отмена,  аудитория  слегка привстала со своих мест. Когда же я открыл исходный код и начал показывать как это реализовано, универсальный возглас был: &#8220;Зачем Вы объясняете это? Это же всем понятно. Мы же разработчики ПО. Это легко!&#8221;</p>
<p>То-то же!</p>
<p>Добавление Undo в ваши интерфейсы сильно и положительно повлияет на удобство пользования вашим сайтом. Это уменьшит разочарования пользователя и увеличит его доверие.Оба этих умозаключения означают, что большие количество<br />
пользователей вернуться, что увеличит вашу прибыль. Запомните: для пользователя, интерфейс &#8211; это продукт.</p>
<p>Теперь вы не можете не реализовать функцию отмены. Итак, без дальнейших хлопот, вот вам первый метод реализации.</p>
<h2>   Метод 1: Очередь событий</h2>
<p align="left">   Ситуация: Вы сделали онлайновый to-do список и пользователя нужна возможность удалить любую сущность со списка. Вы не хотите, чтобы пользователь удалил сущность случайно, также вы  не хотите чтобы он изменил своё мнение после удаления или через 2 секунды. Этот метод теперь реализован в Интернете через уведомление пользователю диалоговым окном.</p>
<ul class="picture">
<li><img src="http://humanized.com/weblog/images/highrise_warning.png" alt="Deleting a to-do item in highrise requires the use of a warning." title="Deleting a to-do item in highrise requires the use of a warning." align="middle" /></li>
<li>     Даже 37 Signals, обычно оплот хорошего дизайна, использует уведомление вместо отмены действия.</li>
</ul>
<p>Это не только не работает &#8211; это блокирует браузер, требуя принять решение перед тем, как переключиться на другую вкладку. Если вам нужно проверить электронную почту, чтобы выяснить, можно ли удалить дело, Вам не повезло.</p>
<p>Попробуйте поработать со списком to-do со стандартным (но не очень гуманным) окном предупреждения.</p>
<p><iframe src="http://humanized.com/weblog/images/resources/undo/todo_warning.html" style="height: 410px; width: 600px"></iframe></p>
<p>Теперь представим, что мы изменили своё мнение о удалении чего-либо или хотите удалить 3 строчки. Как бы расстраивает, не так ли?</p>
<p>Правильно решение функции отмены, которое мы можем осуществить здесь имеет очередь событий и вызов “onUnload”. Когда мы нажимаем на удаление, to-do сущность исчезает. В общем, в этой точке мы должны будем отправить AJAX-запрос на сервер, чтобы удалить её. Когда пишем Undo, вместо немедленного вызова AJAX, мы ждём пока пользователь уйдёт с текущей страницы (это мы определяем, используя вызов “onUnload”). Это достигается путём добавления ссылки на to-do в очередь для безопасного сохранения.</p>
<p>Когда пользователь нажимает на Undo, мы достаём последнюю добавленную в очередь и делаем её видимой опять. Когда же пользователь уходит со страницы или закрывает её, вызывается метод “onUnload”. На данном этапе мы получаем собитие с очереди и отправляем AJAX-запрос о удалении списка.</p>
<p>Одним с больших преимуществ метода с очередью событий в том, что это делает реализацию многоуровневой отмены задачей очень тривиальной. И это также даёт безболезненное удаление списка to-do кучей (чего нет, когда удаление происходит с сообщением). Попробуйте!<br />
<iframe src="http://humanized.com/weblog/images/resources/undo/todo.html" style="height: 600px; width: 600px"></iframe></p>
<h2>   Исходный код</h2>
<p>Заинтриговало? Хотите знать больше? Хорошо. Вот и <a href="http://humanized.com/weblog/images/resources/undo/source.php" class="new">задокументированный исходный код</a>.</p>
<h2>   Предупреждение</h2>
<p>Метод очереди событий в реализации функции отмены не идеален:</p>
<ul>
<li>     Если браузер пользователя или компьютер вызовет ошибку, тогда работа пользователя потеряется. Это явно не оптимальный расклад..С другой стороны,это редкое явление и можно смело игнорировать все, кроме жизни и смерти<br />
важных данных.</li>
<li>     Работа в реальном времени не работает в этом методе, потому что данные не отправляются серверу пока пользователь не уйдёт со страницы. Таким образом, другие пользователи не увидят изменений в реальном времени. Другие методы<br />
реализации Undo обходят даную проблему, но надо ждать другую заметку с этой серии.</li>
<li>     Этот метод не целесообразно использовать для отправки emails или других срочных действий. Потому что действие будет завершено только тогда, когда пользователь покинет страницу, а это может растянуться на полчаса или час пока email будет отправлено. Это неприемлемо.</li>
</ul>
<h2>Вывод</h2>
<p>Как Вы видите, Undo не слишком трудоёмкое занятие. Метод очереди событий можно даже сделать полностью на клиентской стороне, что означает, что вы можете реализовать отмену даже без изменений &#8220;back end&#8221;.</p>
<p>Итак, больше никаких отговорок по-поводу сложности реализации функции отмены последнего действия! Пришла пора Undo в web!</p>
<p>На следующей неделе я покажу, как сделать Отмену для срочных действий.</p>
<p><strong>Перевод статьи <a href="http://humanized.com/weblog/2007/09/14/undo-made-easy-with-ajax-part-1/" title="Permanent Link to Undo Made Easy with Ajax (Part 1)" class="new">Undo Made Easy with Ajax (Part 1)</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Как установить Aptana на уже существующий Eclipse</title>
		<link>http://blog.web2.com.ua/2007/07/25/kak-ustanovit-aptana-na-uzhe-suschestvuyuschiy-eclipse/</link>
		<comments>http://blog.web2.com.ua/2007/07/25/kak-ustanovit-aptana-na-uzhe-suschestvuyuschiy-eclipse/#comments</comments>
		<pubDate>Wed, 25 Jul 2007 12:01:51 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[настройка]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/07/25/kak-ustanovit-aptana-na-uzhe-suschestvuyuschiy-eclipse/</guid>
		<description><![CDATA[Кто не знает то пока я web-developer (нравиться мне это слово. И просто вэб-программист не подходит). И в дому и в рабочей обстановке, системой, на которой происходит процесс набора букв с сайты, является ново-старая openЗЮЗЯ (именно в такой последовательности больших букв, так как openSUSE её настоящее имя ). Если посчитать, сколько ПО использую . для [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.web2.com.ua/wp-content/uploads/windowslivewriteraptanaopensuse10.2-185aptana-logo41.jpg" class="short" />Кто не знает то пока я web-developer (нравиться мне это слово. И просто вэб-программист не подходит). И в дому и в рабочей обстановке, системой, на которой происходит процесс набора букв с сайты, является ново-старая openЗЮЗЯ (именно в такой последовательности больших букв, так как openSUSE её настоящее имя <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Если посчитать, сколько ПО использую . для работы, то получается многовато<span id="more-376"></span>:</p>
<ul>
<li>для HTML &#8211; <a href="http://quanta.kdewebdev.org/" title="quanta" class="new" target="_blank">quanta</a>. Удобно, подсвечивает, подсказывает иногда показывает, но над показом ей к дримвиверу ещё сра&#8230;. ой, далеко;</li>
<li>для CSS та же кванта, но есть <a href="http://cssed.sourceforge.net/" title="cssed" class="new">cssed</a>, но используется крайне редко;</li>
<li>для JavaScript используется прекрасный редактор <a href="http://aptana.org" title="Aptana" class="new">Aptana</a>, которая за последнее время очень прибавила и даже <a href="http://blog.web2.com.ua/2007/02/24/aptana-opensuse-102/" class="new">описанный мною бубен</a> ей уже не требуется;</li>
<li>для PHP (все руби, удавы и дотНето идут лесом вприпрыжку, забирая за собой свой кал и сопли, ибо им на этом свете нечего делать со своими языками) пишу &#8220;на_совсем_уже_купленном_за_свои_заработанные_деньги_типа&#8221; Zend Studio. Кряк не дам <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , ищите гуглом. Зы, а хоть сколько оно стоит? <strong>ой, мама!</strong> (Сходивши на <a href="http://www.zend.com/store/software/zend_studio" target="_blank" class="new">сайт</a>)</li>
</ul>
<p>А вот если поcчитать, что Aptana и Zend &#8211; это java-приложения, и они всегда запущены, то я задумался о альтернативах и совмещении этого хотя бы в что-то одно. Конечно, я задумался над мыслю, что 256 оперы на ЗюЗе дома, это даже не мало, а катастрофически ничтожно. Присматриваясь с <a href="http://www.eclipse.org/pdt/index.php" target="_blank" class="new">PHP IDE</a> от тех же Zend, но бесплатном и на Eclipse, решил попробовать работать в нём. Да и не просто работать, я решил совместить разработку на php c  javascript в Aptana. Для этого нужно на один Eclipse повесить плагины от PHP IDE и Aptana.</p>
<p>Первое что я сделал, дабы упростить себе жизнь, я скачал уже собранный с плагинами (для <a href="http://www.eclipse.org/downloads/download.php?file=/tools/pdt/downloads/drops/S20070611-M1/all-in-one/pdt-all-in-one-S20070611_M1-linux-gtk.tar.gz" class="new" target="_blank">Linux</a> или <a href="http://www.eclipse.org/downloads/download.php?file=/tools/pdt/downloads/drops/S20070611-M1/all-in-one/pdt-all-in-one-S20070611_M1-win32.zip" target="_blank" class="new">Windows</a>) PHP IDE. Если же у вас есть Eclipse, то качать следует только <a href="http://europa-mirror1.eclipse.org/tools/pdt/downloads/" target="_blank" class="new">плагины</a>. Скачавши, распаковавши, проверил работает ли всё (таки да) и попробовал пописать чуть код. Не привык к нему, но что поделаешь ради мирового господства пролетариата.</p>
<p>Следующий этап &#8211; поставить на всё Aptana. Честно, думал всё сложнее, но как оказалось &#8211; всё для простоты разработчика.</p>
<p>1. Выбираем пункт меню <strong>Help</strong>-><strong>Software Updates</strong>-><strong>Find and Install</strong></p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/eclipse.png" alt="eclipse.png" /></li>
<li>Установка Aptana</li>
</ul>
<p>В диалоговом окне следует выбрать, что мы хотим установить новую фичу.</p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/eclipse1.png" alt="eclipse1.png" /></li>
<li>Выбираем установку</li>
</ul>
<p>В результате имеем окно установки.</p>
<ul class="picture">
<li> <img src="http://blog.web2.com.ua/wp-content/uploads/eclipse2.png" alt="eclipse2.png" /></li>
<li>Окно установки</li>
</ul>
<p>Для того, чтобы Eclipse нашёл нашу Aptana, надо добавить сторонний сайт.  Для этого нажимаем на кнопку <strong>New Remote Site </strong>и получаем диалог <strong>New Update Site</strong>. В имя сайта хоть фамилию бабушки, а вот в линк добавить следует <a href="http://update.aptana.com/install/3.2/" target="_blank" class="new">http://update.aptana.com/install/3.2/</a></p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/eclipse3.png" alt="eclipse3.png" /></li>
<li>Добавление нового сайта для Aptana</li>
</ul>
<p>Нажимаем Ok, редактор что-то там шуршит и в результате получаем в окне установки новый сайт с плагинами. Финиш и ждём.  Когда появится окно что ниже, тоже всё финиш, принимаем лицензию и тд</p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/eclipse4.png" alt="eclipse4.png" /></li>
<li>Установка уже плагина</li>
</ul>
<p>В один прекрасный момент выведется список плагинов, который идёт с Aptana. Выбираем всё и жмём Finish.</p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/eclipse5.png" alt="eclipse5.png" /></li>
<li>Плагины Aptana</li>
<li><img src="http://blog.web2.com.ua/wp-content/uploads/eclipse6.png" alt="eclipse6.png" /></li>
<li>Идёт загрузка всего нужного</li>
</ul>
<p>Дальше рассказывать просто нет смысла, так всё тривиально: загрузка, установка и перегрузка Eclipse.</p>
<p>Во всём этом разбирался с <a href="http://aptana.org/docs/index.php/Plugging_Aptana_into_an_existing_Eclipse_configuration" target="_blank" class="new">сайта Aptana</a>.<br />
Всё, работает.</p>
<p>Остался ещё один маленький вопрос: чтобы ещё перевести под одну платформу разработки?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/07/25/kak-ustanovit-aptana-na-uzhe-suschestvuyuschiy-eclipse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Аналоги radiobutton</title>
		<link>http://blog.web2.com.ua/2007/07/11/analogi-radiobutton/</link>
		<comments>http://blog.web2.com.ua/2007/07/11/analogi-radiobutton/#comments</comments>
		<pubDate>Wed, 11 Jul 2007 09:10:30 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[верстка]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/07/11/analogi-radiobutton/</guid>
		<description><![CDATA[Я долго думал как начать, чтобы не спровоцировать флейм и непонимание меня. Понять, почему я сделал именно так, а не иначе, тоже не возможно. Думаю хотел сделать проще, хотя такая идея мне тоже не по душе. Я не люблю переопределения интерфейса. Я терпеть не могу, когда Опера выводит свое окно не так как настроено в [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.web2.com.ua/wp-content/uploads/rp1.png" class="short" />Я долго думал как начать, чтобы не спровоцировать флейм и непонимание меня. Понять, почему я сделал именно так, а не иначе, тоже не возможно. Думаю хотел сделать проще, хотя такая идея мне тоже не по душе.</p>
<p>Я не люблю переопределения интерфейса. Я терпеть не могу, когда Опера выводит свое окно не так как настроено в KDE, а как-то по-другому. Ведь если разработчики сделали методы для вывода окна, то зачем изобретать велосипед? Итак делает не только Опера: Zend DE и куча других программ. Зачем?</p>
<p>Но. Вместе с этим я понимаю, чем грозит линковка большущих либ, в которых тебе нежно только кнопка &#8220;Ok&#8221;. Проект разрастается и, как  следствие, уменьшается время загрузки приложения.</p>
<p>Теоретически это касается и WEB. Но только косвенно. Ведь все согласны, что стандартных input не то что мало, а их НЕТ! Конечно, саморобные контролы снижают узнаваемость их пользователями, но если подойти с умом, то можно сделать вполне удачные аналоги.</p>
<p>Вот и я, дабы упростить себе жизнь (лень мне писать кучу javascript-кода <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) решил вместо стандартных radiobutton сделать свои. На самом деле, сложного нет в этом ничего, да и удобностей поболе, как по мне.<span id="more-374"></span></p>
<p>Что же я имел вначале? Есть поле status типа enum , которое может принимать значения &#8216;new&#8217;, &#8216;confirm&#8217; и &#8216;done&#8217;. Следует сделать механизм показа значения поля и его редактирования.</p>
<p>Конечно, можно это сделать с помощью   radiobutton. Это 3 радио-кнопки и в зависимости от значения, одну с них нужно делать выбранной. Кто это реализовывал, тот знает, что каждый radio имеет простой индекс, и связь возможна, только пройдя по всем кнопкам и, если значение поля равно value радио-кнопки, то надо сделать её выделенной. Такие варианты меня не устраивали. Я же решил пойти другим путём.</p>
<p>Первое, с чего надо начать, так это создать 3 рисунка с ссылками на них и поле типа hidden, чтобы сохранять и передавать потом в форме значение статуса:
<pre><code class="html"><span class="tag">< </span><span class="keyword">div</span><span class="attribute"> id=</span><span class="value">"status"</span>>
	<span class="tag">< </span><span class="keyword">a</span><span class="attribute"> class=</span><span class="value">"st_new"</span><span class="attribute"> href=</span><span class="value">""</span>><span class="tag">< </span><span class="keyword">img</span><span class="attribute"> src=</span><span class="value">"/_img/1x1.gif"</span> /><span class="tag"><!--</span--></span><span class="keyword">a</span>>
	<span class="tag">< </span><span class="keyword">a</span><span class="attribute"> class=</span><span class="value">"st_confirm"</span><span class="attribute"> href=</span><span class="value">""</span>><span class="tag">< </span><span class="keyword">img</span><span class="attribute"> src=</span><span class="value">"/_img/1x1.gif"</span> /><span class="tag"><!--</span--></span><span class="keyword">a</span>>
	<span class="tag">< </span><span class="keyword">a</span><span class="attribute"> class=</span><span class="value">"st_done"</span><span class="attribute"> href=</span><span class="value">""</span>><span class="tag">< </span><span class="keyword">img</span><span class="attribute"> src=</span><span class="value">"/_img/1x1.gif"</span> /><span class="tag"><!--</span--></span><span class="keyword">a</span>><span class="tag">< </span><span class="keyword">span</span>>
<span class="tag"><!--</span--></span><span class="keyword">div</span>>
<span class="tag">< </span><span class="keyword">input</span><span class="attribute"> type=</span><span class="value">"hidden"</span><span class="attribute"> name=</span><span class="value">"status"</span><span class="attribute"> value=</span><span class="value">""</span>></code></pre>
<p>Как видно с кода, в слое #status находятся картинки с ссылками. А теперь пропишем стили, чтобы это всё выглядело &#8220;по-людски&#8221;:</p>
<pre><code class="css">< <span class="keyword">style>
</span><span class="id">#status</span> <span class="keyword">img</span><span class="rules">{
	</span><span class="keyword">width</span>:<span class="value"> 16px</span>;
	<span class="keyword">border</span>:<span class="value"> 1px #E8E8E8 solid</span>;
}
<!--<span class="keyword"-->style></code></pre>
<p>В результате мы имеем картину:
</p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/radio.png" />
</li>
<li>Внешний вид статусов</li>
</ul>
<p>А теперь расскажу, как мы будем устанавливать активный статус. Для этого мы для div#status установим класс с именем нужного статуса. Если активный статус new, то получим
<pre><code class="html"><span class="tag">< </span><span class="keyword">div</span><span class="attribute"> id=</span><span class="value">"status"</span><span class="attribute"> class=</span>'new'></code></pre>
<p>Самое интересное , что в HTML это всё что надо! Теперь дело только за CSS. Напишем правила для CSS в которых, если активный пункт, то выводим красную границу: </p>
<pre><code class="css"><span class="id">#status</span><span class="class">.new</span> <span class="keyword">a</span><span class="class">.st_new</span> <span class="keyword">img</span>, <span class="id">#status</span><span class="class">.confirm</span> <span class="keyword">a</span><span class="class">.st_confirm</span> <span class="keyword">img</span>,<span class="id">#status</span><span class="class">.done</span> <span class="keyword">a</span><span class="class">.st_done</span> <span class="keyword">img</span><span class="rules">{
	</span><span class="keyword">border</span>:<span class="value"> 1px red solid</span>;
}</code></pre>
<p>Согласно этому правилу, если #status имеет стиль new, то картинка под a.st_new приобретает красную границу. Аналогично и с confirm и done.
</p>
<ul class="picture">
<li><img src="http://blog.web2.com.ua/wp-content/uploads/radio_new.png" /></li>
<li><img src="http://blog.web2.com.ua/wp-content/uploads/radio_confirm.png" /></li>
<li><img src="http://blog.web2.com.ua/wp-content/uploads/radio_done.png" /></li>
<li>Вот оно всё в действии с разными class.</li>
</ul>
<p>Всё, тут уже нечего делать. Осталось в input вписывать статус и менять класс на #status. Js-функция для этого дела очень простая:
<pre><code class="javascript"><span class="function"></span><span class="keyword">function</span> <span class="title">ch_status</span><span class="params">(status_value)</span>{
	<span class="keyword">if</span> (status_value != <span class="string">'new'</span> &#038;&#038; status_value != <span class="string">'confirm'</span> &#038;&#038; status_value != <span class="string">'done'</span>)
		 status_value = <span class="string">'new'</span>;
	document.forms[<span class="string">'st'</span>].elements[<span class="string">'status'</span>].value = status_value;
	document.getElementById(<span class="string">'status'</span>).className = status_value;
	<span class="keyword">return</span> <span class="literal">false</span>;
}
</code></pre>
<p>Осталось только повесить её на теги a и всё. Весть документ со всем тоже <a href="http://blog.web2.com.ua/wp-content/uploads/u1.html" target="_blank" class="new">прилагается</a>. Один минус, как по мне, то это медленная прорисовка FF изменений. Что тут сложного? А вот Opera всё красиво и быстро обрабатывает.
</p>
<p class="poweredbyperformancing">Powered by <a href="http://scribefire.com/">ScribeFire</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/07/11/analogi-radiobutton/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Кто получил стиль?</title>
		<link>http://blog.web2.com.ua/2007/07/03/kto-poluchil-stil/</link>
		<comments>http://blog.web2.com.ua/2007/07/03/kto-poluchil-stil/#comments</comments>
		<pubDate>Tue, 03 Jul 2007 16:18:34 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[wtf]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/07/03/kto-poluchil-stil/</guid>
		<description><![CDATA[Из-за поддержки всеми A-grade браузерами DOM, множество основных (и некоторые сложные) взаимодействия могут быть выполнены с относительной лёгкостью. Такие штуки как добавление и удаление элементов, вставка HTML-тегов и работа с событиями сейчас довольно податливы в основе cross-браузерности. Там, естественно, несколько причуд которые вы должны будете учесть, но, в целом, большинство вещей работают, как вы и [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.web2.com.ua/wp-content/uploads/rp1.png" class="short" />Из-за поддержки всеми <a href="http://developer.yahoo.com/yui/articles/gbs/" class="new" target="_blank">A-grade браузерами</a> DOM, множество основных (и некоторые сложные) взаимодействия могут быть выполнены с относительной лёгкостью. Такие штуки как добавление и удаление элементов, вставка HTML-тегов и работа с событиями сейчас довольно податливы в основе cross-браузерности. Там, естественно, несколько причуд которые вы должны будете учесть, но, в целом, большинство вещей работают, как вы и ожидали. За исключением динамической вставки CSS на вашу страницу. <span id="more-362"></span>
<p>Во время написания HTML, CSS могут быть включены на страницу используя тег<br />
<style>  , как ниже: </p>
<pre><code class="html"><span class="tag"><</span><span class="keyword">style</span><span class="attribute"> type=</span><span class="value">"text/css"</span>>
  a {
    color: red;
  }
<span class="tag"><!--</span--></span><span class="keyword">style</span>></code></pre>
<p> Этот кусок кода может размещаться где угодно на странице и эти правила применяются для всей страницы. Поскольку мы имеем DOM API, которое дает нам возможность динамически создавать элементы, атрибуты и текст узлов с документом, можно предположить, что некоторый очень простой JavaScript код может быть использован для имитации этого HTML-кода. Логично, что это должно работать так: </p>
<pre><code class="javascript">var styleElement = document.createElement("style");
styleElement.type = “text/css”;
styleElement.appendChild(document.createTextNode(”a { color: red; }”));
document.body.appendChild(styleElement);</code></pre>
<p>Должно было быть так просто... но не в этом случае. В Opera и Firefox, в браузерах, которые больше поддерживают стандарты, это работает прекрасно. В Safari и Internet Explorer это терпит неудачу, хотя не по одной и той же самой причине.</p>
<p>Safari требует динамично созданного элемента<br />
<style>, вставленного в , чтобы правила применялись, что довольно просто изменить в предыдущем коде:</p>
<pre><code class="javascript">var styleElement = document.createElement("style");
styleElement.type = “text/css”;
styleElement.appendChild(document.createTextNode(”a { color: red; }”));
document.getElementsByTagName(”head”)[0].appendChild(styleElement);</code></pre>
<p>Этот код теперь работает в Opera, Firefox и Safari. Но что в IE? Когда IE встречает style.appendChild(),  это бросает довольно тупое и не-очень-полезное сообщение о ошибке: “unexpected call to method or property access”. Попробовав заменить этот вызов на innerHTML и вы получите идентичное по бесполезности сообщение о ошибке “unknown runtime error”. Что здесь происходит? </p>
<p> Оказывается, что IE не позволит Вам управлять style-элементами таким образом. Однако существует другой путь сделать то же самое. IE поддерживает свойство styleSheet в каждом элементе стиля, которое разрешает управлять таблицами стилей и правилами с них. Свойство styleSheet имеет метод, называемый cssText, который можно использовать для установки и получения CSS текста таблицы стилей. Итак, код можно изменить таким образом, чтобы он выполнялся и в IE:</p>
<pre><code class="javascript">var styleElement = document.createElement("style");
styleElement.type = “text/css”;
if (styleElement.styleSheet) {
  styleElement.styleSheet.cssText = “a { color: red }”;
} else {
  styleElement.appendChild(document.createTextNode(”a { color: red; }”));
}
document.getElementsByTagName(”head”)[0].appendChild(styleElement);</code></pre>
<p> Этот код работает в  A-grade браузерах  и может быть обобщён в такую функцию: </p>
<pre><code class="javascript">function addCss(cssCode) {
var styleElement = document.createElement(”style”);
  styleElement.type = “text/css”;
  if (styleElement.styleSheet) {
    styleElement.styleSheet.cssText = cssCode;
  } else {
    styleElement.appendChild(document.createTextNode(cssCode));
  }
  document.getElementsByTagName(”head”)[0].appendChild(styleElement);
}</code></pre>
<p> Используя эту функцию, вы можете добавить множество новых блоков CSS-кода в вашу страницу как вы пожелаете.</p>
<p><b> Предупреждение: </b>Только IE разрешает запись в  styleSheet.cssText   один раз в<br />
<style>. Если вы попробуете сделать это больше одного раза, то можете "завалить" браузер. В результате,  лучше повторно не использовать элемент<br />
<style>   на странице. Вместо этого, удалите его или просто добавьте новый элемент. </p>
<p><b>Оригинал: </b><a href="http://yuiblog.com/blog/2007/06/07/style/" class="new" target="_blank">Who’s Got Style?</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/07/03/kto-poluchil-stil/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

