<?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>Блог маленького, но очень отважного программиста &#187; JavaScript</title>
	<atom:link href="http://xo66ut.ru/archives/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://xo66ut.ru</link>
	<description>PHP, MySQL, Javascript, JQuery, ExtJS, UML, и другие интернетости...…</description>
	<lastBuildDate>Tue, 04 Oct 2011 08:40:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Запоминаем положение интерфейса средствами JavaScript</title>
		<link>http://xo66ut.ru/archives/526</link>
		<comments>http://xo66ut.ru/archives/526#comments</comments>
		<pubDate>Wed, 13 Oct 2010 06:46:03 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[userfriendly]]></category>
		<category><![CDATA[userinterface]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=526</guid>
		<description><![CDATA[
Очень важным моментом в интерфейсе сайта является сохранение его текущего положения, для того, чтобы после перезагрузки страницы, пользователю не пришлось заново повторять свои действия с настройкой интерфейса сайта под себя. Идеальным средством для хранения состояния пользовательского интерфейса является cookies. Всем известно как работать с куки с помощью серверных (backend) языков,  но зачастую проще это делать [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://xo66ut.ru/wp-content/uploads/2010/10/uisave.jpg"><img class="aligncenter size-full wp-image-530" style="border: 0pt none;" title="uisave" src="http://xo66ut.ru/wp-content/uploads/2010/10/uisave.jpg" alt="" width="496" height="146" /></a></p>
<p>Очень важным моментом в интерфейсе сайта является сохранение его текущего положения, для того, чтобы после перезагрузки страницы, пользователю не пришлось заново повторять свои действия с настройкой интерфейса сайта под себя. Идеальным средством для хранения состояния пользовательского интерфейса является cookies. Всем известно как работать с куки с помощью серверных (backend) языков,  но зачастую проще это делать напрямую из JavaScript. Конечно можно передавать данные интерфейса серверной части, а там уже сохранять их хоть в БД. Но как правило, если вы не разрабатывайте новый интерфейс для gmail, нет необходимости делать это для 5-6 параметров.</p>
<h2>JavaScript и Cookies.</h2>
<p>В JavaScript есть стандартные методы для работы с document.cookie, именно так происходит обращение к куки в JavaScript. Например функция для установки куки будет выглядеть следующим образом</p>
<pre class="brush: jscript;">
function setCookie(c_name,value,expiredays)
 {
        var exdate=new Date();
        exdate.setDate(exdate.getDate()+expiredays);
        document.cookie=c_name+ &quot;=&quot; +escape(value)+
        ((expiredays==null) ? &quot;&quot; : &quot;;expires=&quot;+exdate.toUTCString());
 }
</pre>
<p>Как вы видите не очень удобно, поэтому я и предпочитаю пользоваться JQuery плагинами, если конечно фреймворк в проекте уже присутствует, если нет, то подключать JQuery, только из-за работы с куки не рационально.  В принципе взяв <a href="http://www.w3schools.com/js/js_cookies.asp" target="_blank">готовые функции</a> для document.cookie или написав их самостоятельно, можно свести неудобства и количество кода к минимуму.</p>
<h2>Плагины cookies для JQuery.</h2>
<p>Если в вашем сайте уже используется JQuery, то наиболее простой способ наладить работу с cookies, это использовать плагин. Плагинов довольно много я обычно использую <a href="http://code.google.com/p/ezcookie/">ezCookie</a>. В плагине содержатся стандартные методы для работы с cookies &#8211; установка, чтение, удаление. На странице проекта есть детальное описание всех методов. Плагин ezCookie отличается от многих подобных автоматическим распознаванием значения установленной cookie, и, если это JSON данные, то функция автоматически возвращает JSON объект. Такой режим работы позволяет устанавливать subcookie, то есть множества пар имя:значение для одного cookie (для одной cookie переменной).</p>
<h2>Сохранение положения интерфейса.</h2>
<p>Давайте напишем небольшой пример, который позволит понять схему сохранения простых позиций интерфейса. Пусть у нас будет 5 разноцветных квадратов, которые по клику на кнопку &#8220;закрыть&#8221; закрываются, и текст на кнопке меняется на &#8220;открыть&#8221;. И при нажатии на кнопку &#8220;открыть&#8221; соответственно квадрат снова становится видимым.</p>
<p>Для этого воспользуемся стандартной JQuery функцией toggle (переключатель), которая в качестве аргументов принимает 2 функции, одна из которых срабатывает на четном щелчке мыши, другая на нечетном. Чтобы сохранить положение квадратов, мы в первой toggle функции будем устанавливать значение cookie в 0, а на второй функции в 1, ноль означает, что квадрат скрыт, а единица соответственно, что квадрат виден.</p>
<p>Здесь я использую функцию ezCookie <strong>$.setSubCookie</strong>, чтобы не увеличивать количество записей cookie. Так как структурно записи для каждого квадрата у нас равны, то все проще хранить в одной cookie с именем &#8220;ui_save&#8221;. В качестве дополнительных параметров метод <strong>$.setSubCookie</strong> позволяет установить время жизни cookies, но в данном случае используется время жизни по умолчанию.</p>
<p>Итак позицию интерфейса в зависимости от действий пользователя мы записали, теперь нам необходимо сделать так, чтобы после загрузки страницы интерфейс возвращался в записанное состояние. Для этого мы сначала считаем нашу куку функцией <strong>$.cookie(&#8220;ui_save&#8221;)</strong>, эта функция автоматически определяет какое значение установлено в куке и если это JSON, то она возвращает JSON объект, что в нашем случае и происходит. Далее для каждого квадрата мы проверяем значение и если оно равно нулю то вызываем событие click, которое установит нужное положение квадрата.</p>
<pre class="brush: jscript;">
	$(document).ready(function(){
		$(&quot;.close&quot;).toggle(
			function(){
				$(this).prev().slideUp(); //скрываем квадрат
				$(this).html(&quot;Открыть&quot;);
				var class_name = $(this).prev().attr(&quot;class&quot;);
//устанавливаем значение куки для конкретного квадрата в положение закрыть
				$.setSubCookie(&quot;ui_save&quot;, class_name, 0);
			},
			function(){
				$(this).prev().slideDown(); //разворачиваем квадрат
				$(this).html(&quot;Закрыть&quot;);
				var class_name = $(this).prev().attr(&quot;class&quot;);
//устанавливаем значение куки для конкретного квадрата в положение открыт
				$.setSubCookie(&quot;ui_save&quot;, class_name, 1);
			}
		);

		//Устанавливаем необходимую позицию интерфейса
		var ck = $.cookie(&quot;ui_save&quot;);
		for(key in ck){
			if(ck[key] == 0){
//вызываем событие &quot;закрыть&quot;
				$(&quot;.&quot; + key).next().trigger('click');
			}
		}

	});
</pre>
<p>То что получилось можно посмотреть <a href="http://xo66ut.ru/examples/uisave/ui_example.html">здесь</a>, после обновления страницы позиция интерфейса (закрытые, открытые квадраты) сохраняется.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=526&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/526/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Javascript сокращения для уменьшения кода</title>
		<link>http://xo66ut.ru/archives/427</link>
		<comments>http://xo66ut.ru/archives/427#comments</comments>
		<pubDate>Mon, 21 Jun 2010 12:01:21 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=427</guid>
		<description><![CDATA[
Для языка Javascript очень важно количество байт кода &#8211; это напрямую влияет на производительность. Во многом из-за этого, как я думаю, придумано множество сокращений. Также эти сокращения записи, позволяют сделать код более читабельным и писать его быстрее.
Инкремент/Декремент/Умножение/Деление
Вместо:

growCount = growCount + 1;
shrinkCount = shrinkCount - 1;

Намного проще и красивей написать:

growCount ++;
shrinkCount --;

Для сложения\вычитания\умножения\деления

growCount += 100; //увеличиваем [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full" style="border: 0pt none;" title="javascript_shorteners" src="http://xo66ut.ru/wp-content/uploads/2010/06/javascript_shorteners.jpg" alt="" width="300" height="300" /></p>
<p>Для языка Javascript очень важно количество байт кода &#8211; это напрямую влияет на производительность. Во многом из-за этого, как я думаю, придумано множество сокращений. Также эти сокращения записи, позволяют сделать код более читабельным и писать его быстрее.<span id="more-427"></span></p>
<h2>Инкремент/Декремент/Умножение/Деление</h2>
<p>Вместо:</p>
<pre class="brush: jscript;">
growCount = growCount + 1;
shrinkCount = shrinkCount - 1;
</pre>
<p>Намного проще и красивей написать:</p>
<pre class="brush: jscript;">
growCount ++;
shrinkCount --;
</pre>
<h3>Для сложения\вычитания\умножения\деления</h3>
<pre class="brush: jscript;">
growCount += 100; //увеличиваем переменную growCount на 100
shrinkCount -= 2; //уменьшаем переменную shrinkCount на 2

moreCount *= 5; // умножаем переменную moreSweets на 5
lessCount /= 3; // делим переменную lessApple на 3
</pre>
<h2>Условный оператор.</h2>
<p>Следующая конструкция, знакомая многим из других языков программирования экономит сразу несколько строк кода. Было:</p>
<pre class="brush: jscript;">
if(myAge &gt; legalAge) {
    canDrink = true;
}
else {
    canDrink = false;
}
</pre>
<p>Стало:</p>
<pre class="brush: jscript;">
var canDrink = (myAge &gt; legalAge) ? true : false;
</pre>
<h2>Заполнение ассоциативного массива.</h2>
<p>Многие привыкли делать это следующим образом:</p>
<pre class="brush: jscript;">
var language = new Array();
language['Language Name'] = 'Javascript';
language['Type'] = 'Object-oriented';
language['Framework'] = 'jQuery';
language['Other'] = 'Improve Usability';
</pre>
<p>Javascript же предлагает следующую конструкцию:</p>
<pre class="brush: jscript;">
var language = {
    'Language Name' : 'Javascript',
    'Type' : 'Object-oriented',
    'Framework' : 'jQuery',
    'Other' : 'Improve Usability'
};
</pre>
<h2>Значение переменной по умолчанию.</h2>
<p>Вместо много-строковой конструкции:</p>
<pre class="brush: jscript;">
function displayValues(limit) {
    var length;
    if(limit) {
        length = limit;
    } else {
        length = 10;
    }
}
</pre>
<p>Можно просто написать:</p>
<pre class="brush: jscript;">
function displayValues(limit) {
    var length = limit || 10;
}
</pre>
<p>Если функции не было передан параметр <em>limit</em>, то <em>length </em>будет равен значению по умолчанию &#8211; <strong>10</strong><br />
Для того, чтобы переменная <em>length </em> получила значение <strong>10</strong> должны быть выполнены следующие условия <em>limit </em>=</p>
<ul>
<li>false</li>
<li>0</li>
<li>null</li>
<li>undefined</li>
<li>empty string</li>
</ul>
<p>Во всех остальных случаях переменная <em>length </em> будет равна переменной <em>limit </em>.</p>
<p>Продолжение следует&#8230;</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=427&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/427/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ExtJS теперь Sencha</title>
		<link>http://xo66ut.ru/archives/432</link>
		<comments>http://xo66ut.ru/archives/432#comments</comments>
		<pubDate>Thu, 17 Jun 2010 10:35:46 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Sencha]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=432</guid>
		<description><![CDATA[Ext JS + jQTouch + Raphaël = Sencha

&#8220;Интересные вещи происходят! сегодня мы объединяем силы с проектами jQTouch и Raphaël, а также меняем имя домена проекта с extjs.com на sencha.com. Эти проекты лидируют в своих областях и мы рады видеть в своих рядах их создателей Девида Канеду и Дмитрия Барановского. Мы считаем, что это сотрудничество приведет [...]]]></description>
			<content:encoded><![CDATA[<h2>Ext JS + jQTouch + Raphaël = Sencha</h2>
<p style="text-align:center;"><img class="aligncenter size-full wp-image-433" title="ext_js-sencha" src="http://xo66ut.ru/wp-content/uploads/2010/06/ext_js-sencha.jpg" style="border: 0" alt="" width="383" height="265" /></p>
<p>&#8220;<em>Интересные вещи происходят! сегодня мы объединяем силы с проектами jQTouch и Raphaël, а также меняем имя домена проекта с extjs.com на sencha.com. Эти проекты лидируют в своих областях и мы рады видеть в своих рядах их создателей Девида Канеду и Дмитрия Барановского. Мы считаем, что это сотрудничество приведет к впечатляющим результатам. &#8230; Sencha эт0 новое название нашей компании, а также разновидность япоского зеленого чая (</em>Так вот он какой стратегический напиток ExtJS разработчика ?!<em>). </em></p>
<p><em>Развитие Ext JS, Ext GWT, Designer, Direct и остального будет продолжаться, думаем только над переименованием Ext JS Designer на Sencha Designer. Одним из преимуществ переименования для нас является то, что мы разделяем названия компании и продукта. </em></p>
<p><em>Проекты jQTouch и Raphaël так и останутся под лицензией MIT. Мы создаем Sencha Labs подразделение, которое будет заниматься торговыми марками и авторскими правами всех некоммерческих проектов связанных с Sencha. Мы также рады сообщить, что Джонатан Старк известный разработчик мобильных приложений и автор двух книг под редакцией O’Reilly станет руководителем jQTouch (Добро пожаловать на борт Джонатан)</em>&#8221; &#8211; вот такое сообщение получили зарегистрированные на форуме Ext JS, позже оно было опубликовано и на сайте.</p>
<p>Что можно ожидать от объединения ? Я думаю только хороших новых результатов. jQTouch это jQuery плагин для разработки под мобильные девайсы типа iPhone, iPad и прочие «forward-thinking» девайсы. Как поможет эта библиотека в развитии Ext JS пока соевершенно не ясно. А Raphaël это крутая штука для разработки векторной графики под веб. Подключение этого проекта позволит модифицировать компоненты для построение графиков и диаграмм Ext JS, которые сейчас работают с помощью Flash.</p>
<p>Есть также мнение, что переименование связано с тем, что из компании ушел ее основатель Джек Слокум, или вся команда разработчиков ушла от него в новую компанию Sencha. Вот что пишут про это на сайте: &#8220;<em>После интенсивной работы над развитием ExtJS, за последние 18 месяцев  Джек стремительно прекратил свое участие. Хоть он и может вернуться на  некоторых условиях, мы желаем ему всего наилучшего.</em>&#8221;</p>
<p>В любом случае, что же действительно будет дальше покажет время.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=432&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/432/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Работаем с Font API от Google</title>
		<link>http://xo66ut.ru/archives/409</link>
		<comments>http://xo66ut.ru/archives/409#comments</comments>
		<pubDate>Fri, 28 May 2010 07:01:08 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Интересное в Сети]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[userfriendly]]></category>
		<category><![CDATA[WEB 3.0]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=409</guid>
		<description><![CDATA[
Предлагаю разобраться, что нового и революционного предложила компания Google касательно шрифтов и как этим воспользоваться прямо сейчас. Во первых, как и множество других проектов компании, Font API является бесплатным и нет никаких сложностей, почему бы не начать использовать этот инструмент прямо сейчас.
Введение.
В течение последних нескольких лет постоянно появлялись новые методы использования альтернативных шрифтов. Все чувствуют [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-418" title="google_font_api" src="http://xo66ut.ru/wp-content/uploads/2010/05/google_font_api.jpg" alt="" width="200" height="150" /></p>
<p>Предлагаю разобраться, что нового и революционного предложила компания Google касательно шрифтов и как этим воспользоваться прямо сейчас. Во первых, как и множество других проектов компании, Font API является бесплатным и нет никаких сложностей, почему бы не начать использовать этот инструмент прямо сейчас.<span id="more-409"></span></p>
<h2>Введение.</h2>
<p>В течение последних нескольких лет постоянно появлялись новые методы использования альтернативных шрифтов. Все чувствуют подъем дизайна и юзабилити в веб, развитие сервисов и облачных приложений, все это ведет за собой и увеличение требований к типографике. Ограничение стандартным набором шрифтов, мешает развитию веб-дизайна в расширяющемся в геометрической прогрессии вебе. Поэтому стали появляться такие платные сервисы как <strong>TypeKit </strong>и <strong>FontDeck</strong>. В будущем, наверное, будут пояляется и другие.</p>
<p>Однако если вы посмотрите на основные технологии веб HTML, CSS, Javascript, PHP, все они являются бесплатными. Исходя из этого можно предположить, что вебу нужен эффективный, а главное бесплатный инструмент. Поэтому, то что предлагает нам Google наиболее подходящее в настоящее время решение для развития типографики в веб.</p>
<h2>Меняет правило игры ?</h2>
<p>Очевидно, что когда Google берется за что-нибудь, он делает это хорошо и меняет представление об этой отрасли. Так и со шрифтам, компания незаметно для всех выпустила (совместно с <strong>Typekit</strong>) <strong>Font API</strong>, который в долгосрочной перспективе изменит веб. Пока другие компании придумывают бизнес модели для подобных  сервисов, Google просто выпустили качественный бесплатный продукт.</p>
<p>Давайте посмотрим как это все работает на небольшом примере<a href="http://designshack.co.uk/tutorialexamples/GoogleFonts/index.html" target="_blank"> live demo</a>:</p>
<h2>HTML</h2>
<h2>Добавляем шрифты в Google Fonts API.</h2>
<p>Теперь когда мы поняли, как же все это работает, давайте добавим своих шрифтов, для этого перейдем к <a href="http://code.google.com/apis/webfonts/" target="_blank">Font Api</a> и посмотрим на <a href="http://code.google.com/webfonts" target="_blank">Каталог Шрифтов</a>. Здесь вы увидите различных 18 шрифтов. Каждый шрифт имеет несколько вариантов. Когда вы выберите тот, который вам нравится, просто нажмите на него, чтобы увидеть дополнительные параметры. Допустим выберем<strong> IM Fell</strong>.</p>
<p style="text-align: center;"><img class="size-full wp-image-416 aligncenter" title="Google_Font_API-1" src="http://xo66ut.ru/wp-content/uploads/2010/05/Google_Font_API-1.jpg" alt="" width="510" height="408" /></p>
<p>Когда вы увидите картинку с описание шрифта, просто нажмите на кнопку Get Code и вы увидите html код который нужно вставить в head страницы, а также пример css, как использовать новый шрифт.</p>
<p><a href="http://xo66ut.ru/wp-content/uploads/2010/05/Google_Font_API-2.jpg"><img class="aligncenter size-full wp-image-417" title="Google_Font_API-2" src="http://xo66ut.ru/wp-content/uploads/2010/05/Google_Font_API-2.jpg" alt="" width="510" height="204" /></a></p>
<p>Есть два способа вставки шрифта на сайт. Через html и через css @import.</p>
<h2>Через HTML</h2>
<pre class="brush: xml;">
&lt;link href='http://fonts.googleapis.com/css?family=IM+Fell+DW+Pica' rel='stylesheet' type='text/css'&gt;
</pre>
<h2>Через @import.</h2>
<pre class="brush: css;">
@import url(http://fonts.googleapis.com/css?family=IM+Fell+DW+Pica);
</pre>
<p>Далее мы можем использовать на сайте подключенный шрифт:</p>
<pre class="brush: css;">
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;#headline h1 {
	text-align: center;
	font-size: 8em;
	color: #111;
	text-shadow: 0px 2px 3px #555;
	font-family: 'IM Fell DW Pica', arial, serif;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>Помимо этого, есть <strong>WebFont Loader</strong> инструмент, который представляет собой библиотеку <strong>Javascript</strong>, которая &#8220;дает вам больший контрль над шрифтом и позволяет использовать нескольких провайдеров для шрифтов&#8221; (в данном случае<strong> Font API</strong> &#8211; это провайдер шрифта, как и <strong>TypeKit</strong>) , это кстати их совместная разработка.</p>
<h2>Выводы.</h2>
<p>Наверное вы обратили внимание, насколько просто использование новых шрифтов с <strong>Google Font API</strong>. В отличие от существовавших до настоящего времени инструментов вам не нужно получать лицензию, которая прикрепляется к специально зарегистрированному доменному имени. Вы можете использовать шрифты даже в обычном примере, у вас на локальном компьютере.</p>
<p>Есть несколько преимуществ для выбора <strong>Google Font API</strong>, на которые стоит обратить внимание:</p>
<ul>
<li>Шрифт скачивается с сервера Google.</li>
<li>CDN Google быстрее чем ваш сайт.</li>
<li>От повсеместного использования шрифты будут кешироваться за счет того, что имеют одно расположение (сервер Google).</li>
</ul>
<p>Единственный видимый минус Font API, это небольшое количество шрифтов, но инструмент новый, и я думаю, количество доступных шрифтов будет со временем увеличиваться.</p>
<p>Источник: <a href="http://designshack.co.uk/articles/css/how-to-use-the-new-google-font-api" target="_blank">http://designshack.co.uk/</a></p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=409&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/409/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>5 Распространенных мифов о Javascript</title>
		<link>http://xo66ut.ru/archives/383</link>
		<comments>http://xo66ut.ru/archives/383#comments</comments>
		<pubDate>Wed, 05 May 2010 11:36:39 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Перевод]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=383</guid>
		<description><![CDATA[
Несмотря на то, что Javascript это один из самых популярных языков в мире, он до сих пор недооценивается и является непонятным для многих людей. Ситуация улучшилась в течении последних нескольких лет, но следующие мифы до сих пор блуждают по просторам web.
1. Javascript == Java
Разработчик из Соединенного Королевства (UK) Jeremy Keith, придумал такое определение этому мифу:
Java [...]]]></description>
			<content:encoded><![CDATA[<p><img style="padding: 10px; border: 0pt none;" title="javascript" src="http://xo66ut.ru/wp-content/uploads/2010/05/javascript.jpg" alt="Мифы о Javascript" width="320" height="194" /><br />
Несмотря на то, что Javascript это один из самых популярных языков в мире, он до сих пор недооценивается и является непонятным для многих людей. Ситуация улучшилась в течении последних нескольких лет, но следующие мифы до сих пор блуждают по просторам web.<span id="more-383"></span></p>
<h2>1. <strong>Javascript</strong> == Java</h2>
<p>Разработчик из Соединенного Королевства (UK) <em>Jeremy Keith</em>, придумал такое определение этому мифу:</p>
<blockquote><p><strong>Java </strong>это такой же <strong>Javascript</strong>, как <strong>ham</strong> (ветчина) и <strong>hamster </strong>(хомяк).</p></blockquote>
<p>Схожи только имена, но <strong>Java </strong>и <strong>JavaScript </strong>не связаны между собой.  Есть целый ряд поверхностных сходств, но такие же сходства можно найти и в других любых двух языках, имеющих C-подобный синтаксис.</p>
<p>Первоначально язык <strong>Javascript </strong>назывался <strong>Mocha</strong>, в какой-то момент стал <strong>LiveScript</strong>, и наконец стал называться <strong>Javascript </strong>в тот момент, когда язык <strong>Java </strong>был провозглашен спасителем жизни, вселенной и всего остального. Название всего лишь маркетинговых ход компании <strong>Netscape </strong>и ничего более.</p>
<h2>2. <strong>Javascript </strong>&#8220;игрушечный&#8221; язык.</h2>
<p>Часть &#8220;script&#8221; в названии языка, создаем обманчивое впечатление, что это урезанная, макро версия <strong>Java. </strong>Это не так. Во всяком случае, популярные &#8220;фичи&#8221; <strong>JavaScript,</strong> такие как <strong>замыкания </strong>и <strong>лямбда-функции </strong>в настоящее время оказали влияние на другие языки, такие как <strong>PHP</strong>, <strong>C#</strong> и наконец сам <strong>Java</strong>.</p>
<p><strong>Javascript </strong>наиболее часто встречается в виде встроенного в браузер интерпретатора, но это не означает, что он менее мощный в отличие от компилируемых языков программирования.</p>
<h2>3. <strong>Javascript </strong>есть только в браузерах.</h2>
<p>Большинство людей используют <strong>Javascript </strong>в качестве языка встроенного в браузер, но его (как и другие языки основанные на стандарте ECMAScript ) можно найти во многих других местах, таких например как:</p>
<ul>
<li>Браузер <strong>Mozilla Firefox</strong> и почтовый клиент <strong>Thunderbird </strong>используют <strong>Javascript </strong>для некоторых прикладных процессов.</li>
<li><strong>Flash ActionScript</strong> основан на<strong> Javascript.</strong></li>
<li><strong>PDF </strong>файлы могут содержать встроенный <strong>Javascript</strong>.</li>
<li>Множество десктоп виджетов от <strong>Microsoft </strong>и <strong>Apple </strong>используют <strong>Javascript</strong>.</li>
<li><strong>OpenOffice.org</strong> обеспечаивает поддержку <strong>Javascript</strong>.</li>
<li><strong>webOS</strong>, используемый в мобильных устройствах <strong>Palm</strong>, применяет <strong>Javascript</strong>, как язык для приложений.</li>
<li><strong>Javascript </strong>может быть использован для создания приложений в <strong>Gnome </strong>и в качестве скриптового языка в <strong>Windows</strong>.</li>
</ul>
<p><strong>Javascript </strong>пока не имеет полноценной серверной реализации, хотя несколько десятков хороших реализаций существует. День, когда мы сможем использовать <strong>Javascript </strong>и для серверной и для клиентской части когда-нибудь наступит, но непонятно, как скоро.</p>
<h2>4. <strong>Javascript</strong> до сих пор не отлажен и имеет множество багов.</h2>
<p>Эти дни давно уже стали преданием. Все производители браузеров соблюдают стандарт <strong>ECMAScript </strong>и очень редко можно встретить дополнительные фунции в <strong>Javascript</strong>.</p>
<p>Тем не менее реализация в браузерах не всегда одинакова: различные особенности манипуляции DOM объектами, особенности обработки событий, и причуды браузера могут доставить не мало головной боли при разработке. Это не вина самого языка, это проблема браузеров, через которые <strong>Javascript </strong> получает доступ к его, браузера, объектам.</p>
<h2>5. <strong>Javascript</strong> не Объектно-ориентированный язык.</h2>
<p>Путаница возникает оттого, что <strong>Javascript </strong>не<strong> </strong>использует привычные способы организации объектов. Отсутствие ключевого слово &#8220;<em>class</em>&#8221; заставляет разработчиков думать, что <strong>Javascript </strong>это функциональный язык программирования.</p>
<p><strong>Javascript </strong>предлагает модель прототипов. Это действительно потрясающе, вы можете писать, как функциональный код, так и организовывать код в классический объект с частными методами и свойствами.</p>
<p>Кроме того, все в <strong>Javascript </strong>является объектами, даже типы данных и функции. А как вам такое:</p>
<pre class="brush: jscript;">
var x = new Number(123);
var opp = &quot;oops&quot;.substr(0,3);
var f = function() { return function() { alert(&quot;hello!&quot;); }; };
</pre>
<p>Как насчет передачи функции в виде параметра:</p>
<pre class="brush: jscript;">
var Add = function(a, b) { return a + b; };
function Calculate(func, a, b) {
	return func(a, b);
}
var s = Calculate(Add, 1, 2); // s = 3
</pre>
<p>Или вы хотите расширить собственные типы ?</p>
<pre class="brush: jscript;">
// reverse any string
String.prototype.Reverse = function() {
	return this.split(&quot;&quot;).reverse().join(&quot;&quot;);
};
var h1 = &quot;Hello!&quot;;
var h2 = h1.Reverse(); // !olleH
</pre>
<p><strong>Javascript </strong>на первый взгляд может показаться непонятным, но вы поймете его элегантность и мощь, когда опять будете программировать на своем основном языке.</p>
<p>Вы все еще верите в эти мифы ?</p>
<p><em>Источник: <a href="http://www.sitepoint.com/blogs/2010/04/27/5-common-javascript-myths/" target="_blank">http://www.sitepoint.com/</a></em></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 349px; width: 1px; height: 1px; overflow: hidden;">JavaScript</div>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=383&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/383/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Динамическая загрузка файлов &#8211; AJAX Upload</title>
		<link>http://xo66ut.ru/archives/368</link>
		<comments>http://xo66ut.ru/archives/368#comments</comments>
		<pubDate>Fri, 30 Apr 2010 11:40:39 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[userfriendly]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=368</guid>
		<description><![CDATA[
В размышлениях об интерактивности задавался мыслью как сделать удобный с точки зрения usability загрузчик файлов.  Плюс подогревал интерес к механизму работы ajax загрузчика в ExtJS. Делая однажды чат и разобравшись в ограничениях браузеров, узнал, что нет возможности отправлять файл по средством объекта xmlhttprequest. Поэтому было непонятно, как ExtJS uploader отправляет файлы, как будто делает это [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xo66ut.ru/wp-content/uploads/2010/04/ajax_upload-e1272627550877.jpg"><img class="aligncenter size-full wp-image-376" title="ajax_upload" src="http://xo66ut.ru/wp-content/uploads/2010/04/ajax_upload-e1272627550877.jpg" alt="AJAX-Upload" width="543" height="282" /></a></p>
<p><a href="http://xo66ut.ru/wp-content/uploads/2010/04/ajax_upload-e1272627550877.jpg"></a>В размышлениях об интерактивности задавался мыслью как сделать удобный с точки зрения usability загрузчик файлов.  Плюс подогревал интерес к механизму работы <strong>ajax </strong>загрузчика в <strong>ExtJS</strong>. Делая однажды чат и разобравшись в ограничениях браузеров, узнал, что нет возможности отправлять файл по средством объекта <strong>xmlhttprequest</strong>. Поэтому было непонятно, как <strong>ExtJS </strong>uploader отправляет файлы, как будто делает это через <strong>ajax</strong>. Работая над созданием чата, я также ознакомиться с другими ограничениями браузеров, например на количество одновременных запросов к одному домену (ограничены двумя запросами), а также со всевозможными способами обхода этого ограничения. Там же для удобства применялся <strong>iframe </strong>транспорт, который позволяет отправлять обычные <strong>POST </strong>запросы через невидимый (0 px на 0 px) <strong>iframe</strong>. После этого мне сразу стал понятен механизм работы загрузчика файлов в <strong>ExtJS</strong>.<span id="more-368"></span></p>
<p>Решил добавить юзабильности в один из проектов и использовать этот способ для загрузки файлов, благо есть готовый плагин, называющийся <strong><a href="http://valums.com/ajax-upload/" target="_blank">AJAX Upload</a></strong>, хотя как я уже писал <strong>ajax </strong>тут не причем, все реализовано следующим образом:</p>
<ul>
<li> Плагин создает невидимый <strong>input </strong>над элементом, к которому вы привязываете нагрузку. То есть когда вы нажимаете на кнопку, появляется окно со стандартным выбором файла.</li>
<li>Затем когда вы выбираете файл плагин отправляет форму содержащую <strong>input </strong>с файлом через <strong>iframe</strong>.</li>
</ul>
<p><em>&#8220;Обычно для закачки файлов мы используем file input (&lt;input type=”file” /&gt;), его проблематично стилизовать. В современных веб приложениях этот input выглядит устаревшим. Можно конечно использовать для загрузки <strong>Flash</strong>, но <strong>Javascript </strong>прекрасно решает эту задачу. Плагин <strong>AJAX-Upload </strong>позволяет легко загружать несколько файлов без перезагрузки страницы. Он работает во всех браузерах и не требует никаких дополнительных библиотек для работы. К тому же он не затрагивает глобальных <strong>namespace</strong>&#8216;ов и прекрасно работает вместе с <strong>jQuery </strong>и <strong>Prototype</strong>.&#8221;</em></p>
<p>Работать с плагином довольно легко. Достаточно создать любой <strong>DOM </strong>элемент и привязать к нему плагин. Плагин отправляет файлы в виде обычного <strong>POST </strong>запроса. Поэтому можно обрабатывать их загрузку на любом серверном языке. На сайте плагина много работающий примеров. В плагине даже реализовано ограничение на расширения загружаемых файлов.</p>
<p>Распространяется плагин свободно под лицензией <strong>MIT</strong>.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=368&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/368/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Проблема с анимацией в JQuery</title>
		<link>http://xo66ut.ru/archives/358</link>
		<comments>http://xo66ut.ru/archives/358#comments</comments>
		<pubDate>Wed, 28 Apr 2010 12:21:35 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JQuery animate]]></category>
		<category><![CDATA[userfriendly]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=358</guid>
		<description><![CDATA[Одной из главных особенностей JQuery является то, что эта библиотека позволяется вам легко подчеркнуть ваш дизайн, анимировав некоторые элементы. Речь идет об отображении элементов, их движении и изменении цветов. Первое часто используется для скрытия информации, такой например, как заголовки картинок, то есть по умолчанию они скрыты, а при наведении курсора они проявляются. Часто также этот [...]]]></description>
			<content:encoded><![CDATA[<p>Одной из главных особенностей JQuery является то, что эта библиотека позволяется вам легко подчеркнуть ваш дизайн, анимировав некоторые элементы. Речь идет об отображении элементов, их движении и изменении цветов. Первое часто используется для скрытия информации, такой например, как заголовки картинок, то есть по умолчанию они скрыты, а при наведении курсора они проявляются. Часто также этот эффект применяются для того чтобы показать информацию и рейтинг скриншота при наведении на него.<span id="more-358"></span></p>
<p>Есть частая проблема, точнее особенность JQuery, о которой часто забывают дизайнеры и разработчики, она заключается в том, что вся анимация на странице при вызове попадает в &#8220;стек&#8221;. Если у вас на странице есть множество элементов с анимацией, например фотографии в фотогаллерее, то когда пользователь быстро проведет по нескольким фотографиям и перестанет двигать мышью, он будет наблюдать как анимация появляется постепенно на каждом элементе. Наглядно эту проблему можно посмотреть на сайте <a href="http://druckbar.info/" target="_blank">druckbar</a>, если вы быстро проведете мышкой по четырем панелькам, то будете долго ждать пока в шапке появится соответствующие картинки.</p>
<p><a href="http://xo66ut.ru/wp-content/uploads/2010/04/jq_animate_stop.jpg"><img class="aligncenter size-full wp-image-364" title="jq_animate_stop" src="http://xo66ut.ru/wp-content/uploads/2010/04/jq_animate_stop.jpg" alt="Using JQuery animate stop" width="419" height="542" /></a></p>
<p>Вы можете решить эту проблему одним из следующих способ:</p>
<p>Использовать метод <strong>.stop(). </strong>Когда этот метод используется на элементе, он немедленно прекращает его анимацию, если конечно она есть. <strong> </strong></p>
<pre class="brush: jscript;">
$(&quot;ol#gallery li&quot;).hover(function () {
  $(&quot;.thumb-meta&quot;, this).stop().animate({ bottom: '0px' }, 400);
},
function () {
  $(&quot;.thumb-meta&quot;, this).stop().animate({ bottom: '-22px' }, 400);
});
</pre>
<p>Другой способ решить проблему со &#8220;стеком&#8221; анимации, это использовать плагины, например <a href="http://plugins.jquery.com/project/hoverIntent" target="_blank">hoverIntent</a>. Этот плагин делает анимацию доступной только, если пользователь двигает мышью достаточно медленно.</p>
<h2>Старайтесь не злоупотреблять с анимацией контента.</h2>
<p>Поскольку Javascript функции очень легко реализовать с помощью JQuery, многие увлекаются анимацией  и доставляют этим пользователю немало неудобств. Допустим, удобно использовать JQuery для подгрузки изображений по мере прокрутки текста, это позволяет быстро прогрузить страницу с множество картинок. Но зачем показывать эти изображения при помощи анимации ?! В этом нет никакаго смысла.</p>
<p>Поэтому, прежде чем анимировать, подумайте, не помещает ли анимация концентрации  пользователя на основном контенте. Анимация должна помогать пользователю, делать сайт более интерактивным, а не мешать ему работать с сайтом.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=358&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/358/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Раширение классов в ExtJS</title>
		<link>http://xo66ut.ru/archives/275</link>
		<comments>http://xo66ut.ru/archives/275#comments</comments>
		<pubDate>Fri, 23 Apr 2010 07:12:51 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Перевод]]></category>
		<category><![CDATA[Ext.extend]]></category>
		<category><![CDATA[xtype]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=275</guid>
		<description><![CDATA[Цель.
Давайте добавим функциональности к Ext.form.Combobox, сделаем так, чтобы перед каждым элементом списка отображалась иконка.

Давайте назовем наш плагин Ext.ux.IconCombo, а также зарегистрируем для него xtype iconcombo.

Создаем файлы.
Наш первый шаг заключается в том, чтобы подготовить файлы для нашего плагина.

iconcombo.html: HTML код приложения, которое будет содержать наш плагин. Чтобы сделать этот пример более простым, этот файл также будет [...]]]></description>
			<content:encoded><![CDATA[<h2>Цель.</h2>
<p>Давайте добавим функциональности к Ext.form.Combobox, сделаем так, чтобы перед каждым элементом списка отображалась иконка.<br />
<a href="http://xo66ut.ru/wp-content/uploads/2010/04/IconComboExt2.png"><img class="aligncenter size-full wp-image-346" title="IconComboExt2" src="http://xo66ut.ru/wp-content/uploads/2010/04/IconComboExt2.png" alt="ExtJS Combobox" width="175" height="97" /></a></p>
<p>Давайте назовем наш плагин <strong>Ext.ux.IconCombo</strong>, а также зарегистрируем для него <strong>xtype</strong> <strong>iconcombo</strong>.</p>
<p><span id="more-275"></span></p>
<h2>Создаем файлы.</h2>
<p>Наш первый шаг заключается в том, чтобы подготовить файлы для нашего плагина.</p>
<ul>
<li><strong>iconcombo.html</strong>: HTML код приложения, которое будет содержать наш плагин. Чтобы сделать этот пример более простым, этот файл также будет содержать Javascript код и CSS. В реальном приложении нужно хранить отдельно код и стили.</li>
<li><strong>Ext.ux.IconCombo.js: </strong>Javascript код нашего плагина.</li>
</ul>
<h2>iconcombo.html</h2>
<pre class="brush: xml;">
&lt;html&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;../extjs-2.0/resources/css/ext-all.css&quot;&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../extjs-2.0/adapter/ext/ext-base.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;../extjs-2.0/ext-all-debug.js&quot;&gt;&lt;/script&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;Ext.ux.IconCombo.js&quot;&gt;&lt;/script&gt;

    &lt;style type=&quot;text/css&quot;&gt;
    .ux-flag-us {
        background-image:url(../img/flags/us.png) ! important;
    }
    .ux-flag-de {
        background-image:url(../img/flags/de.png) ! important;
    }
    .ux-flag-fr {
        background-image:url(../img/flags/fr.png) ! important;
    }
    .ux-icon-combo-icon {
        background-repeat: no-repeat;
        background-position: 0 50%;
        width: 18px;
        height: 14px;
    }

    /* X-BROWSER-WARNING: this is not being honored by Safari */
    .ux-icon-combo-input {
        padding-left: 25px;
    }

    .x-form-field-wrap .ux-icon-combo-icon {
        top: 3px;
        left: 5px;
    }
    .ux-icon-combo-item {
        background-repeat: no-repeat ! important;
        background-position: 3px 50% ! important;
        padding-left: 24px ! important;
    }
    &lt;/style&gt;

    &lt;script type=&quot;text/javascript&quot;&gt;
Ext.BLANK_IMAGE_URL = '../extjs-2.0/resources/images/default/s.gif';
Ext.onReady(function() {
    var win = new Ext.Window({
        title:'Icon Combo Ext 2.0 Extension Class Example',
        width:400,
        height:300,
        layout:'form',
        bodyStyle:'padding:10px',
        labelWidth:70,
        defaults:{anchor:'100%'},
        items:[{
            xtype:'iconcombo',
            fieldLabel:'IconCombo',
            store: new Ext.data.SimpleStore({
                    fields: ['countryCode', 'countryName', 'countryFlag'],
                    data: [
                        ['US', 'United States', 'ux-flag-us'],
                        ['DE', 'Germany', 'ux-flag-de'],
                        ['FR', 'France', 'ux-flag-fr']
                    ]
            }),
            valueField: 'countryCode',
            displayField: 'countryName',
            iconClsField: 'countryFlag',
            triggerAction: 'all',
            mode: 'local'
        }]
    });
    win.show();
});
    &lt;/script&gt;
    &lt;title&gt;Icon Combo Ext 2.0 Extension Class Example&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Этот файл помимо html разметки содержит функцию фасад &#8211; <strong>onReady</strong>, которая создает окно с формой, а на ней единственный элемент наш iconcombo. Будьте внимательны, в этом примере реальной формы не создается (тега &lt;form&gt; нет). Хранилище (<strong>store</strong>) iconcombo содержит уже заполненые данные для тестирования.</p>
<p>Вам необходимо изменить пути к файлам ExtJS, если он установлен в другом месте.</p>
<p>Вам, возможно, также понадобится поменять пути к изображениям флагов.</p>
<h2>Ext.ux.IconCombo.js</h2>
<pre class="brush: jscript;">
// vim: ts=4:sw=4:nu:fdc=2:nospell
/**
  * Ext.ux.IconCombo Extension Class for Ext 2.x Library
  *
  * @author  Ing. Jozef Sakalos
  * @version $Id: Ext.ux.IconCombo.js 617 2007-12-20 11:29:56Z jozo $
  *
  * @class Ext.ux.IconCombo
  * @extends Ext.form.ComboBox
  */
Ext.ux.IconCombo = Ext.extend(Ext.form.ComboBox, {
    initComponent:function() {

        // call parent initComponent
        Ext.ux.IconCombo.superclass.initComponent.call(this);

    } // end of function initComponent
});

// register xtype
Ext.reg('iconcombo', Ext.ux.IconCombo);

// end of file
</pre>
<p>Первый шаг в расширении класса, это создание дополнения, которое не изменяет функциональности родительского класса. Таким образом мы можем быть уверены, что родительский класс отлично работает, и добавленный нами функционал не затронет его работу.</p>
<p>Javascript файл выше делает именно это.</p>
<h2>Теория.</h2>
<p>Чтобы расширить класс в ExtJS мы не должны создавать функцию-конструктор. Нам просто нужно присвоить значение возвращаемое функцией <strong>Ext.extend</strong> при ее вызове в нашем пространстве имен. <strong>Ext.extend</strong> получает в качестве аргументов родительский класс и конфиг (функционал расширения) в качестве второго аргумента, и возвращает наш класс-раширение.</p>
<p>Все что мы раньше делали в конструкторе в старых версиях Ext 1.x, теперь делается в методе <strong>initComponent</strong>, который мы перезаписываем в родительском классе. <strong>initComponent </strong>это метод-конструктор родительского класса.</p>
<p>Тем не менее метод <strong>initComponent </strong>родительского класса содержит полезный код, который должен быть выполнен. Вы можете посмотреть как мы вызываем метод <strong>initComponent </strong>родительского класса в приведенном выше коде. Модель вызова метода родителя, одинакова для все функции, которые мы переопределяем в классе.</p>
<p>Регистрации <strong>xtype </strong>для нашего расширения не является обязательной, но это очень удобно, вы можете вызывать расширение просто набрав несколько символов имени его <strong>xtype</strong>. То есть точно также, как показано в этом примере.</p>
<h2>Приступим.</h2>
<p>Пока все хорошо. Теперь если открыть <strong>iconcombo.html</strong>, вы должны увидеть стандартный <strong>combobox</strong> с тремя значениями и выбранной Германией. Пока конечно же никаких иконок.</p>
<p>Теперь пришло время поработать. Добавьте следующие строки в <strong>Ext.ux.IconCombo.js </strong>перед вызовом родительского метода <strong>initComponent</strong>:</p>
<pre class="brush: jscript;">
Ext.apply(this, {
            tpl:  '&lt;tpl for=&quot;.&quot;&gt;'
                + '&lt;divst0&quot;&gt;'{' + this.iconClsField + '}&quot;&gt;'
                + '{' + this.displayField + '}'
                + '&lt;/div&gt;&lt;/tpl&gt;'
        });
</pre>
<p>В этом коде мы переопределяем стандартные элементы <strong>combobox </strong>нашими, которые будут использовать css класс <strong>iconClsField.</strong></p>
<p>Отлично, готовы протестировать ? Обновите страницу, круто да ?</p>
<p>Замечательно у нас красивые значки при открытии списка, но мы также хотим видеть флаг, когда <strong>combobox </strong>закрыт, не так ли ?</p>
<p>Добавьте следующий код после окончания кода метода <strong>initComponent</strong>:</p>
<pre class="brush: jscript;">
onRender:function(ct, position) {
        // call parent onRender
        Ext.ux.IconCombo.superclass.onRender.call(this, ct, position);

        // adjust styles
        this.wrap.applyStyles({position:'relative'});
        this.el.addClass('ux-icon-combo-input');

        // add div for icon
        this.icon = Ext.DomHelper.append(this.el.up('div.x-form-field-wrap'), {
            tag: 'div', style:'position:absolute'
        });
    }, // end of function onRender

    setIconCls:function() {
        var rec = this.store.query(this.valueField, this.getValue()).itemAt(0);
        if(rec) {
            this.icon.className = 'ux-icon-combo-icon ' + rec.get(this.iconClsField);
        }
    }, // end of function setIconCls

    setValue: function(value) {
        Ext.ux.IconCombo.superclass.setValue.call(this, value);
        this.setIconCls();
    } // end of function setValue
</pre>
<p>Вызов события <strong>onRender </strong>сначала вызывает родительский метод <strong>onRender</strong>, а потом добавляет стили и div&#8217;ы с иконками.</p>
<p>Мы также добавляем метод <strong>setIconCls </strong>и перезаписываем родительский метод <strong>setValue. </strong>Конечно мы хотим, чтобы родительский метод <strong>setValue </strong>тоже выполнился, поэтому мы сначала вызываем его, а потом выполняем наш метод <strong>setIconCls.</strong></p>
<h2>Окончание.</h2>
<p>Теперь последние испытание: перезагрузите страницы. Если вы при копировании примера не сделали ошибок вы получили новое расширение <strong>Ext.ux.IconCombo</strong>. Конечно<strong> </strong>можно еще усовершенствовать наше расширение, но это только лишь пример, как раcширять классы в ExtJS.</p>
<h2>Окончательный код.</h2>
<p>Вот полный код того, что у нас получилось:</p>
<pre class="brush: jscript;">
// vim: ts=4:sw=4:nu:fdc=2:nospell
/**
  * Ext.ux.IconCombo Extension Class for Ext 2.x Library
  *
  * @author  Ing. Jozef Sakalos
  * @version $Id: Ext.ux.IconCombo.js 617 2007-12-20 11:29:56Z jozo $
  *
  * @class Ext.ux.IconCombo
  * @extends Ext.form.ComboBox
  */
Ext.ux.IconCombo = Ext.extend(Ext.form.ComboBox, {
    initComponent:function() {

        Ext.apply(this, {
            tpl:  '&lt;tpl for=&quot;.&quot;&gt;'
                + '&lt;divst0&quot;&gt;'{' + this.iconClsField + '}&quot;&gt;'
                + '{' + this.displayField + '}'
                + '&lt;/div&gt;&lt;/tpl&gt;'
        });

        // call parent initComponent
        Ext.ux.IconCombo.superclass.initComponent.call(this);

    }, // end of function initComponent

    onRender:function(ct, position) {
        // call parent onRender
        Ext.ux.IconCombo.superclass.onRender.call(this, ct, position);

        // adjust styles
        this.wrap.applyStyles({position:'relative'});
        this.el.addClass('ux-icon-combo-input');

        // add div for icon
        this.icon = Ext.DomHelper.append(this.el.up('div.x-form-field-wrap'), {
            tag: 'div', style:'position:absolute'
        });
    }, // end of function onRender

    setIconCls:function() {
        var rec = this.store.query(this.valueField, this.getValue()).itemAt(0);
        if(rec) {
            this.icon.className = 'ux-icon-combo-icon ' + rec.get(this.iconClsField);
        }
    }, // end of function setIconCls

    setValue: function(value) {
        Ext.ux.IconCombo.superclass.setValue.call(this, value);
        this.setIconCls();
    } // end of function setValue
});

// register xtype
Ext.reg('iconcombo', Ext.ux.IconCombo);

// end of file
</pre>
<p><em>Источник: <a href="http://www.extjs.com/learn/Tutorial:Extending_Ext2_Class" target="_blank">http://www.extjs.com/learn/Tutorial:Extending_Ext2_Class.</a></em></p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=275&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/275/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Что такое scope и createDelegate() в ExtJS</title>
		<link>http://xo66ut.ru/archives/299</link>
		<comments>http://xo66ut.ru/archives/299#comments</comments>
		<pubDate>Tue, 20 Apr 2010 15:51:39 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Application]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=299</guid>
		<description><![CDATA[Часто возникает ситуация при создании монолитного класса, когда необходимо внутри функции вызвать методы или свойства, главного класса.  При этом область видимости удобного для этих целей this весьма ограничена. В ExtJS для такой задачи имеется очень удобное решение.
Предположим у нас есть класс object1:

var object1 = {
    property1 : 'Свойство 1',
    [...]]]></description>
			<content:encoded><![CDATA[<p>Часто возникает ситуация при создании монолитного класса, когда необходимо внутри функции вызвать методы или свойства, главного класса.  При этом область видимости удобного для этих целей <em>this </em>весьма ограничена. В ExtJS для такой задачи имеется очень удобное решение.<span id="more-299"></span></p>
<p>Предположим у нас есть класс <em>object1</em>:</p>
<pre class="brush: jscript;">
var object1 = {
    property1 : 'Свойство 1',
    method1 : function() {
        alert(this.property1);
    }
}
</pre>
<p>При вызове <strong>object1.method1(); </strong>У нас выпадет alert с текстом: &#8220;Свойство 1&#8243;.</p>
<p>Создадим другой класс, назовем его <em>object2</em></p>
<pre class="brush: jscript;">
var object2 = {
    property1 : 'Свойство object2',
}
</pre>
<p>Теперь попробуем выполнить следующий код: <strong>object1.method1.call(</strong>object2<strong>); </strong>У нас выпадет <em>alert </em>с текстом: &#8220;Свойство object2&#8243;. Почему так получилось ? Мы указали функции при вызове &#8220;<em>scope</em>&#8221; объект, то есть объект, который функция присвоила <em>this</em>, как будто бы мы написали в теле функции <em>this </em>= <em>object2</em>; поэтому текущим у нас оказался объект <em>object2</em>, а не <em>object1.</em></p>
<p>Когда у нас нет возможности вызывать метод call, это например, происходит при создании новой функции, в ExtJS есть специальный метод <em>createDelegate, </em>который так же принимает в качестве аргумента &#8220;scope&#8221; объект, в данном случае <em>object2</em>:</p>
<pre class="brush: jscript;">
var newFunction = object1.method1.createDelegate(object2);
</pre>
<p>Теперь если мы вызовем нашу созданную функцию<strong> newFunction();</strong> то мы также получим <em>alert c </em>текстом: &#8220;Свойство object2&#8243;.</p>
<p>Иногда &#8220;<em>scope</em>&#8221; объект удобно указывать через свойство объекта. Допустим у нас есть метод в классе <em>AjaxObject</em>, представляющий из себя ajax запрос, и есть свойство класса <em>property1</em>:</p>
<pre class="brush: jscript;">
var AjaxObject = {
    property1: 'Свойство 1',
    scope: this,
    sendAxaj: function() {
        Ext.Ajax.request({
            url: '/api.php/' ,
            method: 'GET',
            success: this.ajaxSuccess,
            params: post,
            scope: this
        });
    },
    ajaxSuccess: function(response) {
        alert(this.property1);
    }
}
</pre>
<p>Для того, чтобы мы могли каждый раз использовать методы и свойства главного класса <em>AjaxObject</em>, мы прописываем объектам свойство <em>scope: this. </em>Это в первом случае позволяет нам легко использовать метод обратившись через <em>this.ajaxSuccess</em>. А во втором случае, в <em>callback </em>функции использовать свойство главного класса <em>AjaxObject this.property1</em>.</p>
<p><em>Scope </em>и <em>createDelegate()</em> является незаменимой вещью при построении больших приложений методом <a href="http://xo66ut.ru/archives/253" target="_self">пред настроенных классов</a>.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=299&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/299/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Переход от Dreamweaver к Expression Web 3</title>
		<link>http://xo66ut.ru/archives/301</link>
		<comments>http://xo66ut.ru/archives/301#comments</comments>
		<pubDate>Fri, 16 Apr 2010 09:34:43 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование на PHP]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[userfriendly]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=301</guid>
		<description><![CDATA[Вспомнив что у меня имеется подписка на Microsoft продукты через dreamspark, решил посмотреть, что предлагает софтверный гигант для прототипирования интерфейсов. А наткнулся в итоге на интересную альтернативу Dreamweaver - Expression Web 3. Ее функционал  практически ничем не отличается от Dreamweaver CS3, но есть одно ключевое отличие. При первом открытии Expression Web 3 все основные возможности [...]]]></description>
			<content:encoded><![CDATA[<p>Вспомнив что у меня имеется подписка на Microsoft продукты через dreamspark, решил посмотреть, что предлагает софтверный гигант для прототипирования интерфейсов. А наткнулся в итоге на интересную альтернативу <strong>Dreamweaver </strong>- <strong>Expression Web 3</strong>. Ее функционал  практически ничем не отличается от <strong>Dreamweaver CS3</strong>, но есть одно ключевое отличие. При первом открытии <strong>Expression Web 3</strong> все основные возможности грамотно и аккуратно сосредоточены вокруг рабочей области, пользователь видит большинство функций, которые предоставляет IDE. В <strong>Dreamweaver </strong>же, я смог узнать, что у него есть аналогичные функции, только сравнивая их с <strong>Expression</strong>. Может конечно мне стоило сразу после установки сконфигурировать  <strong>Dreamweaver</strong>, чтобы удобно расположить в панелях необходимый мне функционал, но почему Adobe было не побеспокоится об этом ?  В целом же программы действительно идентичны. Единственное у меня всегда были проблемы в <strong>Dreamweaver </strong>со стандартными Javascript функциями, у <strong>Expression Web</strong> их нет.<span id="more-301"></span></p>
<p>Функции которыми я сразу начал пользоваться, хотя до этого не догадывался о существовании некоторых из них в <strong>Dreamweaver</strong>:</p>
<ul>
<li>Проверка CSS и HTML валидности на лету (В <strong>Dreamweaver </strong>по умолчанию отключена)</li>
<li>Удобное использование code snippets (В <strong>Dreamweaver </strong>по умолчанию отключена)</li>
<li>Тестирование во всех браузерах установленных в системе в одном окне, удобно сравнивать как выглядит сайт в различных браузерах (В <strong>Dreamweaver </strong>такой фукции я не видел, поправьте меня)</li>
<li>Code Hyperlink удобный переход к объявлению функции из ее вызова.</li>
<li>Панелька DOM структуры
<div class="wp-caption aligncenter" style="width: 308px"><img src="http://xo66ut.files.wordpress.com/2010/04/dom_panel.jpg" alt="Dom Panel" width="298" height="56" /><p class="wp-caption-text">Dom Panel</p></div></li>
</ul>
<p>Хотя я думаю, что я нашел еще не все функции этой IDE, уже сейчас я решил отказаться в ее пользу от <strong>Dreamweaver</strong>.<br />
Ну и напоследок скриншот самой программы</p>
<p><div class="wp-caption alignnone" style="width: 610px"><a href="http://xo66ut.files.wordpress.com/2010/04/ex_web_3.jpg"><img class=" " title="Expression Web 3" src="http://xo66ut.files.wordpress.com/2010/04/ex_web_3.jpg" alt="Expression Web 3" width="600" height="467" /></a><p class="wp-caption-text">Expression Web 3</p></div>
<p><strong>Вывод</strong>: благодаря грамотному userfriendly интерфейсу я перешел в <strong>Dreamweaver </strong>на <strong>Expression Web</strong>. Плюс MS за подачу аналогичного функционала в новом свете.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=301&type=feed" alt="" />]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/301/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

