<?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>jQuery и другое... &#187; javascript</title>
	<atom:link href="http://www.linkexchanger.su/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Tue, 25 May 2010 08:13:42 +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://www.linkexchanger.su/2010/117.html</link>
		<comments>http://www.linkexchanger.su/2010/117.html#comments</comments>
		<pubDate>Mon, 25 Jan 2010 06:34:55 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[comet]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2010/117.html</guid>
		<description><![CDATA[Недавно узнал, что 20-21 февраля в Москве и 27-28 февраля в Санкт-Петербурге пройдут мастер-классы по Javascript, которые будет вести Илья Кантор &#8211; создатель  сайтов algolist.manual.ru и javascript.ru.
Это  мой уважаемый коллега, человек с большим опытом разработки сложных  приложений, в прошлом один из разработчиков javascript-фреймворка Dojo Toolkit.
» Профессиональное javascript-программирование
»  Сложный AJAX и COMET: [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно узнал, что 20-21 февраля в Москве и 27-28 февраля в Санкт-Петербурге пройдут мастер-классы по Javascript, которые будет вести Илья Кантор &#8211; создатель  сайтов <a href="http://algolist.manual.ru">algolist.manual.ru</a> и <a href="http://javascript.ru">javascript.ru</a>.</p>
<p>Это  мой уважаемый коллега, человек с большим опытом разработки сложных  приложений, в прошлом один из разработчиков javascript-фреймворка <a href="http://dojotoolkit.org/">Dojo Toolkit</a>.</p>
<p>» Профессиональное javascript-программирование<br />
»  Сложный AJAX и COMET: тонкости Web 2.0<br />
» Мастер-класс по клиентской оптимизации<br />
» Секреты jQuery</p>
<p>Такие мастер-классы помогут узнать много нового, понять уровень своих знаний, получить новые идеи.</p>
<p>И еще, очень интересно! Принять участие в мастер-классе &laquo;<strong>Секреты jQuery</strong>&raquo; можно будет в режиме on-line.</p>
<p><strong><a href="http://javascript.ru/mk">Исходное объявление на javascript.ru »</a></strong><br />
<span id="more-117"></span></p>
<p>Для понимания материала необходимо знать javascript на минимальном уровне, писать простые скрипты. Содержание мастер-классов построено так, чтобы максимально глубоко раскрыть темы за короткий срок.</p>
<p>Теперь подробнее о содержании мастер-классов.</p>
<h3>&laquo;Профессиональное javascript-программирование&raquo;</h3>
<blockquote><p>- Javascript, browser tips &amp; tricks.<br />
- Фишки DOM, функции/замыкания, ООП &#8211; понятно и в деталях.<br />
- Малоизвестные возможности javascript и браузеров.<br />
- Javascript-фреймворки. Сравнение современных возможностей. jQuery в деталях.<br />
- Полезный инструментарий, который сделает вашу разработку быстрее и качественнее. Гораздо больше, чем Firebug.<br />
- Обмен информацией между окнами с разных доменов<br />
- HTML5: что уже есть, а что нас ждет уже скоро.</p></blockquote>
<p>Этот мастер класс &#8211; отнюдь не об основах javascript, здесь присутствует много информации для профессионалов.<br />
Москва: суббота, 20 февраля, 11.00<br />
Санкт-Петербург: суббота, 27 февраля, 11.00<br />
<em>Продолжительность &#8211; 4 часа.</em></p>
<h3>&laquo;Клиентская оптимизация&raquo;</h3>
<blockquote><p>- Способы и принципы сжатия javascript, что делать, чтобы код сжимался эффективнее.<br />
- Идеальное кеширование. Скрипты и серверная часть.<br />
- Эффективная оптимизация javascript. Подходы, цифры, рецепты.<br />
- Основные приемы оптимизации jQuery.<br />
- Ускорение загрузки страницы через HTTP pipelining.<br />
- Оптимизация с Google Gears и HTML5.<br />
- Google Closure Compiler в деталях<br />
- Удобные инструменты для оптимизации и профайлинга.</p></blockquote>
<p>Про то, как ускорить страницу, почти ничего не делая, и как серьезно ускорить страницу и сайт, если что-то сделать.<br />
Москва: воскресенье, 21 февраля, 11.00<br />
Санкт-Петербург: воскресенье, 28 февраля, 11.00<br />
<em>Продолжительность &#8211; 4 часа.</em></p>
<h3>&laquo;Сложный AJAX и COMET: тонкости Web 2.0&#8243;</h3>
<blockquote><p>- Асинхронная подгрузка событий с сервера (COMET) &#8211; различные варианты, сравнение и примеры реализации.<br />
- Кнопки back-forward, закладки и история с AJAX.<br />
- Cпособы написания чата/оповещающего демона, аспекты производительности и решения.<br />
- Кросс-доменные ограничения, способы их преодоления.<br />
- Асинхронный try..catch. Удобная работа с асинхронностью.<br />
- Инструменты для разработки и отладки сложных AJAX-приложений.<br />
- Специализированный COMET-сервер, установка, расширение, интеграция. Поднимем COMET прямо на мастер-классе.</p></blockquote>
<p>Мастер-класс сделает современные подходы простыми и понятными для вас, позволит улучшить те приложения, которые есть сейчас, и перейти к качественно новой разработке в будущем.<br />
Москва: суббота, 20 февраля, 16.00<br />
Санкт-Петербург: суббота, 27 февраля, 16.00<br />
<em>Продолжительность &#8211; 4 часа.</em></p>
<h3>&laquo;Секреты jQuery&raquo;</h3>
<blockquote><p>1. Как работает поисковой движок jQuery $(&#8216;&#8230;&#8217;).<br />
- Внутреннее устройство. Алгоритм поиска. No magic.<br />
- Почему некоторые очевидные запросы тормозят, и как их ускорять.<br />
- Расширение поискового движка, добавление своих фильтров.<br />
2. Система событий в jQuery.<br />
- Внутреннее устройство.<br />
- Слабо- и недокументированные фичи, отсутствующие в обычных javascript-событиях.<br />
- Влияние системы событий на быстродействие и DOM-манипуляции. Что тормозит и почему.<br />
- Обход утечек памяти.<br />
3. Фишки AJAX.<br />
- Особенные фичи AJAX в jQuery, которых нет в других библиотеках и полезные приемы работы с ними.<br />
4. $.изнутри.<br />
- Внутреннее устройство функции $. Что она делает быстро, а что &#8211; нет.<br />
- Создание плагинов. Внутренний механизм работы $.fn.plugin.<br />
5. jQuery UI.<br />
- Обзор и устройство jQuery UI.<br />
- Написание собственных виджетов. Объявление, вызов методов и т.п. Примеры.<br />
- Приемы для более удобной работы с виджетами.<br />
6. Профайлинг jQuery-приложения<br />
- Как из каши $(вызовов) получить читаемый профиль.<br />
7. Дополнительно.<br />
- Общий обзор библиотеки jQuery, ее сильных и слабых мест. Сравнение с другими фреймворками. Новое в jQuery 1.4.</p></blockquote>
<p>Мастер-класс посвящен слабо документированным особенностям и устройству фреймворка jQuery. Это не вводный курс. Знакомство и опыт работы с фреймворком jQuery &#8211; обязательны.<br />
Москва: воскресенье, 21 февраля, 16.00<br />
Санкт-Петербург: воскресенье, 28 февраля, 16.00<br />
<em>Продолжительность &#8211; 3 часа.</em><br />
<strong>On-line</strong>: суббота, 27 февраля, 20.00-21.50 и воскресенье, 28 февраля, 20.00-21.50</p>
<p><strong><a href="http://javascript.ru/mk">Дополнительная информация, запись на мастер-классы »</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2010/117.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Некоторые концепции JavaScript, необходимые для эффективного применения jQuery.</title>
		<link>http://www.linkexchanger.su/2009/90.html</link>
		<comments>http://www.linkexchanger.su/2009/90.html#comments</comments>
		<pubDate>Wed, 20 May 2009 12:08:27 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/90.html</guid>
		<description><![CDATA[Эта статья написана &#171;по мотивам&#187; одной из глав книги &#171;jQuery &#8211; подробное руководство по продвинутому JavaScript&#187;. Информация, содержащаяся в этой главе, показалась мне настолько полезной, что я не мог не поделиться ей. Здесь не освещаются все концепции языка &#8211; внимание уделено лишь тем, понимание которых поможет эффективнее овладеть библиотекой jQuery.
Итак, первое на чем мы остановим [...]]]></description>
			<content:encoded><![CDATA[<p>Эта статья написана &laquo;по мотивам&raquo; одной из глав книги &laquo;jQuery &#8211; подробное руководство по продвинутому JavaScript&raquo;. Информация, содержащаяся в этой главе, показалась мне настолько полезной, что я не мог не поделиться ей. Здесь не освещаются все концепции языка &#8211; внимание уделено лишь тем, понимание которых поможет эффективнее овладеть библиотекой jQuery.<span id="more-90"></span></p>
<p>Итак, первое на чем мы остановим свое внимание &#8211; это определение и работа с функциями, с использованием подхода при котором они являются обычными объектами JavaScript. Но для того, чтобы к этому подойти, давайте сначала посмотрим, как создаются</p>
<h2>Объекты в JavaScript</h2>
<pre class="brush: jscript;">var card = new Object();</pre>
<p>Весьма просто, но совсем неинтересно, поскольку наш объект не содержит никакой информации. Давайте исправим это:</p>
<pre class="brush: jscript;">var card = new Object();
card.firstname = 'Ivan';
card.lastname = 'Ivanov';
card.year = '1974';
card.employed = new Date(2004,1,12);</pre>
<p>Это уже что-то полезное &#8211; создав новый экземпляр объекта, мы присвоили его переменной <strong>card</strong> и наполнили свойствами различных типов: <em>строка</em>, <em>число</em>, и <em>дата</em>.</p>
<p>Что же получается? Получается, что объект JavaScript &#8211; это набор свойств, каждое из которых состоит из имени и значения. При этом в качестве имени может выступать только строка, а вот значением (и это важный момент!!!) может быть и строка, и число, и массив, и конечно функция&#8230;</p>
<p><strong>Вывод:</strong> <em>основная цель экземпляра объекта &#8211; служить контейнером для именованных наборов других объектов.</em></p>
<p>Давайте немного усложним наш код, который мы используем в качестве примера:</p>
<pre class="brush: jscript;">var card = new Object();
card.firstname = 'Ivan';
card.lastname = 'Ivanov';
card.year = '1974';
card.employed = new Date(2004,1,12);
var phone = new Object();
phone.home = '(495)353-5353';
phone.mobile = '(903)261-1777';
card.phone = phone;</pre>
<p>мы создали еще один объект, который содержит номера телефонов и сделали этот объект значением свойства нашего первого объекта.</p>
<p>А теперь попробуем записать все тоже самое в литеральной нотации, плавно двигаясь к тому синтаксису, который присутствует в jQuery-коде практически повсеместно.</p>
<pre class="brush: jscript;">var card = {
  firstname : 'Ivan',
  lastname  : 'Ivanov',
  year      : '1974',
  employed  : new Date(2004,1,12),
  phone     : {
    home   : '(495)353-5353',
    mobile : '(903)261-1777'
  }
};</pre>
<p>Вот собственно такая форма записи и называется <strong>JSON</strong> &#8211; посмотрите, насколько проста и понятна структура:</p>
<p>- объект &#8211; пара фигурных скобок<br />
- свойства перечислены внутри скобок, через запятую<br />
- каждое свойство &#8211; это пара состоящая из имени и значения, разделенных двоеточием.</p>
<p>Давайте теперь отметим для себя еще один очень важный момент, воспользовавшись следующим простым примером:</p>
<pre class="brush: jscript;">var someVar = 'В лесу родилась елочка!';</pre>
<p>Простейшая инструкция, в которой переменной присваивается экземпляр объекта String. Если мы попробуем выполнить:</p>
<pre class="brush: jscript;">alert(someVar);</pre>
<p>увидим то, что и ожидали &#8211; сенсационное сообщение о том, что в лесу родилась елочка. Как Вы думаете, что мы увидим после выполнения следующего кода?</p>
<pre class="brush: jscript;">alert(window.someVar);</pre>
<p>Можете попробовать, но сразу скажу, что в результате получится абсолютно тоже самое сообщение! Поскольку инструкции эквивалентны, то какой же вывод из этого можно сделать?</p>
<p>Правильно! Когда ключевое слово <em>var</em> используется за пределами какой-либо функции, на глобальном уровне, оно является всего лишь ссылкой на свойство объекта <em>window</em>.</p>
<p>Ну вот, с объектами мы более-менее разобрались. Но давайте кратко сформулируем то, о чем мы говорили. Итак:</p>
<p>- объект в JavaScript &#8211; это неупорядоченный набор свойств;<br />
- свойство состоит из имени и значения;<br />
- объекты можно объявлять с помощью литералов;<br />
- глобальные переменные &#8211; есть свойства объекта window;</p>
<h2>Функция как объект JavaScript</h2>
<p>Вот теперь мы готовы к тому, чтобы вернуться к тому утверждению, что функции в JavaScript можно рассматривать как обычные объекты. Почему же в JavaScript функцию можно считать обычным объектом? Давайте возьмем для сравнения объекты других типов, например <em>String</em> или <em>Number</em>.</p>
<p>Если объекты <em>String</em> или <em>Number</em> определяются соответствующими конструкторами, то функции также определяются конструктором, в данном случае конструктором <em>Function</em>. Точно также, как и другие объекты функции могут:</p>
<p>- присваиваться переменным и свойствам объектов<br />
- передаваться в виде параметров<br />
- возвращаться как результат других функций<br />
- создаваться с использованием литералов</p>
<p>Но есть на первый взгляд одно очень существенное отличие от тех же упомянутых объектов <em>String</em> или <em>Number</em> &#8211; у функции есть имя! Но это только на первый взгляд.</p>
<p>Посмотрим простенький пример:</p>
<pre class="brush: jscript;">function hello() {
  alert('Hello, world!');
}</pre>
<p>такая запись очень часто используется для создания глобальных функций, но это совершенно не означает, что мы только что создали функцию с именем <strong>hello</strong>. Вспомните наши примеры с ключевым словом <em>var</em>. Тут практически тоже самое, только в примере с функцией ключевое слово <em>function</em> автоматически создает экземпляр объекта и присваивает его свойству объекта <em>window</em>. А имя этого свойства совпадает с именем нашей функции. Т.е. мы могли бы написать так:</p>
<pre class="brush: jscript;">hello = function () {
  alert('Hello, world!');
}</pre>
<p>или даже так:</p>
<pre class="brush: jscript;">window.hello = function () {
  alert('Hello, world!');
}</pre>
<p>Это есть синтаксис <strong>литерала функции</strong> &#8211; привыкайте, в jQuery-коде Вы будете использовать такую форму записи очень часто. Но самый главный <strong>вывод, который мы должны сделать</strong> &#8211; <em>экземпляры Function являются значениями!!!, которые можно присвоить переменным, свойствам или параметрам, через которые на них можно ссылаться</em>.</p>
<h2>Функции обратного вызова</h2>
<p>Следующий шаг &#8211; попробуем передавать функцию в качестве параметра и тут же разберем одно из самых распространенных понятий &#8211; функция обратного вызова. Смотрим код:</p>
<pre class="brush: jscript;">function hello() {
  alert('Hello, word!');
}
setTimeout(hello,5000);</pre>
<p>Объявляем функцию с именем <strong>hello</strong> и устанавливаем таймер на 5 секунд. Смотрите, передача функции в качестве параметра ничем не отличается от передачи любого другого значения &#8211; в первом параметре мы передали функцию, а во втором &#8211; число. Когда время таймера истечет, будет вызвана функция <strong>hello</strong>. Поскольку метод <em>setTimeout()</em> делает вызов функции в нашем собственном программном коде &#8211; эту функцию называют <strong>функцией обратного вызова</strong>.</p>
<p>Однако есть более изящный способ записи этого кода:</p>
<pre class="brush: jscript;">setTimeout(function(){ alert('Hello, word!'); },5000);</pre>
<p>если функцию не требуется вызывать где-то в другом месте страницы, нет никакой необходимости создавать свойство <strong>hello</strong> в объекте <em>window</em>. Такой подход будет очень часто встречаться в программном коде jQuery.</p>
<h2>Реализация this в JavaScript</h2>
<p>В объектно-ориентированных языках основанных на классах, указатель <strong>this</strong>, как правило, ссылается на экземпляр класса, в пределах которого был объявлен метод. Реализация <strong>this</strong> в JavaScript отличается едва различимым, но очень существенным образом. В JavaScript, где функции являются обычными объектами (мы говорили об этом выше), они не объявляются как часть чего-либо. <em>Объект, на который ссылается this, называется контекстом функции и определяется не тем, как функция объявляется, а тем как она вызывается.</em> Это значит, что функция может иметь различный контекст в зависимости от того, как она была вызвана.</p>
<p>Давайте вернемся к примеру и немного дополним его:</p>
<pre class="brush: jscript;">var card = {
  firstname : 'Ivan',
  lastname  : 'Ivanov',
  year      : '1974',
  employed  : new Date(2004,1,12),
  phone     : {
    home    : '(495)353-5353',
    mobile  : '(903)261-1777'
  },
  showData   : function() {
    return this.lastname+'
            '+this.firstname+'
            '+this.phone.mobile;
  }
};</pre>
<p>К первоначальному коду мы добавили свойство с именем <strong>showData</strong>, которое ссылается на экземпляр <em>Function</em>. Если теперь вызвать функцию через свойство:</p>
<pre class="brush: jscript;">alert(card.showData());</pre>
<p>то в качестве контекста функции будет установлен экземпляр объекта на который указывает <strong>card</strong>. В результате мы увидим следующее:</p>
<blockquote><p><strong>Ivanov Ivan (903)261-1777</strong></p></blockquote>
<p>Ну это все вполне естественно, гораздо более интересен следующий пример. JavaScript позволяет четко установить, что будет использоваться в качестве контекста функции. Вызывая функцию с помощью методов <em>call()</em> или <em>apply()</em> экземпляра <em>Function</em>, мы можем передать в качестве контекста все, что угодно.</p>
<pre class="brush: jscript;">var obj1 = { myProperty: 'object 1' };
var obj2 = { myProperty: 'object 2' };
var obj3 = { myProperty: 'object 3' };
window.myProperty = 'object window';

function showProperty() {
  return this.myProperty;
}

obj1.identifyMe = showProperty;

alert(showProperty());
alert(obj1.identifyMe());
alert(showProperty.call(obj2));
alert(showProperty.apply(obj3));</pre>
<p>Определили три простых объекта, у каждого из которых есть свойство <strong>myProperty</strong>. Добавили свойство <strong>myProperty</strong> в экземпляр объекта <em>window</em>. Определили глобальную функцию, которая возвращает значение свойства <strong>myProperty</strong> для любого объекта, используемого в качестве контекста этой функции. И еще присвоили эту же самую функцию свойству с именем i<strong>dentifyMe</strong> объекта <strong>obj1</strong>.</p>
<p>Дальше самое интересное &#8211; четыре раза мы вызываем один и тот же экземпляр функции другим способом и посмотрите, что получается:<br />
- в первом случае вызываем функцию как глобальную и контекстом функции является экземпляр объекта <em>window</em> о чем свидетельствует текст в окне предупреждения &#8211; &laquo;<strong>object window</strong>&laquo;.<br />
- во втором случае вызываем функцию как свойство объекта <strong>obj1</strong> и контекстом функции становится этот объект. Текст в окне предупреждения &#8211; &laquo;<strong>object 1</strong>&laquo;.<br />
- в третьем случае используем метод <em>call()</em> объекта <em>Function</em> и контекстом функции становится объект, переданный методу <em>call()</em> в качестве первого параметра. Текст в окне предупреждения &#8211; &laquo;<strong>object 2</strong>&laquo;.<br />
- наконец в четвертом случае используем метод <em>apply()</em>, передавая ему в качестве первого аргумента <strong>obj3</strong>, и получаем текст в окне предупреждения &#8211; &laquo;<strong>object 3</strong>&laquo;.</p>
<blockquote><p><a href="http://www.linkexchanger.su/jquery_articles/someConcepts1.html" target="_blank">Пример</a> можно открыть в отдельном окне.</p></blockquote>
<p><strong>Вывод такой:</strong> <em>функция fn действует как метод объекта ob, когда объект ob выступает в качестве контекста при вызове функции fn.</em></p>
<h2>Что такое замыкание?</h2>
<p><strong>Замыкание (closure)</strong> &#8211; это экземпляр <em>Function</em> вместе с локальными переменными из его окружения, необходимыми для выполнения.</p>
<p>Функция при объявлении может ссылаться на любые переменные, находящиеся в области ее видимости на момент объявления. Эти переменные будут достижимы для функции даже после того, как текущее положение в объявлении выйдет из области видимости, замыкая объявление.</p>
<p>Лучше всего пояснить это на простом примере (здесь уже используем библиотеку jQuery):</p>
<pre class="brush: jscript;">$(function(){
  var local = 1;
  window.setInterval(function(){
    $('#result').append(new Date()+
                ' значение local = '+local+'   ');
    local++;
  },5000);
});</pre>
<p>После загрузки DOM объявляем переменную <strong>local</strong> и присваиваем ей числовое значение 1. С помощью метода <em>setInterval()</em> взводим таймер, который будет срабатывать каждые 5 секунд. В качестве функции обратного вызова для таймера, определяем функцию, которая каждые пять секунд будет добавлять текущее время и значение переменной <strong>local</strong>. Кроме того, при каждом срабатывании таймера значение переменной local должно увеличиваться на единицу.</p>
<blockquote><p><a href="http://www.linkexchanger.su/jquery_articles/someConcepts2.html" target="_blank">Пример</a> можно открыть в отдельном окне.</p></blockquote>
<p>Можно было подумать, что поскольку функция обратного вызова запустится только лишь спустя 5 секунд после готовности DOM, то во время выполнения функции переменная <strong>local</strong> окажется неопределенной, ведь код в котором определяется <strong>local</strong> выходит из области видимости, как только обработчик события готовности DOM заканчивает свою работу.</p>
<p>Тем не менее этот код прекрасно работает, благодаря замыканию, созданному при объявлении функции и включающему в себя переменную <strong>local</strong>. Замыкание остается в области видимости функции на протяжении всего жизненного цикла.</p>
<p>При работе с jQuery (особенно при использовании возможностей ajax) Вы будете довольно часто сталкиваться с замыканиями. Поэтому необходимо обратить внимание на еще одну <strong>важную особенность замыканий</strong> &#8211; <em>контекст функции никогда не является частью замыкания.</em> Опять же на примере будет гораздо понятнее.</p>
<p>Посмотрите такой код:</p>
<pre class="brush: jscript;">this.id = 'someID';
$('*').each(function(){
  alert(this.id);
});</pre>
<p>Мы могли бы ожидать, что в окне предупреждения для каждого элемента будет раз за разом отображаться значение <strong>someID</strong>, однако это совсем не так. Мы увидим окно предупреждений столько раз, сколько элементов будет отобрано в объект jQuery и каждый раз будет отображаться значение атрибута <strong>id</strong> следующего элемента (или пустое окно предупреждения, если такого атрибута нет). Это происходит потому, что у каждого вызова функции собственный контекст, и в данном случае контекстом является элемент из объекта jQuery.</p>
<p>Давайте немного исправим пример:</p>
<pre class="brush: jscript;">this.id = 'someID';
var someVar = this;
$('*').each(function(){
  alert(someVar.id);
});</pre>
<p>Переменная <strong>someVar</strong> становится частью замыкания и будет доступна внутри функции обратного вызова. Такой код будет раз за разом выдавать в окне предупреждения одно и тоже значение &#8211; <strong>someID</strong>.</p>
<p>Ну, вот вроде бы и все. Осталось сказать, что если твердо усвоить все эти понятия, то создавать эффектные и эффективные сценарии на JavaScript с использованием jQuery будет гораздо проще&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/90.html/feed</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>Что такое Canvas</title>
		<link>http://www.linkexchanger.su/2009/86.html</link>
		<comments>http://www.linkexchanger.su/2009/86.html#comments</comments>
		<pubDate>Tue, 14 Apr 2009 05:49:17 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[canvas]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2009/86.html</guid>
		<description><![CDATA[К будущему надо готовиться, потому что оно наступает быстрее, чем мы его ждем. Поэтому сегодня расскажу о canvas — элементе спецификации Web Applications 1.0, которая со временем вероятно воплотится в язык HTML5. Сама спецификация подготовлена рабочей группой WHAT-WG (Web Hypertext Application Technology Working Group) и добавляет ряд нововведений в HTML и DOM.
Однако начнем с примера [...]]]></description>
			<content:encoded><![CDATA[<p>К будущему надо готовиться, потому что оно наступает быстрее, чем мы его ждем. Поэтому сегодня расскажу о canvas — элементе спецификации Web Applications 1.0, которая со временем вероятно воплотится в язык HTML5. Сама спецификация подготовлена рабочей группой WHAT-WG (Web Hypertext Application Technology Working Group) и добавляет ряд нововведений в HTML и DOM.<br />
Однако начнем с примера использования <strong>canvas</strong>&#8230;<span id="more-86"></span><br />
<iframe src="http://www.linkexchanger.su/examples_2009/canvas/canvas.html" style="border: medium none " width="420" height="180"></iframe><br />
Не знаю как кого, а меня пример впечатлил&#8230;</p>
<p>Итак, элемент Canvas предназначен для создания bitmap изображения при помощи JavaScript, т.е. мы получаем возможность создавать графические формы, рисовать линии, вращать изображения.</p>
<p>Такие возможности подстегнули производителей браузеров к включению API canvas в последние версии своих продуктов &#8211; FireFox, Opera, Chrome, Safari поддерживают тэг canvas. Как всегда неприятным исключением оказался горячо нелюбимый всеми Internet Explorer &#8211; не то что в 6 и 7 версиях, даже в 8 версии поддержка тэга canvas не планируется.</p>
<p>Однако не все так безнадежно как могло бы показаться &#8211; на помощь пришла компания Google, реализовав для IE полноценный API Canvas. По сути это небольшой js-файл, подключая который для браузеров IE можно заставить их &laquo;понимать&raquo; тэг canvas. Найти этот файл можно тут:<br />
<a href="http://code.google.com/p/explorercanvas/" target="_blank">http://code.google.com/p/explorercanvas/</a></p>
<p>Но вернемся к нашему примеру. Для того, чтобы изобразить такие часики на своей страничке понадобится подключить в разделе HEAD файл excanvas.js &#8211; это для ого, чтобы заставить браузеры IE понимать canvas:</p>
<pre class="brush: jscript;">&lt;!--[if IE]&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;excanvas.js&quot;&gt;&lt;/script&gt;
&lt; ![endif]--&gt;</pre>
<p>В body добавим следующую разметку:</p>
<pre class="brush: xml;">&lt;canvas id=&quot;canvas&quot; height=&quot;150&quot; width=&quot;150&quot;&gt;&lt;/canvas&gt;</pre>
<p>И самое главное &#8211; JS-код, который и рисует сами часики:</p>
<pre class="brush: jscript;">
// ожидаем загрузку
window.onload = function(){
  // рисуем часы
  clock();
  // через каждую секунду
  // часы перерисовываются
  setInterval(clock, 1000);
}
//
function clock() {
  // получаем текущие дату и время
  var now = new Date();
  var sec = now.getSeconds();
  var min = now.getMinutes();
  var hr = now.getHours();

  // получаем контекст canvas
  var ctx = document
  .getElementById(&quot;canvas&quot;)
  .getContext(&quot;2d&quot;);

  // сохраняем состояние
  ctx.save();
  // инициализируем холст
  ctx.clearRect(0,0,150,150);
  // рисуя в точке 0,0 фактически
  // рисуем в точке 75,75
  ctx.translate(75,75);
  // при рисовании линии в 100px
  // фактически рисуем линию в 40px
  ctx.scale(0.4,0.4);
  // начинаем вращать с 12:00
  ctx.rotate(-Math.PI/2);

  // инициализируем свойства рисунка
  // контуры рисуем черным
  ctx.strokeStyle = &quot;black&quot;;
  // заливка тоже черная
  ctx.fillStyle = &quot;black&quot;;
  // ширина линии 8px
  ctx.lineWidth = 8;
  // будем рисовать по кругу
  ctx.lineCap = &quot;round&quot;;

  // начинаем рисовать часовые метки
  // сохраняем предыдущее состояние
  ctx.save();
  ctx.beginPath();
  // для каждого часа
  for(var i = 0; i &lt; 12; i++) {
  	// поворачиваем на 1/12
    ctx.rotate(Math.PI/6);
    // перемещаем курсор
    ctx.moveTo(100,0);
    // рисуем черточку 20px
    ctx.lineTo(120,0);
  }
  ctx.stroke();
  ctx.restore();

  // сохраняем состояние
  ctx.save();
  // ставим ширину линии 5px
  ctx.lineWidth = 5;
  ctx.beginPath();
  // рисуем минутные метки
  // для каждой минуты
  for(var i = 0; i &lt; 60; i++) {
  	// кроме тех, что совпадут
  	// с часами
    if(i%5 != 0) {
      // перемещаем курсор
      ctx.moveTo(117,0);
      // рисуем черточку 3px
      ctx.lineTo(120,0);
    }
    // вращаем холст на 1/60
    ctx.rotate(Math.PI/30);
  }
  ctx.stroke();
  ctx.restore();

  // сохраняем состояние
  ctx.save();
  // начинаем рисовать часовую стрелку
  // вращаем холст на текущую позицию
  ctx.rotate((Math.PI/6)*hr +
             (Math.PI/360)*min +
             (Math.PI/21600)*sec);
  // устанавливаем ширину линии 14px
  ctx.lineWidth = 14;

  ctx.beginPath();
  // сдвигаем курсор несколько назад
  // стобы было похоже на стрелку
  ctx.moveTo(-20,0);
  // рисуем линию почти до часовых меток
  ctx.lineTo(80,0);
  ctx.stroke();
  ctx.restore();

  // сохраняем состояние
  ctx.save();
  // начинаем рисовать минутную стрелку
  // вращаем холст на текущую позицию
  ctx.rotate((Math.PI/30)*min +
             (Math.PI/1800)*sec);
  // ширина линии 10px
  ctx.lineWidth = 10;
  ctx.beginPath();
  // двигаем курсор
  ctx.moveTo(-28,0);
  // рисуем линию
  ctx.lineTo(112,0);
  ctx.stroke();
  ctx.restore();

  // сохраняем состояние
  ctx.save();
  // начинаем рисовать секундную стрелку
  // вращаем холст на текущую позицию
  ctx.rotate(sec * Math.PI/30);
  // контур и заливка красного цвета
  ctx.strokeStyle = &quot;#D40000&quot;;
  ctx.fillStyle = &quot;#D40000&quot;;
  // ширина линии 6px
  ctx.lineWidth = 6;
  ctx.beginPath();
  // двигаем курсор
  ctx.moveTo(-30,0);
  // рисуем линию
  ctx.lineTo(83,0);
  ctx.stroke();
  ctx.restore();

  // сохраняем состояние
  ctx.save();
  // рисуем внешнюю окружность
  // шириной 14px
  ctx.lineWidth = 14;
  // синим цветом
  ctx.strokeStyle = &quot;#325FA2&quot;;
  ctx.beginPath();
  // рисуем окружность, отступающую
  // от центра на 142px
  ctx.arc(0,0,142,0,Math.PI*2,true);
  ctx.stroke();
  ctx.restore();

  ctx.restore();
}</pre>
<blockquote><p>Вы можете <a href="http://www.linkexchanger.su/examples_2009/canvas/canvas.zip">скачать файлы</a> этого примера. Можно <a href="http://www.linkexchanger.su/examples_2009/canvas/canvas.html" target="_blank">открыть пример</a> в новом окне и посмотреть исходный код.</p></blockquote>
<p>В заключение я приведу несколько очень полезных ссылок, для тех, кто заинтересовался.<br />
<a href="https://developer.mozilla.org/En/Canvas_tutorial">Canvas Tutorial</a> &#8211; туториал (на английском конечно), но там Вы найдете еще впечатляющие примеры.<br />
<a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#the-canvas-element">The canvas element</a> &#8211; подраздел спецификации HTML5, касающийся элемента canvas (и тоже ес-но на английском).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2009/86.html/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
	</channel>
</rss>
