<?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>web-dev.info &#187; JavaScript</title>
	<atom:link href="http://web-dev.info/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://web-dev.info</link>
	<description>Информация о web-разработке для web-разработчиков.</description>
	<lastBuildDate>Tue, 02 Sep 2008 19:55:08 +0000</lastBuildDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Использование пространств имен для организации JavaScript-кода</title>
		<link>http://web-dev.info/2008/06/javascript-namespaces/</link>
		<comments>http://web-dev.info/2008/06/javascript-namespaces/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 14:59:37 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Перевод]]></category>
		<category><![CDATA[namespace]]></category>

		<guid isPermaLink="false">http://web-dev.info/2008/06/javascript-namespaces/</guid>
		<description><![CDATA[На текущий момент большинство web-приложений состоят из большого числа библиотек, виджетов и сниппетов из многих и многих источников. Следует помнить, что код других разработчиков может взаимодействовать с вашим кодом в случае, если происходит подключение обоих их на одной странице. А если вы оперируете глобальными переменными, то это и вовсе небезопасно.
Почему необходимо использовать пространства имен?
Возьмем, в [...]]]></description>
			<content:encoded><![CDATA[<p>На текущий момент большинство web-приложений состоят из большого числа библиотек, виджетов и сниппетов из многих и многих источников. Следует помнить, что код других разработчиков может взаимодействовать с вашим кодом в случае, если происходит подключение обоих их на одной странице. А если вы оперируете глобальными переменными, то это и вовсе небезопасно.</p>
<h3 class="floatBar">Почему необходимо использовать пространства имен?</h3>
<p>Возьмем, в качестве примера, форум Ext JS, который использует три совершенно различных набора скриптов, созданных разными производителями: Ext JS используется нами для расширения функционала, Google Analytics для отслеживания использования сайта плюс обычные скрипты форума vBulletin. На рисунке представлено каким образом весь этот код из различных источников включается в тело страницы. Вообразите себе количество возможных противоречий с еще большим ростом подключаемых файлов.</p>
<p class="image"><img src="http://web-dev.info/wp-content/uploads/2008/06/diffsources.png" alt="Включаемые файлы" /></p>
<p>Если взглянуть на закладку DOM отладчика Firebug, можно увидеть сотни переменных контекста window, созданных подключенными скриптами. В тоже самое время Ext JS объединяет все свои классы в едином пространстве имен Ext и далее организует их в виде отдельных пакетов.</p>
<p class="image"><img src="http://web-dev.info/wp-content/uploads/2008/06/domwindow.png" alt="Обзор DOM" /></p>
<p>Когда вы пишете собственный срипт, вам следует помещать все свои классы и синглтоны (singletone) в некие пространства имен чтобы предотвратить противоречия с кодом других разработчиков. Термин «пространство имен» определяется в Википедии (<a href="http://en.wikipedia.org/wiki/Namespace">EN</a>, <a href="http://ru.wikipedia.org/wiki/Namespace">RU</a>) следующим образом: «… абстрактный контейнер предоставляющий контекст для содержащихся в нем элементов (имена, термины или слова) и позволяющий предотвратить возникновение неоднозначностей в случае существования элементов с одинаковыми именами…».</p>
<p>Пространства имен это важный инструмент разработчика, гарантирующий невозможность перезаписи одного кода другим. Ведь если иной разработчик определит переменную с таким же, как у вас именем, то существовавшее до этого определение будет перезаписано. Последний подключенный, в таком случае, фрагмент кода будет всегда одерживать верх.</p>
<p>Так как JavaScript является языком с функциональными областями видимости<sup>*</sup>, то создание функции или/и переменной не «обернутых» в функцию приводит к появлению их в глобальной области видимости (в контексте window). Чтобы предотвратить это разработчики помещают свои классы в объекты.</p>
<h6><sup>*</sup> примечание переводчика:</h6>
<p class="notice">вероятно, автор имеет ввиду создание различных областей видимости, что достижимо в этом языке лишь с помощью функций (прим. пер.)</p>
<h3 class="floatBar">Пространства имен без Ext JS</h3>
<p>Без Ext JS вы можете создать пространство имен следующим образом:</p>
<pre name="code" class="js">
if (!App) App = {};
if (!App.form) App.form = {};
if (!App.data) App.data = {};</pre>
<h3 class="floatBar">Ext.namespace</h3>
<p>Объект Ext предоставляет метод <a href="http://extjs.com/deploy/dev/docs/?class=Ext&amp;member=namespace">Ext.namespace</a> (или его шоткат Ext.ns), который проверяет создаваемое пространство имен на существование и создает его, если такового еще нет. Сначала следует определить первоначальный уровень пространства, а затем можно создавать различные подуровни-пакеты. Например, создадим пространство имен <em>App</em> и входящие в него пакеты <em>form</em> и <em>data</em>:</p>
<pre name="code" class="js">
/* Ext.namespace создаст объекты с переданными именами, если они еще не существуют */
Ext.namespace('App', 'App.form', 'App.data');

/* Теперь можно определять новый класс, например SampleForm, внутри пакета App.form */
App.form.SampleForm = Ext.extend(Ext.form.FormPanel, {
    initComponent: function() {
        /* код настройки компонента */
       App.form.SampleForm.superclass.call(this);
   }
});
/* Определение MySingleton внутри пакета App.data */
App.data.MySingleton = function() {
    return {
        sampleStaticMethod: Ext.emptyFn
    };
}();</pre>
<h3 class="floatBar">В завершение</h3>
<p>Используемый в web-приложениях на стороне клиента код JavaScript становится все более сложным и сложным. Поэтому важность правильной организация совместной работы вашего кода и кода третьих сторон также вырастает. Использование пространств имен гарантирует защиту вашему коду от перезаписи другим, находящимся в глобальной области видимости, кодом.</p>
<h3>От переводчика</h3>
<p>Автор оригинала: Aaron Conran</p>
<p>Оригинал статьи: <a href="http://extjs.com/blog/2008/05/28/use-namespaces/">Use Namespaces to organize your JavaScript code</a></p>
]]></content:encoded>
			<wfw:commentRss>http://web-dev.info/2008/06/javascript-namespaces/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Эффект всплеска при клике</title>
		<link>http://web-dev.info/2008/02/pellet/</link>
		<comments>http://web-dev.info/2008/02/pellet/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 01:11:27 +0000</pubDate>
		<dc:creator>wd</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[effect]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[pellet]]></category>

		<guid isPermaLink="false">http://web-dev.info/2008/02/pellet/</guid>
		<description><![CDATA[Порочно угнездившееся во многих умах &#171;красота спасет мир&#187; заставляет вышеупомянутый мир биться в конвульсиях и постанывать от очередной попытки привести его к точке благоденствия.
Представим, что история предшественников ничему нас не научила и украсим document.body со всей жестокостью, на которую способен человеческий разум в погоне за прекрасным&#160;&#8212;&#160;заставим страничку откликаться всплеском как от хорошо булькнувшего в болоте [...]]]></description>
			<content:encoded><![CDATA[<p>П<del>о</del>рочно угнездившееся во многих умах &laquo;красота спасет мир&raquo; заставляет вышеупомянутый мир биться в конвульсиях и постанывать от очередной попытки привести его к точке благоденствия.</p>
<p>Представим, что история предшественников ничему нас не научила и украсим document.body со всей жестокостью, на которую способен человеческий разум в погоне за прекрасным&nbsp;&mdash;&nbsp;заставим страничку откликаться всплеском как от хорошо булькнувшего в болоте камешка.</p>
<p>Нам понадобится <a href="http://mootools.net">Mootools</a>, редактор Flash, чувство меры, руки и непредвзятое отношение ко всему, что будет дальше.</p>
<h3 class="floatBar">Что необходимо получить</h3>
<p>Нет нужды перебирать достоинства или недостатки flash. Как в случае со многими технологиями необходимо просто прийти к решению использовать его или отказаться. В этом примере мы решили закрыть глаза на все минусы и применить в качестве фундамента.</p>
<p>Озадачимся созданием анимационного эффекта всплеска от клика на канве страницы с поддержкой полупрозрачности.</p>
<h6>следует заметить</h6>
<p class="notice">Эффект надо бы назвать псевдовсплеском ввиду того, что он не деформирует поверхность как это есть при реальных кругах на воде.</p>
<p>Также необходим механизм выборочного отключения эффекта для различных элементов и их групп.</p>
<h3 class="floatBar">Эффект в действии</h3>
<p>Если вы хотите что-либо изучить, а не выучить, то лучший способ этого добиться&nbsp;&mdash;&nbsp;смотреть код самостоятельно. Документация это замечательно, код&nbsp;&mdash;&nbsp;лучше. Поэтому рекомендуется просто заглянуть в код этой страницы. Для нетерпеливых выборочные участки кода приведены ниже.</p>
<p>В самом простом случае включение эффекта осуществляется подключением <span class="filePath">pellet.js</span> и созданием объекта эффекта:</p>
<pre name="code" class="html">&lt;html&gt;
	&lt;head&gt;
	//…
	&lt;script type="text/javascript" src="/js/pellet.js"&gt;&lt;/script&gt;
	//…
	&lt;/head&gt;
	&lt;body&gt;
		&lt;script type="text/javascript"&gt;
			var myPellet;
			window.addEvent('domready', function(){
				myPellet = new pellet();
			});
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Смысл заключается в создании объекта после загрузки всего дерева элементов страницы. Реализуется это силами Mootools в теле обработчика нестандартного события onDomReady. Это все.</p>
<h3 class="floatBar">Подгонка эффекта</h3>
<p>Как изменить цвет всплеска, его размеры, фактуру? Просто откройте <span class="filePath">pellet.fla</span> и рисуйте. Стоит, однако, помнить, что если вы изменили габариты flash-ролика, то об этом надо сообщить и js-части.</p>
<p>Для того чтобы задать элементы при клике на которых эффект воспроизводиться не будет, используется один из параметров конструктора exclude. Параметр представляет собой строку, где через запятую в синтаксисе CSS перечислены правила для исключаемых элементов.</p>
<h6>на заметку</h6>
<p class="notice">Mootools&nbsp;&mdash;&nbsp;правильный &laquo;браузер&raquo; и поддерживает большинство из всех мыслимых комбинаций селекторов. Обратитесь к шпаргалке по CSS, если хотите узнать о них больше. Это автоматически расширит ваши возможности в исключении элементов из &laquo;поля видимости&raquo; эффекта.</p>
<p>Немного примеров:</p>
<pre name="code" class="js">var myPellet = new pellet();
/*
все параметры по умолчанию:
	ролик находится по /flash/pellet.swf
	ширина: 50px
	высота: 50px
	исключаемые элементы: *[disabled], input[type=text], input[type=checkbox], input[type=radiobutton], textarea, select
*/</pre>
<pre name="code" class="js">myBluePellet = new pellet({flash: '/flash/bluePellet.swf'});
/*
ролик находится по /flash/bluePellet.swf
все остальные параметры по умолчанию:
	ширина: 50px
	высота: 50px
	исключаемые элементы: *[disabled], input[type=text], input[type=checkbox], input[type=radiobutton], textarea, select
*/</pre>
<pre name="code" class="js">myCustomPellet = new pellet({flash: '/flash/customPellet.swf', width: 40, height: 40, exclude: '#header, div.blackHole, input[type~=submit]'});
/*
все параметры переопределены:
	ролик находится по /flash/customPellet.swf
	ширина: 40px
	высота: 40px
	исключаемые элементы: #header, div.blackHole, input[type~=submit]
*/</pre>
<h3 class="floatBar">Подводные камни и нюансы</h3>
<ol>
<li><span class="captionLi">Когда начинать</span>? Создание объекта должно произойти только после полной загрузки объектной модели документа. IE, например, имеет дурную привычку выводить сообщение о невозможности загрузить страницу при попытке писать в еще не загрузившийся <span class="filePath">document.body</span>.</li>
<li><span class="captionLi">IE и фоновое изображение</span>. IE иногда глючит, забывая обновить фоновую картинку после того как всплеск исчез. В этом можно убедиться, кликнув на грани градиентного фона внизу страницы.</li>
<li><span class="captionLi">Linux</span>. В большинстве дистрибутивов Linux и Unix наблюдается отвратительная поддержка прозрачного фона flash-ролика&nbsp;&mdash;&nbsp;ее попросту нет. Ужасное зрелище, особенно на темных страницах. Рекомендуется определять тип платформы чтобы не использовать эффект который плохо поддерживается.<br />
<h6>примечание</h6>
<p class="notice">В Mootools 1.2dev имеется набор свойств <span class="filePath">Client.Platform</span> который поможет в детектировании платформы. К сожалению, это полезное семейство отсутствует в версии 1.11 которая является стабильной веткой фреймворка.</p>
</li>
<li><span class="captionLi">Когда лучше</span>? В случае светлой странички&nbsp;&mdash;&nbsp;мелкие цветовые артефакты эффекта заметны менее, да и оттенки видны лучше.</li>
<li><span class="captionLi">Минус</span>. Заключается он в перекрытии собой на время проигрывания всего, что находится под ним. Например, в случае сгруппированных рядом чекбоксов не всегда получится с должной скоростью прощелкать по всем ним&nbsp;&mdash;&nbsp;клик будет попадать по &laquo;всплеску&raquo;.</li>
</ol>
<h3 class="floatBar">Заключение</h3>
<p>В качестве вкусного напоследок будет <a href="/wp-content/uploads/2008/02/pelletexamples.rar">архив</a> с примерами, исходниками двух &laquo;плюх&raquo;, их swf версиями и самим js-классом. Приятного <del>аппетита</del> <ins>чтения</ins>.</p>
]]></content:encoded>
			<wfw:commentRss>http://web-dev.info/2008/02/pellet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
