<?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>Code-Is-Art &#187; JavaScript</title>
	<atom:link href="http://www.codeisart.ru/rubric/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeisart.ru</link>
	<description>Статьи по SEO, дизайну и программированию. Переводы на веб-тематику. Исследования и наработки в области интернет-технологий.</description>
	<lastBuildDate>Tue, 08 Nov 2011 13:43:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Быстрый поиск DOM-элементов</title>
		<link>http://www.codeisart.ru/js-core-fast-dom-element-traversing/</link>
		<comments>http://www.codeisart.ru/js-core-fast-dom-element-traversing/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 20:02:01 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js-core]]></category>
		<category><![CDATA[Работа с DOM]]></category>
		<category><![CDATA[Element Traversal]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=1344</guid>
		<description><![CDATA[В&#160;новых браузерах для&#160;перемещения по&#160;DOM-дереву появилась возможность использовать интерфейс «Element&#160;Traversal», который позволяет искать элементы, исключая текстовые узлы так,&#160;как&#160;это&#160;происходит в&#160;Internet&#160;Explorer, при&#160;использовании стандартных firstChild, lastChild, nextSibling и&#160;previousSibling, что&#160;увеличивает скорость поиска элементов. В&#160;браузерах, поддерживающих «Element&#160;Traversal», доступны новые&#160;методы: firstElementChild&#160;— первый дочерний элементы; lastElementChild&#160;— последний дочерний элементы; nextElementSibling&#160;— следующий элементы; previousElementSibling&#160;— предыдущий элементы; childElementCount&#160;— количество дочерних элементов. Эти&#160;методы работают с&#160;узлами, у&#160;которых [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/02/sticker1.png" alt="js-core dom traversing" width="141" height="141" class="left" />В&nbsp;новых браузерах для&nbsp;перемещения по&nbsp;<abbr title="Document Object Model">DOM</abbr>-дереву появилась возможность использовать интерфейс «Element&nbsp;Traversal», который позволяет искать элементы, исключая текстовые узлы так,&nbsp;как&nbsp;это&nbsp;происходит в&nbsp;Internet&nbsp;Explorer, при&nbsp;использовании стандартных <code>firstChild</code>, <code>lastChild</code>, <code>nextSibling</code> и&nbsp;<code>previousSibling</code>, что&nbsp;увеличивает скорость поиска элементов.</p>
<p><span id="more-1344"></span></p>
<p>В&nbsp;браузерах, поддерживающих «<a href="http://www.w3.org/TR/ElementTraversal/" rel="external nofollow">Element&nbsp;Traversal</a>», доступны новые&nbsp;методы:</p>
<ul>
<li><code>firstElementChild</code>&nbsp;— первый дочерний элементы;</li>
<li><code>lastElementChild</code>&nbsp;— последний дочерний элементы;</li>
<li><code>nextElementSibling</code>&nbsp;— следующий элементы;</li>
<li><code>previousElementSibling</code>&nbsp;— предыдущий элементы;</li>
<li><code>childElementCount</code>&nbsp;— количество дочерних элементов.</li>
</ul>
<p>Эти&nbsp;методы работают с&nbsp;узлами, у&nbsp;которых <code>nodeType&nbsp;==&nbsp;1</code>, например, метод <code>childElementCount</code> показывает не&nbsp;сколько всего&nbsp;дочерних узлов, а&nbsp;количество дочерних элементов, т.&nbsp;е.&nbsp;узлов с&nbsp;<code>nodeType&nbsp;==&nbsp;1</code>.</p>
<p>Все&nbsp;конечно хорошо и&nbsp;удобно, но&nbsp;нельзя забывать о&nbsp;огромной армии пользователей старых браузеров, поэтому напишем функции, которые позволят кросс-браузерно выполнять поиск дочерних элементов.</p>
<p>Для&nbsp;начала проверим, поддерживает&nbsp;ли браузер интерфейс «Element&nbsp;Traversal»?</p>
<pre><code class="javascript">var traversal = typeof document
                           .createElement('div')
                               .childElementCount != 'undefined';</code></pre>
<p>В&nbsp;итоге переменная <code>traversal</code> будет&nbsp;иметь значение <code>true</code> или&nbsp;<code>false</code>, опираясь на&nbsp;которое мы&nbsp;будем&nbsp;выбирать, какой из&nbsp;способов перемещения по&nbsp;<abbr title="Document Object Model">DOM</abbr>-дереву использовать.</p>
<p>Следующая функция будет&nbsp;искать первый дочерний элемент:</p>
<pre><code class="javascript">var firstChild = traversal ? function(node) {
    // для новых браузеров достаточно
    // воспользоваться встроенным методом
    return node.firstElementChild;
} : function(node) {
    // для старых браузеров
    // находим первый дочерний узел
    node = node.firstChild;
    // ищем в цикле следующий узел,
    // пока не встретим элемент с nodeType == 1
    while(node &amp;&amp; node.nodeType != 1) node = node.nextSibling;
    // возвращаем результат
    return node;
};</code></pre>
<p>Рассмотрим простой пример использования:</p>
<p class="bold">XHTML</p>
<pre><code class="html">&lt;div id=&quot;test&quot;&gt;
    text node
    &lt;div&gt;First&lt;/div&gt;
    text node
    &lt;div&gt;Last&lt;/div&gt;
    text node
&lt;/div&gt;</code></pre>
<p class="bold">JavaScript</p>
<pre><code class="javascript">var node = document.getElementById('test');
var text = firstChild(node).innerHTML;
alert(text); // → First</code></pre>
<p>Аналогично будет выглядет функция <code>lastChild</code>:</p>
<pre><code class="javascript">var lastChild = traversal ? function(node) {
    return node.lastElementChild;
} : function(node) {
    node = node.lastChild;
    while(node &amp;&amp; node.nodeType != 1) node = node.previousSibling;
    return node;
};</code></pre>
<p>Используем:</p>
<pre><code class="javascript">text = lastChild(node).innerHTML;
alert(text); // → Last</code></pre>
<p>Назовем функции поиска следующего и&nbsp;предыдущего элемента «next» и&nbsp;«previous» соответственно:</p>
<pre><code class="javascript">var next = traversal ? function(node) {
    return node.nextElementSibling;
} : function(node) {
    while(node = node.nextSibling) if(node.nodeType == 1) break;
    return node;
};
var previous = traversal ? function(node) {
    return node.previousElementSibling;
} : function(node) {
    while(node = node.previousSibling) if(node.nodeType == 1) break;
    return node;
};</code></pre>
<p>И&nbsp;рассмотрим их&nbsp;работу на&nbsp;простеньком примере:</p>
<p class="bold">XHTML</p>
<pre><code class="html">&lt;div&gt;
    text node
    &lt;div id=&quot;first&quot;&gt;First&lt;/div&gt;
    text node
    &lt;div id=&quot;last&quot;&gt;Last&lt;/div&gt;
    text node
&lt;/div&gt;</code></pre>
<p class="bold">JavaScript</p>
<pre><code class="javascript">var node = document.getElementById('first');
var text = next(node).innerHTML;
alert(text); // → Last
node = document.getElementById('last');
text = previous(node).innerHTML;
alert(text); // → First</code></pre>
<p>Чтобы&nbsp;получить коллекцию дочерних узлов, среди&nbsp;которых могут&nbsp;содержаться, ненужные нам&nbsp;текстовые узлы, в&nbsp;интерфейсе <abbr title="Document Object Model">DOM</abbr> предусмотрен метод <code>childNodes</code>, но&nbsp;большинство браузеров поддерживает и&nbsp;более&nbsp;удобный метод <code>children</code>, который возвращает коллекцию, состоящую только из&nbsp;элементов.</p>
<p>Проверим, поддерживает ли&nbsp;браузер метод <code>children</code>?</p>
<pre><code class="javascript">var children = typeof document
                          .createElement('div')
                              .children != 'undefined';</code></pre>
<p>И&nbsp;напишем функцию поиска:</p>
<pre><code class="javascript">var child = children ? function(node) {
    return node.children;
} : function(node) {
    var list = node.childNodes,
    length = list.length,
    i = -1,
    array = [];
    while(++i &lt; length)
        if(list[i].nodeType == 1)
            array.push(list[i]);
    return array;
};</code></pre>
<p>Ну&nbsp;и&nbsp;конечно рассмотрим работу на&nbsp;примере:</p>
<p class="bold">XHTML</p>
<pre><code class="html">&lt;div id=&quot;test&quot;&gt;
    text node
    &lt;div&gt;First&lt;/div&gt;
    text node
    &lt;div&gt;Last&lt;/div&gt;
    text node
&lt;/div&gt;</code></pre>
<p class="bold">JavaScript</p>
<pre><code class="javascript">var node = document.getElementById('test');
var count = child(node).length;
alert(count); // → 2</code></pre>
<p>Все&nbsp;эти&nbsp;методы, но&nbsp;в&nbsp;более&nbsp;функциональном виде, используются в&nbsp;новых версиях <a href="http://www.js-core.ru/">JavaScript&nbsp;фреймворка&nbsp;js-core</a>. А&nbsp;так&nbsp;же,&nbsp;для&nbsp;поиска всех&nbsp;дочерних элементов по&nbsp;имени <abbr title="Cascading Style Sheets">CSS</abbr>-класса, атрибутам или&nbsp;просто по&nbsp;имени&nbsp;тега, когда&nbsp;это&nbsp;возможно, используется «<a href="http://www.w3.org/TR/selectors-api/" rel="external nofollow">Selectors&nbsp;API</a>», что&nbsp;позволяет добиться хороших результатов в&nbsp;тестах на&nbsp;производительность.</p>
<p>Кстати, Microsoft как&nbsp;всегда&nbsp;«радует», в&nbsp;Internet&nbsp;Explorer&nbsp;8&nbsp;<abbr title="Release Candidate 1">RC1</abbr> синтаксис методов <code>querySelector</code> и&nbsp;<code>querySelectorAll</code> ограничен версией&nbsp;<abbr title="Cascading Style Sheets Level 2">CSS2</abbr> <img src='http://www.codeisart.ru/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Еще&nbsp;подготовил более&nbsp;симпатичную страничку с&nbsp;<a href="http://js-core.googlecode.com/svn/trunk/index.html">примерами</a> использования&nbsp;js-core, на&nbsp;которой можно&nbsp;посмотреть пошаговое выполнение некоторых операций.</p>
<p><b>В рамках акции</b> «<a title="Акция обмена постовыми" href="http://www.codeisart.ru/obmen-postovimi/">Обмен постовыми</a>»:</p>
<ul>
<li>Молодой блог об IT&nbsp;&mdash;&nbsp;<a href="http://ksm.kolo.ws/">kSM’s blog</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-fast-dom-element-traversing/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CSS-селекторы в js-core</title>
		<link>http://www.codeisart.ru/js-core-css-selectors/</link>
		<comments>http://www.codeisart.ru/js-core-css-selectors/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 13:10:48 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js-core]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=1087</guid>
		<description><![CDATA[Встроенной поддержки механизма выборки элементов с&#160;использованием CSS-селекторов&#160;нет, но&#160;легко&#160;внедрить один&#160;из&#160;существующих. Возьмем готовые решения Sizzle, Peppy и&#160;Yass, и&#160;сделаем расширение для&#160;js-core, которое будет автоматически преобразовывать список элементов, выдаваемый этими&#160;движками, в&#160;объект для&#160;работы со&#160;списками узлов, предусмотренный в&#160;framework&#8217;е. Sizzle core.query = function(selector, context) { return new core.list(Sizzle(selector, context), false); }; core.prototype.query = function(selector) { return new core.list(Sizzle(selector, this.node), false); }; Peppy [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/01/js-core-css-selectors.png" alt="Логотип js-core" width="192" height="192" class="left" />Встроенной поддержки механизма выборки элементов с&nbsp;использованием CSS-селекторов&nbsp;нет, но&nbsp;легко&nbsp;внедрить один&nbsp;из&nbsp;существующих.</p>
<p>Возьмем готовые решения <a href="http://github.com/jeresig/sizzle/tree/master/sizzle.js">Sizzle</a>, <a href="http://jamesdonaghue.com/static/peppy/">Peppy</a> и&nbsp;<a href="http://yass.webo.in/">Yass</a>, и&nbsp;сделаем расширение для&nbsp;js-core, которое будет автоматически преобразовывать список элементов, выдаваемый этими&nbsp;движками, в&nbsp;объект для&nbsp;работы со&nbsp;списками узлов, предусмотренный в&nbsp;framework&#8217;е.</p>
<p><span id="more-1087"></span></p>
<h3>Sizzle</h3>
<pre><code class="javascript">core.query = function(selector, context) {
    return new core.list(Sizzle(selector, context), false);
};
core.prototype.query = function(selector) {
    return new core.list(Sizzle(selector, this.node), false);
};</code></pre>
<h3>Peppy</h3>
<pre><code class="javascript">core.query = function(selector, context) {
    return new core.list(peppy.query(selector, context), false);
};
core.prototype.query = function(selector) {
    return new core.list(peppy.query(selector, this.node), false);
};</code></pre>
<h3>Yass</h3>
<pre><code class="javascript">core.query = function(selector, context) {
    return new core.list(yass(selector, context), false);
};
core.prototype.query = function(selector) {
    return new core.list(yass(selector, this.node), false);
};</code></pre>
<p>Добавьте одно&nbsp;из&nbsp;этих&nbsp;расширений сразу&nbsp;после&nbsp;загрузки js-core и&nbsp;соответствующего движка выборки элементов по&nbsp;CSS-селекторам.</p>
<p>Рассмотрим, как&nbsp;это&nbsp;можно&nbsp;использовать. Возьмем следующий XHTML-код:</p>
<pre><code class="html">&lt;ul id=&quot;list&quot;&gt;
    &lt;li&gt;First list item&lt;/li&gt;
    &lt;li&gt;Second list item&lt;/li&gt;
    &lt;li&gt;Third list item&lt;/li&gt;
    &lt;li&gt;Fourth list item&lt;/li&gt;
    &lt;li&gt;Fifth list item&lt;/li&gt;
    &lt;li&gt;Sixth list item&lt;/li&gt;
    &lt;li&gt;Seventh list item&lt;/li&gt;
    &lt;li&gt;Eighth list item&lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>Опишем CSS-класс:</p>
<pre><code class="css">.odd {
    background: #ffc;
}</code></pre>
<p>Теперь, с&nbsp;помощью JavaScript, добавим класс <var>odd</var> всем&nbsp;нечетным элементам списка <var>list</var>:</p>
<pre><code class="javascript">$.query('#list > li:nth-child(odd)').each('addClass', 'odd');

// или
$('list').query('li:nth-child(odd)').each('addClass', 'odd');</code></pre>
<p>Получим так называемую «зебру» из элементов списка:</p>
<pre><code class="html">&lt;ul id=&quot;list&quot;&gt;
    &lt;li class=&quot;odd&quot;&gt;First list item&lt;/li&gt;
    &lt;li&gt;Second list item&lt;/li&gt;
    &lt;li class=&quot;odd&quot;&gt;Third list item&lt;/li&gt;
    &lt;li&gt;Fourth list item&lt;/li&gt;
    &lt;li class=&quot;odd&quot;&gt;Fifth list item&lt;/li&gt;
    &lt;li&gt;Sixth list item&lt;/li&gt;
    &lt;li class=&quot;odd&quot;&gt;Seventh list item&lt;/li&gt;
    &lt;li&gt;Eighth list item&lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>В&nbsp;функции <code>$.query(…)</code> вторым&nbsp;параметром можно&nbsp;указать контекст поиска. Это&nbsp;бывает&nbsp;удобно, например, при&nbsp;поиске элементов ввода внутри форм или&nbsp;нахождении элементов в&nbsp;XML-данных, пришедших с&nbsp;сервера через&nbsp;AJAX.</p>
<pre><code class="javascript">// найти все чекбоксы в первой форме документа
$.query('input[type="checkbox"]', document.forms[0]);</code></pre>
<p>В&nbsp;методе <code>$('id'|node).query('selector')</code>, в&nbsp;качестве контекста поиска, автоматически передается текущий элемент.</p>
<p>Скачать: <a href="http://www.codeisart.ru/wp-content/uploads/2009/01/js-core-css-selectors.zip">пример</a>, <a href="http://code.google.com/p/js-core/downloads/list">js-core</a>.</p>
<p><b>В рамках акции</b> &laquo;<a href="http://www.codeisart.ru/obmen-postovimi/" title="Акция обмена постовыми">Обмен постовыми</a>&raquo;:</p>
<ul>
<li><a href="http://anna-volkova.blogspot.com/" title="Записки микростокового иллюстратора">Записки микростокового иллюстратора</a>&nbsp;&mdash;&nbsp;блог о том, как еще можно заработать в сети.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-css-selectors/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>js-core reloaded</title>
		<link>http://www.codeisart.ru/js-core-reloaded/</link>
		<comments>http://www.codeisart.ru/js-core-reloaded/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 21:26:25 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js-core]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=1059</guid>
		<description><![CDATA[Итак, прошло уже&#160;много времени с&#160;момента, когда&#160;я (Коробкин&#160;Дмитрий) начал&#160;заниматься разработкой своего&#160;JavaScript фреймворка. Целью&#160;было создать продукт, который&#160;бы занял свое&#160;место среди&#160;небольших и&#160;быстрых библиотек, позволяющих более&#160;удобно производить манипуляции с&#160;DOM, легко организовывать AJAX-запросы, а&#160;главное в&#160;какой-то&#160;степени избавить программиста от&#160;проблемы кросс-браузерности. Теперь, пройдя&#160;множество исправлений, дополнений и&#160;модификаций, js-core вполне&#160;может использоваться в&#160;проектах любой&#160;сложности, обеспечивая достойный уровень производительности. В&#160;версии&#160;2.7 структура фреймворка была&#160;полностью изменена, он&#160;не&#160;будет вызывать [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/01/js-core-logo-small.png" width="192" height="192" alt="js-core logotype" class="left" />Итак, прошло уже&nbsp;много времени с&nbsp;момента, когда&nbsp;я (Коробкин&nbsp;Дмитрий) начал&nbsp;заниматься разработкой своего&nbsp;JavaScript фреймворка. Целью&nbsp;было создать продукт, который&nbsp;бы занял свое&nbsp;место среди&nbsp;небольших и&nbsp;быстрых библиотек, позволяющих более&nbsp;удобно производить манипуляции с&nbsp;DOM, легко организовывать AJAX-запросы, а&nbsp;главное в&nbsp;какой-то&nbsp;степени избавить программиста от&nbsp;проблемы кросс-браузерности.</p>
<p>Теперь, пройдя&nbsp;множество исправлений, дополнений и&nbsp;модификаций, js-core вполне&nbsp;может использоваться в&nbsp;проектах любой&nbsp;сложности, обеспечивая достойный уровень производительности. В&nbsp;версии&nbsp;2.7 структура фреймворка была&nbsp;полностью изменена, он&nbsp;не&nbsp;будет вызывать конфликты с&nbsp;другими скриптами, из-за&nbsp;внедрения пользовательских методов в&nbsp;прототипы встроенных объектов JavaScript. В&nbsp;глобальное пространство имен помещается только&nbsp;один объект с&nbsp;ссылками <code>core</code> и&nbsp;<code>$</code> на&nbsp;него. Появилась возможность работы со&nbsp;списками узлов.</p>
<p><span id="more-1059"></span></p>
<h3>Содержание</h3>
<ul>
<li><a href="#js-core-main-function-and-caching">Функция $(…)&nbsp;— получение элемента по&nbsp;идентификатору, кэширование</a></li>
<li><a href="#js-core-chaining">Цепочки&nbsp;— последовательный вызов методов</a></li>
<li><a href="#js-core-context">Текущий элемент, контекст вызова</a></li>
<li> <a href="#js-core-events">Обработка событий</a>
<ul>
<li><a href="#js-core-events-bind">Добавление/удаление обработчиков событий</a></li>
<li> <a href="#js-core-events-object">Работа с&nbsp;объектом-событие</a>
<ul>
<li><a href="#js-core-events-object-mouse">События мыши</a></li>
<li><a href="#js-core-events-object-keyboard">События клавиатуры</a></li>
<li><a href="#js-core-events-object-default-and-bubbling">Стандартное действие браузера и&nbsp;всплывание событий</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#js-core-node-list">Работа со&nbsp;списками элементов</a></li>
<li> <a href="#js-core-methods">Методы js-core</a>
<ul>
<li><a href="#js-core-methods-core-prototype">Методы доступные через&nbsp;прототип функции core(…) или&nbsp;$(…)</a></li>
<li><a href="#js-core-methods-core">Методы и&nbsp;атрибуты объекта core или&nbsp;$</a></li>
<li><a href="#js-core-methods-timer">Методы работы с&nbsp;таймером</a></li>
<li><a href="#js-core-methods-list">Методы работы со&nbsp;списками узлов</a></li>
<li><a href="#js-core-methods-event">Методы работы с&nbsp;объектом-событие</a></li>
<li><a href="#js-core-methods-ajax">Методы работы c&nbsp;AJAX</a></li>
</ul>
</li>
<li><a href="#js-core-writing-extensions">Создание расширений для&nbsp;js-core</a></li>
<li><a href="#js-core-features">Что&nbsp;дальше?</a></li>
<li><a href="#js-core-download">Скачать</a></li>
</ul>
<h3 id="js-core-main-function-and-caching">Функция $(…)&nbsp;— получение элемента по&nbsp;идентификатору, кэширование</h3>
<p>Допустим, у&nbsp;нас&nbsp;есть&nbsp;следующий XHTML-код:</p>
<pre><code class="html">&lt;div id=&quot;container&quot;&gt;&lt;/div&gt;</code></pre>
<p>Чтобы получить ссылку на&nbsp;узел <code>&lt;div&#038;gt</code>; с&nbsp;идентификатором <var>container</var>, в&nbsp;JavaScript предусмотрен метод <code>getElementById(…)</code> объекта <code>document</code>:</p>
<pre><code class="javascript">var node = document.getElementById('container');</code></pre>
<p>Существует очень распространенная функция, сокращающая эту&nbsp;запись:</p>
<pre><code class="javascript">function $(id) {
    return document.getElementById(id);
}</code></pre>
<p>Или&nbsp;более&nbsp;сложный вариант:</p>
<pre><code class="javascript">function $(arg) {
    return typeof arg == 'string' ? document.getElementById(arg) : arg;
}</code></pre>
<p>В&nbsp;таком&nbsp;виде функция <code>$(…)</code> просто&nbsp;сокращает запись метода <code>getElementById(…)</code>, предавая прямую ссылку на&nbsp;узел.</p>
<p>В&nbsp;js-core функции <code>core(…)</code> и&nbsp;<code>$(…)</code> эквивалентны, и&nbsp;возвращают новую&nbsp;копию объекта <code>core</code>, содержащую ссылку на&nbsp;указанный&nbsp;узел. Таким&nbsp;образом, через&nbsp;прототип объекта <code>core</code> для&nbsp;этого&nbsp;узла становится доступен набор методов, позволяющих производить манипуляции с&nbsp;DOM, добавлять обработчики событий и&nbsp;изменять стили элемента.</p>
<p>Выполним следующий код, с&nbsp;использованием фреймворка:</p>
<pre><code class="javascript">var obj = $('container')

// или
var obj = core('container')

// или
var obj = new $('container')

// или
var obj = new core('container')</code></pre>
<p>Все&nbsp;эти&nbsp;варианты абсолютно равнозначны, только, последние&nbsp;2 теоретически должны выполнится быстрее, т.&nbsp;к.&nbsp;первые просто рекурсивно вызывают функцию <code>core</code> в&nbsp;конструкторе&nbsp;<code>new</code>. В&nbsp;результате переменная&nbsp;<var>obj</var> будет&nbsp;ссылкой на&nbsp;объект следующего вида:</p>
<pre><code class="javascript">{node: HTMLDivElement}</code></pre>
<p>Такой&nbsp;объект можно&nbsp;бы&nbsp;было&nbsp;получить, например, такми&nbsp;образом:</p>
<pre><code class="javascript">var obj = {node: document.getElementById('container')}</code></pre>
<p>Но&nbsp;у&nbsp;созданного при&nbsp;помощи функции <code>core(…)</code> или&nbsp;<code>$(…)</code>, входящих в&nbsp;состав&nbsp;js-core, объекта есть&nbsp;одно&nbsp;важное отличие&nbsp;— наличие специальных методов в&nbsp;прототипе, доступ к&nbsp;которым осуществляется так&nbsp;же,&nbsp;как&nbsp;и&nbsp;к&nbsp;любым другим&nbsp;методам объектов в&nbsp;JavaScript:</p>
<pre><code class="javascript">$('container').hide()

// или
$('container')['hide']()</code></pre>
<p>Забегая вперед, скажу, что&nbsp;метод <code>hide(…)</code> просто&nbsp;скрывает указанный элемент.</p>
<p>Чтобы&nbsp;получить прямую ссылку на&nbsp;DOM-узел, достаточно написать:</p>
<pre><code class="javascript">var node = $('container').node</code></pre>
<p>Так&nbsp;же&nbsp;в&nbsp;любой момент можно&nbsp;беспрепятственно воспользоваться этой&nbsp;ссылкой в&nbsp;уже&nbsp;созданном, функциями <code>core(…)</code> или&nbsp;<code>$(…)</code>, объекте:</p>
<pre><code class="javascript">var obj = $('container')
var node = obj.node</code></pre>
<p>Если&nbsp;отправить в&nbsp;функцию <code>core(…)</code> или&nbsp;<code>$(…)</code> не&nbsp;строку, содержащую имя&nbsp;идентификатора узла, а&nbsp;ссылку на&nbsp;узел, то&nbsp;она&nbsp;автоматически будет запомнена в&nbsp;том же&nbsp;атрибуте <var>node</var>:</p>
<pre><code class="javascript">var obj = $(document.getElementById('container'))
alert(obj.node.id) // выдаст сообщение &quot;container&quot;</code></pre>
<p>Все&nbsp;ссылки на&nbsp;элементы, полученные по&nbsp;идентификатору, помещаются в&nbsp;кэш. Кэш очищается каждый&nbsp;раз, когда&nbsp;выполняется удаление DOM-узлов или&nbsp;изменение идентификатора средствами фреймворка. Если&nbsp;вы&nbsp;производили какие-либо манипуляции с&nbsp;DOM и&nbsp;у&nbsp;вас&nbsp;возникли проблемы из-за&nbsp;наличия в&nbsp;кэше ссылок на&nbsp;удаленные узлы, достаточно просто инициализировать кэш ссылкой на&nbsp;новый объект:</p>
<pre><code class="javascript">$.cache = {}</code></pre>
<p>Или&nbsp;выполнить функцию <code>$.clear(…)</code>, передав в&nbsp;нее в&nbsp;качестве аргумента, ссылку на&nbsp;изменяемый узел:</p>
<pre><code class="javascript">$.clear(document.getElementById('container'))</code></pre>
<p>Если&nbsp;вы&nbsp;уже&nbsp;используете функцию <code>$(…)</code>, то&nbsp;js-core не&nbsp;заменит&nbsp;её, если&nbsp;она&nbsp;будет&nbsp;создана до&nbsp;подключения фреймворка. В&nbsp;этом случае можно использовать функцию <code>core(…)</code> или&nbsp;заключить код, использующий js-core в&nbsp;функцию-обертку:</p>
<pre><code class="javascript">(function($) {
    // Здесь $(…) — функция фреймворка &quot;js-core&quot;
})(core);</code></pre>
<h3 id="js-core-chaining">Цепочки&nbsp;— последовательный вызов методов</h3>
<p>JavaScript позволяет реализовать последовательный вызов методов, называемый «цепочками вызовов». В&nbsp;js-core активно используется эта&nbsp;возможно, что&nbsp;позволяет в&nbsp;некоторых случаях обойтись без&nbsp;дополнительных переменных. Рассмотрим это&nbsp;на&nbsp;простом примере, добавим элементу с&nbsp;идентификатором <var>container</var> CSS-класс <var>highlight</var> и&nbsp;какой-то текст:</p>
<pre><code class="javascript">$('container').addClass('highlight').text('Пример')

// или
$('container').text('Пример').addClass('highlight')</code></pre>
<p>В&nbsp;какой последовательности вызывать методы, работающие с&nbsp;одним&nbsp;и&nbsp;тем&nbsp;же&nbsp;узлом, в&nbsp;данном случае, не&nbsp;имеет&nbsp;значения.</p>
<p>В&nbsp;результате получим:</p>
<pre><code class="html">&lt;div id=&quot;container&quot; class=&quot;highlight&quot;&gt;Пример&lt;/div&gt;</code></pre>
<p>Цепочку можно&nbsp;продолжать, вызывая доступные методы.</p>
<p>Если&nbsp;все-таки необходимо запомнить ссылку на&nbsp;объект в&nbsp;переменную, то&nbsp;можно сделать это&nbsp;несколькими способами:</p>
<pre><code class="javascript">var obj = $('container')
obj.addClass('highlight').text('Пример')

// или
var obj = $('container').text('Пример').addClass('highlight')</code></pre>
<p>Второй вариант возможен ввиду&nbsp;того, что&nbsp;методы возвращают объект, созданный на&nbsp;первом звене цепочки вызовов. Но,&nbsp;так&nbsp;происходит не&nbsp;всегда, в&nbsp;фреймворке есть&nbsp;функции, которые&nbsp;могут либо&nbsp;обрывать цепочку, возвращая какое-то&nbsp;значение, либо&nbsp;продолжать цепочку, но&nbsp;работая уже&nbsp;с&nbsp;новым объектом.</p>
<p>Допустим, у&nbsp;нас&nbsp;есть&nbsp;следующий XHTML-код:</p>
<pre><code class="html">&lt;div id=&quot;container&quot;&gt;Пример&lt;/div&gt;</code></pre>
<p>Добавим элементу с&nbsp;идентификатором <var>container</var> CSS-класс <var>highlight</var> и&nbsp;сохраним в&nbsp;переменную содержащийся в&nbsp;нем&nbsp;текст:</p>
<pre><code class="javascript">var text = $('container').addClass('highlight').text()
alert(text) // выдаст сообщение &quot;Пример&quot;</code></pre>
<p>Вызванный метод <code>text()</code>, без&nbsp;параметров, обрывает цепочку и&nbsp;возвращает <code>innerText</code> текущего узла.</p>
<p>Другой тип функций передает в&nbsp;цепочке новый объект, содержащий, например, ссылку на&nbsp;добавленный элемент:</p>
<pre><code class="javascript">var obj = $('container').addClass('highlight').append('span')</code></pre>
<p>В&nbsp;результате в&nbsp;переменной <var>obj</var>&nbsp;будет&nbsp;находиться ссылка на&nbsp;<code>HTMLSpanElement</code>, а&nbsp;не&nbsp;<code>HTMLDivElement</code>, таким&nbsp;образом, можно&nbsp;продолжить цепочку:</p>
<pre><code class="javascript">var obj = $('container').addClass('highlight')
                        .append('span').text('Добавленный текст')</code></pre>
<p>Переменная <var>obj</var>&nbsp;все&nbsp;так&nbsp;же&nbsp;будет&nbsp;содержать ссылку на&nbsp;<code>HTMLSpanElement</code>, так&nbsp;как&nbsp;метод <code>text</code> вернет предыдущий в&nbsp;цепочке объект, созданный функцией <code>append(…)</code>.</p>
<p>XHTML-код приобретет следующий вид:</p>
<pre><code class="html">&lt;div id=&quot;container&quot; class=&quot;highlight&quot;&gt;
    Пример
    &lt;span&gt;Добавленный текст&lt;/span&gt;
&lt;/div&gt;</code></pre>
<h3 id="js-core-context">Текущий элемент, контекст вызова</h3>
<p>Из&nbsp;предыдущего примера видно, что&nbsp;элемент, с&nbsp;которым идет работа в&nbsp;цепочке вызовов, может изменяться. Соответственно изменяется и&nbsp;контекст вызова функций <code>this</code>, происходит это&nbsp;следующим образом:</p>
<pre><code class="javascript">$('container')      // this → HTMLDivElement
.append('fieldset') // this → HTMLFieldsetElement
.append('p')        // this → HTMLParagraphElement
.prepend('span')    // this → HTMLSpanElement
.text('Пример')     // this → HTMLSpanElement</code></pre>
<p>Получим XHTML-код:</p>
<pre><code class="html">&lt;div id=&quot;container&quot;&gt;
    &lt;fieldset&gt;
        &lt;p&gt;
            &lt;span&gt;Пример&lt;/span&gt;
        &lt;/p&gt;
    &lt;/fieldset&gt;
&lt;/div&gt;</code></pre>
<p>Таким&nbsp;образом, можно&nbsp;выполнить код последовательно, для&nbsp;каждого элемента, не&nbsp;запоминая ссылку на&nbsp;него в&nbsp;переменную:</p>
<pre><code class="javascript">$('container').exist(function() {
    // this → HTMLDivElement
}).append('fieldset').exist(function() {
    // this → HTMLFieldsetElement
}).append('p').exist(function() {
    // this → HTMLParagraphElement
}).prepend('span').exist(function() {
    // this → HTMLSpanElement
}).text('Пример') // this → HTMLSpanElement</code></pre>
<p>Метод <code>exist(…)</code> проверяет наличие элемента и&nbsp;запускает callback-функйцию, которая вызывается в&nbsp;контексте текущего узла.</p>
<h3 id="js-core-events">Обработка событий</h3>
<p>Кросс-браузерная обработка событий, наверное, одна&nbsp;из&nbsp;самых&nbsp;сложных частей фреймворка, как&nbsp;для&nbsp;понимания, так&nbsp;и&nbsp;в&nbsp;плане реализации.</p>
<h4 id="js-core-events-bind">Добавление/удаление обработчиков событий</h4>
<p>В&nbsp;Internet Explorer, в&nbsp;отличие от&nbsp;других браузеров, выполняемые по&nbsp;событию функции, добавленные методом <code>attachEvent(…)</code>, не&nbsp;получают в&nbsp;качестве первого аргумента объект-событие и&nbsp;не&nbsp;вызываются в&nbsp;контексте элемента, к&nbsp;событию которого «привязаны». Чтобы&nbsp;частично решить эту&nbsp;проблему в&nbsp;js-core все&nbsp;анонимные функции, добавляемые в&nbsp;обработчик события какого-либо элемента, автоматически вызываются в&nbsp;контексте этого элемента, а&nbsp;для&nbsp;получения объекта-событие предусмотрены специальные методы, о&nbsp;которых позже.</p>
<p>Добавим обработчик события <code>click</code> для узла с идентификатором <var>container<var>:</p>
<pre><code class="javascript">$('container').bind('click', function() {
    // this → HTMLDivElement
})</code></pre>
<p>Для&nbsp;анонимной функции, переданной в&nbsp;метод <code>bind(…)</code>, в&nbsp;Internet&nbsp;Explorer будет автоматически добавлена «обертка», вызывающая эту&nbsp;функцию в&nbsp;контексте узла с&nbsp;идентификатором <var>container</var>. Чтобы&nbsp;иметь&nbsp;возможность удалить функцию из&nbsp;обработчика события, т.&nbsp;е.&nbsp;выполнить метод <code>removeEventListener(…)/detachEvent(…)</code>, для&nbsp;именованных функций такая&nbsp;обертка не&nbsp;добавляется, но&nbsp;предусмотрен специальный метод <code>context(…)</code>, который можно использовать следующим образом:</p>
<pre><code class="javascript">function test() {
    // this → HTMLDivElement
}
var obj = $('container')
var func = $.context(test, obj.node)
obj.bind('click', func) // добавляем обработчик события
…
obj.unbind('click', func) // удаляем обработчик события</code></pre>
<p>Немного неудобно, но&nbsp;лучшего варианта, сохраняющего возможность удаления обработчиков событий,&nbsp;нет. Для&nbsp;тех,&nbsp;кто&nbsp;хорошо разбирается в&nbsp;JavaScript, приведу более короткий вариант кода, который выполняет тоже&nbsp;самое:</p>
<pre><code class="javascript">var func, obj = $('container');
obj.bind('click', (func = $.context(function() {
    // this → HTMLDivElement
}, obj.node))) // добавляем обработчик события
…
obj.unbind('click', func) // удаляем обработчик события</code></pre>
<h4 id="js-core-events-object">Работа с&nbsp;объектом-событие</h4>
<p>Для&nbsp;работы с&nbsp;объектом-событие предусмотрен метод <code>$.event(…)</code>, который возвращает, так&nbsp;же&nbsp;как&nbsp;и&nbsp;в&nbsp;случае с&nbsp;функцией&nbsp;<code>$(…)</code>, специальную обертку, содержащую ссылку на&nbsp;этот&nbsp;объект, через&nbsp;прототип которой доступны методы для&nbsp;работы с&nbsp;событием.</p>
<p>Получить объект-событие можно&nbsp;несколькими способами:</p>
<pre><code class="javascript">$('container').bind('mousedown', function(eventObject) {
    eventObject = eventObject || window.event
    $.event(eventObject)
})

// или
$('container').bind('mousedown', function(eventObject) {
    var eventObject = arguments[0] || window.event
    $.event(eventObject)
})

// или
$('container').bind('mousedown', function(eventObject) {
    $.event(eventObject)
})

// или
$('container').bind('mousedown', function() {
    $.event(arguments[0])
})</code></pre>
<p>Все&nbsp;эти&nbsp;варианты успешно сработают. Далее&nbsp;в&nbsp;примерах будем использовать последний вариант.</p>
<h5 id="js-core-events-object-mouse">События мыши</h5>
<pre><code class="javascript">$('container').bind('mousedown', function() {
    var eventObj = $.event(arguments[0]) // обертка для объекта-событие
    eventObj.object // ссылка на объект-событие
    eventObj.mouseButton() // выдаст &quot;left&quot;, &quot;middle&quot; или &quot;right&quot;
    eventObj.mousePosition() // вернет объект {x: число, y: число}
    eventObj.mousePosition().x // координата курсора по оси OX
    eventObj.mousePosition().y // координата курсора по оси OY
    eventObj.target() // текущий элемент, при всплывании события
    this // ссылка на &lt;div&gt; c идентификатором &quot;container&quot;
})</code></pre>
<h5 id="js-core-events-object-keyboard">События клавиатуры</h5>
<pre><code class="javascript">$(document).bind('keydown', function() {
    $.event(arguments[0]).key() // код нажатой клавиши
 })</code></pre>
<h5 id="js-core-events-object-default-and-bubbling">Стандартное действие браузера и&nbsp;всплывание событий</h5>
<pre><code class="javascript">$(document.forms[0]).bind('submit', function() {
    var eventObj = $.event(arguments[0])
    eventObj.preventDefault() // предотвращает стандартное действие
    eventObj.stopPropagation() // останавливает &quot;всплывание&quot; события
    eventObj.stop() // выполняет 2 предыдущих метода
})</code></pre>
<p>Для&nbsp;управления предотвращением стандартного действия браузера <code>(preventDefualt/returnValue)</code>, методы <code>bind(…)</code> и&nbsp;<code>unbind(…)</code> могут принимать, в&nbsp;качестве 3-го&nbsp;параметра, значения <var>true</var> или&nbsp;<var>false</var>, а&nbsp;так&nbsp;же&nbsp;предусмотрен специальный метод <code>useDefault(…)</code>:</p>
<pre><code class="javascript">// выполнять автоматически preventDefault
$(document.forms[0]).bind('submit', func, false)

// отменить автоматическое срабатывание preventDefault
$(document.forms[0]).useDefault('submit', true)</code></pre>
<h3 id="js-core-node-list">Работа со&nbsp;списками элементов</h3>
<p>Еще&nbsp;одна&nbsp;функция-конструктор <code>$.list(…)</code> создает обертку для&nbsp;списка DOM-элементов (узлов&nbsp;с&nbsp;nodeType&nbsp;==&nbsp;1) и&nbsp;предоставляет набор методов:</p>
<pre><code class="javascript">var list = $.list(document.getElementsByTagName('div'))

// или
var list = new $.list(document.getElementsByTagName('div'))</code></pre>
<p>Если&nbsp;отправить в&nbsp;функцию набор, содержащий не&nbsp;только&nbsp;элементы, но&nbsp;и&nbsp;текстовые узлы, то&nbsp;она&nbsp;автоматически оставит в&nbsp;списке только&nbsp;элементы:</p>
<pre><code class="javascript">var list = $.list(document.body.childNodes)</code></pre>
<p>Так&nbsp;же, в&nbsp;качестве второго аргумента, можно&nbsp;указать значение <var>false</var> или&nbsp;функцию-фильтр. Если&nbsp;указано значение <var>false</var>, то&nbsp;автоматическая фильтрация узлов по&nbsp;значению свойства <code>nodeType</code> не&nbsp;производится, это&nbsp;может быть&nbsp;использовано для&nbsp;увеличения производительности, если&nbsp;вы&nbsp;уверены, что&nbsp;передаваемая вами&nbsp;коллекция элементов не&nbsp;содержит текстовых узлов. Функция-фильтр вызывается в&nbsp;контексте каждого элемента списка с&nbsp;<code>nodeType&nbsp;==&nbsp;1</code>, для&nbsp;того&nbsp;чтобы&nbsp;включать элемент в&nbsp;список, функция должна вернуть значение <var>true</var>.</p>
<pre><code class="javascript">var list = $.list(document.getElementsByTagName('*'), false)</code></pre>
<p>Рассмотрим работу варианта с&nbsp;функцией-фильтром на&nbsp;конкретном примере, допустим есть&nbsp;следующий XHTML-код:</p>
<pre><code class="html">&lt;ul id=&quot;list-items&quot;&gt;
    &lt;li&gt;1st list item&lt;/li&gt;
    &lt;li&gt;2nd list item&lt;/li&gt;
    &lt;li&gt;3rd list item&lt;/li&gt;
    &lt;li&gt;4th list item&lt;/li&gt;
    &lt;li&gt;5th list item&lt;/li&gt;
&lt;/ul&gt;</code></pre>
<p>Добавим CSS-класс <var>highlight</var> всем&nbsp;четным элементам &lt;li&gt; в&nbsp;списке &lt;ul&gt; c&nbsp;идентификатором <var>list-items</var>:</p>
<pre><code class="javascript">$.list($('list-items').node.childNodes, function(i) {
    return i % 2 == 0;
}).each(function() {
    $(this).addClass('highlight');
})</code></pre>
<p>Существуют способы сделать это&nbsp;короче:</p>
<pre><code class="javascript">$.list($('list-items').node.childNodes}).each(function(i) {
    if(i % 2 == 0) $(this).addClass('highlight')
});

// или
$.list($('list-items').node.childNodes, function(i) {
    return i % 2 == 0;
}).each('addClass', 'highlight')

// или
$('list-items').child().filter(function(i) {
    return i % 2 == 0;
}).each('addClass', 'highlight')

// или
$('list-items').child().each(function(i) {
    if(i % 2 == 0) $(this).addClass('highlight')
})</code></pre>
<p>Как&nbsp;видим, некоторые методы (<code>child</code>, <code>filter</code>&nbsp;и&nbsp;др.) возвращают экземпляр объекта <code>$.list</code>.</p>
<p>Сам&nbsp;список можно&nbsp;получить следующим образом:</p>
<pre><code class="javascript">var items = $.list(document.body.childNodes).items</code></pre>
<p>Остальные методы работы со&nbsp;списками смотрите в&nbsp;таблице ниже.</p>
<h3 id="js-core-methods">Методы js-core</h3>
<p>Разобьем методы на&nbsp;группы по&nbsp;объектам, к&nbsp;которым они&nbsp;относятся.</p>
<h4 id="js-core-methods-core-prototype">Методы доступные через&nbsp;прототип функции core(…) или&nbsp;$(…)</h4>
<pre><code class="javascript">$(document.body).append('h1').text('Пример');</code></pre>
<style type="text/css">table tbody td, table tbody th {text-align:left;padding: 2px;} table thead th {vertical-align:middle;}</style>
<table style="font:11px/18px Consolas, monospace;width:668px;table-layout:fixed;border:2px solid #22689c" summary="js-core methods">
<colgroup>
<col style="width:70px;background:#f5f5f5;" />
<col style="width:278" />
<col style="width:120px;" />
<col style="width:200px;" /></colgroup>
<thead>
<tr style="background:#22689c;color:#fff;font-size:12px;">
<th>Метод</th>
<th>Варианты вызова</th>
<th>Возвращаемое значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<th colspan="4" class="separate">DOM</th>
</tr>
<tr>
<th>parent</th>
<td>.parent()</td>
<td>{node:HTMLElement}</td>
<td>Получить родительский узел</td>
</tr>
<tr>
<th rowspan="2">append</th>
<td>.append(&#8216;tagName&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить новый узел в&nbsp;конец списка дочерних элементов текущего узла</td>
</tr>
<tr>
<td>.append(HTMLElement)</td>
<td>Переместить существующий узел в&nbsp;конец списка дочерних элементов текущего узла</td>
</tr>
<tr>
<th rowspan="2">prepend</th>
<td>.prepend(&#8216;tagName&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить новый узел в&nbsp;начало списка дочерних элементов текущего узла</td>
</tr>
<tr>
<td>.prepend(HTMLElement)</td>
<td>Переместить существующий узел в&nbsp;начало списка дочерних элементов текущего узла</td>
</tr>
<tr>
<th rowspan="2">after</th>
<td>.after(&#8216;tagName&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить новый узел после текущего элемента</td>
</tr>
<tr>
<td>.after(HTMLElement)</td>
<td>Поместить существующий узел после текущего элемента</td>
</tr>
<tr>
<th rowspan="2">before</th>
<td>.before(&#8216;tagName&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить новый узел перед текущим элементом</td>
</tr>
<tr>
<td>.before(HTMLElement)</td>
<td>Поместить существующий узел перед текущим элементом</td>
</tr>
<tr>
<th rowspan="2">appendTo</th>
<td>appendTo(&#8216;id&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить текущий узел в&nbsp;конец списка дочерних элементов узла с&nbsp;указанным идентификатором</td>
</tr>
<tr>
<td>appendTo(HTMLElement)</td>
<td>Добавить текущий узел в&nbsp;конец списка дочерних элементов указанным узла</td>
</tr>
<tr>
<th rowspan="2">prependTo</th>
<td>prependTo(&#8216;id&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить текущий узел в&nbsp;начало списка дочерних элементов узла с&nbsp;указанным идентификатором</td>
</tr>
<tr>
<td>prependTo(HTMLElement)</td>
<td>Добавить текущий узел в&nbsp;начало списка дочерних элементов указанным узла</td>
</tr>
<tr>
<th rowspan="2">insertAfter</th>
<td>insertAfter(&#8216;id&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Поместить текущий узел после элемета с&nbsp;указанным идентификатором</td>
</tr>
<tr>
<td>insertAfter(HTMLElement)</td>
<td>Поместить текущий узел после указанного элемента</td>
</tr>
<tr>
<th rowspan="2">insertBefore</th>
<td>insertBefore(&#8216;id&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Поместить текущий узел перед элеметом с&nbsp;указанным идентификатором</td>
</tr>
<tr>
<td>insertBefore(HTMLElement)</td>
<td>Поместить текущий узел перед указанным элементом</td>
</tr>
<tr>
<th rowspan="2">next</th>
<td>.next()</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Получить следующий элемент</td>
</tr>
<tr>
<td>.next(&#8216;tagName&#8217;)</td>
<td>Получить следующий элемент с&nbsp;указанным именем тега</td>
</tr>
<tr>
<th rowspan="2">prev</th>
<td>.prev()</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Получить предыдущий элемент</td>
</tr>
<tr>
<td>.prev(&#8216;tagName&#8217;)</td>
<td>Получить предыдущий элемент с&nbsp;указанным именем тега</td>
</tr>
<tr>
<th rowspan="2">clone</th>
<td>.clone()</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Получить копию текущего узла вместе с&nbsp;дочерними элементами</td>
</tr>
<tr>
<td>.clone(false)</td>
<td>Получить копию текущего узла без&nbsp;дочерних элементов</td>
</tr>
<tr>
<th rowspan="2">replace</th>
<td>.replace(&#8216;tagName&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Заменить текущий узел новым элементом</td>
</tr>
<tr>
<td>.replace(HTMLElement)</td>
<td>Заменить текущий узел существующим элементом</td>
</tr>
<tr>
<th rowspan="6">wrap</th>
<td>.wrap(&#8216;tagName&#8217;)</td>
<td rowspan="6">{node:HTMLElement}</td>
<td rowspan="2">Обернуть текущий узел новым элементом</td>
</tr>
<tr>
<td>.wrap(&#8216;tagName&#8217;,&nbsp;&#8217;outside&#8217;)</td>
</tr>
<tr>
<td>.wrap(&#8216;tagName&#8217;,&nbsp;&#8217;inside&#8217;)</td>
<td>Обернуть все&nbsp;дочерние узлы текущего элемента новым узлом</td>
</tr>
<tr>
<td>.wrap(HTMLElement)</td>
<td rowspan="2">Обернуть текущий узел существующим элементом</td>
</tr>
<tr>
<td>.wrap(HTMLElement, &#8216;outside&#8217;)</td>
</tr>
<tr>
<td>.wrap(HTMLElement, &#8216;inside&#8217;)</td>
<td>Обернуть все&nbsp;дочерние узлы текущего элемента существующим узлом</td>
</tr>
<tr>
<th>empty</th>
<td>.empty()</td>
<td>{node:HTMLElement}</td>
<td>Удалить все&nbsp;дочерние узлы текущего элемента</td>
</tr>
<tr>
<th>remove</th>
<td>.remove()</td>
<td>null</td>
<td>Удалить текущий элемент вместе с&nbsp;дочерними узлами</td>
</tr>
<tr>
<th rowspan="2">text</th>
<td>.text()</td>
<td>string</td>
<td>Получить свойство innerText текущего элемента</td>
</tr>
<tr>
<td>.text(&#8216;string&#8217;)</td>
<td>{node:HTMLElement}</td>
<td>Удалить все&nbsp;дочерние узлы текущего элемента и&nbsp;поместить в&nbsp;него&nbsp;новый текстовый узел</td>
</tr>
<tr>
<th rowspan="2">html</th>
<td>.html()</td>
<td>string</td>
<td>Получить свойство innerHTML текущего элемента</td>
</tr>
<tr>
<td>.html(&#8216;string&#8217;)</td>
<td>{node:HTMLElement}</td>
<td>Изменить свойство innerText текущего элемента</td>
</tr>
<tr>
<th rowspan="4">exist</th>
<td>.exist()</td>
<td>true|false</td>
<td>Проверить существование узла</td>
</tr>
<tr>
<td>.exist(func)</td>
<td rowspan="3">{node:HTMLElement}</td>
<td>Запустить функцию func, если узел существует</td>
</tr>
<tr>
<td>.exist(func1, func2)</td>
<td>Запустить функцию func1, если узел существует, иначе&nbsp;— запустить func2</td>
</tr>
<tr>
<td>.exist(null, func)</td>
<td>Запустить функцию func, если узел отсутствует</td>
</tr>
<tr>
<th rowspan="3">el</th>
<td>.el()</td>
<td>HTMLElement</td>
<td>Получить прямую ссылку на&nbsp;текущий элемент</td>
</tr>
<tr>
<td>.el(&#8216;id&#8217;)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Заменить текущий элемент узлом с&nbsp;указанным идентификатором</td>
</tr>
<tr>
<td>.el(HTMLElement)</td>
<td>Заменить текущий элемент существующим узлом</td>
</tr>
<tr>
<th rowspan="2">id</th>
<td>.id()</td>
<td>string</td>
<td>Получить идентификатор текущего узла</td>
</tr>
<tr>
<td>.id(&#8216;string&#8217;)</td>
<td>{node:HTMLElement}</td>
<td>Изменить идентификатор текущего узла</td>
</tr>
<tr>
<th rowspan="6">is</th>
<td>.is()</td>
<td rowspan="6">true|false</td>
<td>Проверить существование узла</td>
</tr>
<tr>
<td>.is({attr:&nbsp;&#8217;value&#8217;})</td>
<td rowspan="5">Если хотя&nbsp;бы одно из&nbsp;значений указанных атрибутов не&nbsp;совпадает со&nbsp;значениями соответствующих атрибутов текущего узла, вернуть false, иначе&nbsp;— true</td>
</tr>
<tr>
<td>.is({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…})</td>
</tr>
<tr>
<td>.is(&#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.is({attr:&nbsp;&#8217;value&#8217;}, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.is({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…}, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th rowspan="2">val</th>
<td>.val()</td>
<td>string</td>
<td>Получить свойство value текущего элемента ввода</td>
</tr>
<tr>
<td>.val(&#8216;string&#8217;)</td>
<td>{node:HTMLElement}</td>
<td>Изменить свойство value текущего элемента ввода</td>
</tr>
<tr>
<th rowspan="3">enabled</th>
<td>.enabled()</td>
<td>true|false</td>
<td>Проверить активность текущего элемента ввода</td>
</tr>
<tr>
<td>.enabled(true)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Включить текущий элемент ввода</td>
</tr>
<tr>
<td>.enabled(false)</td>
<td>Выключить текущий элемент ввода</td>
</tr>
<tr>
<th rowspan="6">attr</th>
<td>.attr(&#8216;attr&#8217;)</td>
<td rowspan="2">*</td>
<td rowspan="2">Получить значение указанного атрибута текущего узла</td>
</tr>
<tr>
<td>.attr(['attr'])</td>
</tr>
<tr>
<td>.attr(&#8216;attr1&nbsp;attr2&nbsp;…&#8217;)</td>
<td rowspan="2">array</td>
<td rowspan="2">Получить массив значений указанных атрибутов текущего узла</td>
</tr>
<tr>
<td>.attr(['attr1',&nbsp;'attr2',&nbsp;…])</td>
</tr>
<tr>
<td>.attr({attr:&nbsp;&#8217;value&#8217;})</td>
<td rowspan="2">{node:HTMLElement}</td>
<td rowspan="2">Изменить значения указанных атрибутов текущего узла</td>
</tr>
<tr>
<td>.attr({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…})</td>
</tr>
<tr>
<th rowspan="4">removeAttr</th>
<td>.removeAttr(&#8216;attr&#8217;)</td>
<td rowspan="4">{node:HTMLElement}</td>
<td rowspan="4">Удалить значения указанных атрибутов текущего узла</td>
</tr>
<tr>
<td>.removeAttr(['attr'])</td>
</tr>
<tr>
<td>.removeAttr(&#8216;attr1&nbsp;attr2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.removeAttr(['attr1',&nbsp;'attr2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="10">child</th>
<td>.child()</td>
<td rowspan="10">{items:ElementsList}</td>
<td>Получить все дочерние элементы текущего узла</td>
</tr>
<tr>
<td>.child(&#8216;tagName&#8217;)</td>
<td rowspan="4">Получить все&nbsp;дочерние элементы  текущего узла с&nbsp;указанными именами тегов</td>
</tr>
<tr>
<td>.child(&#8216;tagName1&nbsp;tagName2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.child(['tagName'])</td>
</tr>
<tr>
<td>.child(['tagName1',&nbsp;'tagName2',&nbsp;…])</td>
</tr>
<tr>
<td>.child(true)</td>
<td>Получить все&nbsp;дочерние элементы текущего узла на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.child(&#8216;tagName&#8217;, true)</td>
<td rowspan="4">Получить все&nbsp;дочерние элементы текущего узла на&nbsp;всех&nbsp;уровнях вложенности с&nbsp;указанными именами тегов</td>
</tr>
<tr>
<td>.child(&#8216;tagName1&nbsp;tagName2&nbsp;…&#8217;, true)</td>
</tr>
<tr>
<td>.child(['tagName'], true)</td>
</tr>
<tr>
<td>.child(['tagName1',&nbsp;'tagName2',&nbsp;…], true)</td>
</tr>
<tr>
<th rowspan="12">find</th>
<td>.find(&#8216;attr&#8217;)</td>
<td rowspan="12">{items:ElementsList}</td>
<td rowspan="12">Получить все&nbsp;дочерние элементы текущего узла, у&nbsp;которых совпадают все&nbsp;указанные атрибуты; поиск элементов ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.find(['attr'])</td>
</tr>
<tr>
<td>.find(&#8216;attr1&nbsp;attr2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.find(['attr1',&nbsp;'attr2'])</td>
</tr>
<tr>
<td>.find({attr:&nbsp;&#8217;value&#8217;})</td>
</tr>
<tr>
<td>.find({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…})</td>
</tr>
<tr>
<td>.find(&#8216;attr&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.find(['attr'], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.find(&#8216;attr1&nbsp;attr2&nbsp;…&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.find(['attr1',&nbsp;'attr2',&nbsp;…], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.find({attr:&nbsp;&#8217;value&#8217;}, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.find({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…}, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th rowspan="8">findAttr</th>
<td>.findAttr(&#8216;attr&#8217;,&nbsp;&#8217;value&#8217;)</td>
<td rowspan="8">{items:ElementsList}</td>
<td rowspan="8">Получить все&nbsp;дочерние элементы текущего узла, в&nbsp;значении указанного атрибута которых встречается хотя&nbsp;бы одно из&nbsp;указанных значений; поиск значений ведется по&nbsp;границе слов (/\bValue\b/); поиск элементов ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;, ['value'])</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;,&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;, ['value1',&nbsp;'value2',&nbsp;…])</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;,&nbsp;&#8217;value&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;, ['value'], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;,&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.findAttr(&#8216;attr&#8217;, ['value1',&nbsp;'value2',&nbsp;…], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th rowspan="8">findClass</th>
<td>.findClass(&#8216;class&#8217;)</td>
<td rowspan="8">{items:ElementsList}</td>
<td rowspan="8">Получить все&nbsp;дочерние элементы текущего узла, в&nbsp;атрибуте className которых встречается хотя&nbsp;бы один из&nbsp;указанных CSS-классов; поиск элементов ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.findClass(['class'])</td>
</tr>
<tr>
<td>.findClass(&#8216;class1&nbsp;class2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.findClass(['class1',&nbsp;'class2',&nbsp;…])</td>
</tr>
<tr>
<td>.findClass(&#8216;class&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.findClass(['class'], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.findClass(&#8216;class1&nbsp;class2&nbsp;…&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.findClass(['class1',&nbsp;'class2',&nbsp;…], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th>serialize</th>
<td>.serialize()</td>
<td>string</td>
<td>Получить HTML-код текущего элемента вместе с&nbsp;кодом самого&nbsp;элемента; идентично свойству outerHTML в&nbsp;IE</td>
</tr>
<tr>
<th colspan="4" class="separate">CSS</th>
</tr>
<tr>
<th rowspan="6">css</th>
<td>.css(&#8216;property&#8217;)</td>
<td rowspan="2">string</td>
<td rowspan="2">Получить значение указанного CSS-свойства текущего элемента</td>
</tr>
<tr>
<td>.css(['property'])</td>
</tr>
<tr>
<td>.css(&#8216;property1&nbsp;property2&nbsp;…&#8217;)</td>
<td rowspan="2">array</td>
<td rowspan="2">Получить массив значений указанных CSS-свойств текущего элемента</td>
</tr>
<tr>
<td>.css(['property1',&nbsp;'property2',&nbsp;…])</td>
</tr>
<tr>
<td>.css({property:&nbsp;&#8217;value&#8217;})</td>
<td rowspan="2">{node:HTMLElement}</td>
<td rowspan="2">Изменить указанные CSS-свойства текущего элемента</td>
</tr>
<tr>
<td>.css({property1:&nbsp;&#8217;value1&#8242;, property2:&nbsp;&#8217;value2&#8242;,&nbsp;…})</td>
</tr>
<tr>
<th>hide</th>
<td>.hide()</td>
<td>{node:HTMLElement}</td>
<td>Скрыть текущий элемент</td>
</tr>
<tr>
<th rowspan="2">show</th>
<td>.show()</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Сделать текущий элемент видимым</td>
</tr>
<tr>
<td>.show(&#8216;displayType&#8217;)</td>
<td>Сделать текущий элемент видимым и&nbsp;присвоить CSS-свойству display указанное значение (может понадобится для&nbsp;отображения списков, строчных элементов и&nbsp;др.)</td>
</tr>
<tr>
<th rowspan="2">toggle</th>
<td>.toggle()</td>
<td rowspan="2">{node:HTMLElement}</td>
<td rowspan="2">Скрыть текущий элемент, если он&nbsp;отображается, иначе&nbsp;— сделать его&nbsp;видимым</td>
</tr>
<tr>
<td>.toggle(&#8216;displayType&#8217;)</td>
</tr>
<tr>
<th>visible</th>
<td>.visible()</td>
<td>true|false</td>
<td>Проверить отображается ли&nbsp;текущий элемент</td>
</tr>
<tr>
<th rowspan="2">opacity</th>
<td>.opacity()</td>
<td>number</td>
<td>Получить уровень непрозрачности текущего элемента</td>
</tr>
<tr>
<td>.opacity(0.0—1.0)</td>
<td>{node:HTMLElement}</td>
<td>Изменить уровень непрозрачности текущего элемента</td>
</tr>
<tr>
<th rowspan="5">hasClass</th>
<td>.hasClass()</td>
<td rowspan="5">true|false</td>
<td rowspan="5">Проверить наличие CSS-классов текущего элемента</td>
</tr>
<tr>
<td>.hasClass(&#8216;className&#8217;)</td>
</tr>
<tr>
<td>.hasClass(['className'])</td>
</tr>
<tr>
<td>.hasClass(&#8216;className1&nbsp;className2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.hasClass(['className1',&nbsp;'className2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="4">addClass</th>
<td>.addClass(&#8216;className&#8217;)</td>
<td rowspan="4">{node:HTMLElement}</td>
<td rowspan="4">Добавить CSS-классы текущему элементу</td>
</tr>
<tr>
<td>.addClass(['className'])</td>
</tr>
<tr>
<td>.addClass(&#8216;className1&nbsp;className2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.addClass(['className1',&nbsp;'className2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="5">removeClass</th>
<td>.removeClass(&#8216;className&#8217;)</td>
<td rowspan="5">{node:HTMLElement}</td>
<td rowspan="5">Удалить CSS-классы текущему элементу</td>
</tr>
<tr>
<td>.removeClass(&#8216;className&#8217;)</td>
</tr>
<tr>
<td>.removeClass(['className'])</td>
</tr>
<tr>
<td>.removeClass(&#8216;className1&nbsp;className2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.removeClass(['className1',&nbsp;'className2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="8">toggleClass</th>
<td>.toggleClass(&#8216;className&#8217;)</td>
<td rowspan="8">{node:HTMLElement}</td>
<td rowspan="4">Удалить имеющиеся CSS-классы и&nbsp;добавить недостающие</td>
</tr>
<tr>
<td>.toggleClass(['className'])</td>
</tr>
<tr>
<td>.toggleClass(&#8216;className1&nbsp;className2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.toggleClass(['className1',&nbsp;'className2',&nbsp;…])</td>
</tr>
<tr>
<td>.toggleClass(&#8216;className1&#8242;,&nbsp;&#8217;className2&#8242;)</td>
<td rowspan="2">Заменить CSS-класс с именем className1 на className2</td>
</tr>
<tr>
<td>.toggleClass(['className1'], ['className2'])</td>
</tr>
<tr>
<td>.toggleClass(&#8216;className1&nbsp;className2&nbsp;…&#8217;, &#8216;className3&nbsp;className4&nbsp;…&#8217;)</td>
<td rowspan="2">Последовательно заменить className1 на&nbsp;className3, className2 на&nbsp;className4</td>
</tr>
<tr>
<td>.toggleClass(['className1',&nbsp;'className2',&nbsp;…], ['className3',&nbsp;'className4',&nbsp;…])</td>
</tr>
<tr>
<th colspan="4" class="separate">Events (события)</th>
</tr>
<tr>
<th rowspan="2">useDefault</th>
<td>.useDefault(&#8216;eventType&#8217;, false)</td>
<td rowspan="2">{node:HTMLElement}</td>
<td>Добавить в&nbsp;обработчик указанного события для&nbsp;текущего элемента функцию, предотвращающую стандартное действие браузера</td>
</tr>
<tr>
<td>.useDefault(&#8216;eventType&#8217;, true)</td>
<td>Удалить из&nbsp;обработчика указанного события для&nbsp;текущего элемента функцию, предотвращающую стандартное действие браузера</td>
</tr>
<tr>
<th rowspan="3">bind</th>
<td>.bind(&#8216;eventType&#8217;, function)</td>
<td rowspan="3">{node:HTMLElement}</td>
<td>Добавить в&nbsp;обработчик указанного события для&nbsp;текущего элемента функцию</td>
</tr>
<tr>
<td>.bind(&#8216;eventType&#8217;, function, false)</td>
<td>Добавить в&nbsp;обработчик указанного события для&nbsp;текущего элемента функцию и&nbsp;автоматически выполнить .useDefault(&#8216;eventType&#8217;, false)</td>
</tr>
<tr>
<td>.bind(&#8216;eventType&#8217;, function, true)</td>
<td>Добавить в&nbsp;обработчик указанного события для&nbsp;текущего элемента функцию и&nbsp;автоматически выполнить .useDefault(&#8216;eventType&#8217;, true)</td>
</tr>
<tr>
<th rowspan="3">unbind</th>
<td>.unbind(&#8216;eventType&#8217;, function)</td>
<td rowspan="3">{node:HTMLElement}</td>
<td>Удалить из обработчика указанного события для текущего элемента функцию</td>
</tr>
<tr>
<td>.unbind(&#8216;eventType&#8217;, function, false)</td>
<td>Удалить из&nbsp;обработчика указанного события для&nbsp;текущего элемента функцию и&nbsp;автоматически выполнить .useDefault(&#8216;eventType&#8217;, false)</td>
</tr>
<tr>
<td>.unbind(&#8216;eventType&#8217;, function, true)</td>
<td>Удалить из&nbsp;обработчика указанного события для&nbsp;текущего элемента функцию и&nbsp;автоматически выполнить .useDefault(&#8216;eventType&#8217;, true)</td>
</tr>
<tr>
<th colspan="4" class="separate">AJAX (Необходимо подключить AJAX-модуль)</th>
</tr>
<tr>
<th>load</th>
<td><a href="#js-core-methods-ajax">Смотрите в&nbsp;соответствующем разделе</a></td>
<td>{node:HTMLElement}</td>
<td>Заменить содержимое текущего узла на&nbsp;данные, полученные с&nbsp;помощью AJAX-запроса</td>
</tr>
</tbody>
</table>
<h4 id="js-core-methods-core">Методы и&nbsp;атрибуты объекта core или&nbsp;$</h4>
<p>Как&nbsp;бы&nbsp;странно это&nbsp;не&nbsp;звучало, но&nbsp;в&nbsp;JavaScript такое&nbsp;возможно, любая&nbsp;функция одновременно является объектом и&nbsp;может изменть свои&nbsp;атрибуты и&nbsp;методы. Использовать их&nbsp;можно следующим образом:</p>
<pre><code class="javascript">$.ready(func) // выполнить функцию по событию &quot;DOMContentLoaded&quot;
$.t('h1 h2 h3 h4 h5 h6') // получить все заголовки в документе
$.c('selected') // получить все элементы с классом &quot;selected&quot;</code></pre>
<p>Подробнее обо&nbsp;всех&nbsp;методах объекта <code>core</code> или&nbsp;<code>$</code> далее&nbsp;в&nbsp;таблице.</p>
<table style="font:11px/18px Consolas, monospace;width:668px;table-layout:fixed;border:2px solid #22689c" summary="js-core methods">
<colgroup>
<col style="width:70px;background:#f5f5f5;" />
<col style="width:278" />
<col style="width:120px;" />
<col style="width:200px;" /></colgroup>
<thead>
<tr style="background:#22689c;color:#fff;font-size:12px;">
<th>Метод</th>
<th>Варианты вызова</th>
<th>Возвращаемое значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<th colspan="4" class="separate">Основные</th>
</tr>
<tr>
<th>ready</th>
<td>.ready(func)</td>
<td>undefined</td>
<td>Выполнить функцию func по&nbsp;событию DOMContentLoaded</td>
</tr>
<tr>
<th>context</th>
<td>.context(func, obj)</td>
<td>function</td>
<td>Добавить специальную обертку для&nbsp;функции func, чтобы она&nbsp;всегда выполнялась в&nbsp;контексте объекта obj</td>
</tr>
<tr>
<th>n</th>
<td>.n(&#8216;tagName&#8217;)</td>
<td>{node:HTMLElement}</td>
<td>Создать новый элемент</td>
</tr>
<tr>
<th rowspan="5">t</th>
<td>.t()</td>
<td rowspan="5">{items:ElementsList}</td>
<td>Получить список всех&nbsp;тегов</td>
</tr>
<tr>
<td>.t(&#8216;tagName&#8217;)</td>
<td rowspan="4">Получить список указанных тегов</td>
</tr>
<tr>
<td>.t(['tagName'])</td>
</tr>
<tr>
<td>.t(&#8216;tagName1&nbsp;tagName2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.t(['tagName1', 'tagName2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="8">c</th>
<td>.c(&#8216;class&#8217;)</td>
<td rowspan="8">{items:ElementsList}</td>
<td rowspan="8">Получить все&nbsp;элементы, в&nbsp;атрибуте className которых встречается хотя&nbsp;бы один из&nbsp;указанных CSS-классов; поиск элементов ведется во&nbsp;всем&nbsp;документе</td>
</tr>
<tr>
<td>.c(['class'])</td>
</tr>
<tr>
<td>.c(&#8216;class1&nbsp;class2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.c(['class1',&nbsp;'class2',&nbsp;…])</td>
</tr>
<tr>
<td>.c(&#8216;class&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.c(['class'], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.c(&#8216;class1&nbsp;class2&nbsp;…&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.c(['class1',&nbsp;'class2',&nbsp;…], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th rowspan="12">a</th>
<td>.a(&#8216;attr&#8217;)</td>
<td rowspan="12">{items:ElementsList}</td>
<td rowspan="12">Получить все&nbsp;элементы, у&nbsp;которых совпадают все&nbsp;указанные атрибуты; поиск элементов ведется во&nbsp;всем&nbsp;документе</td>
</tr>
<tr>
<td>.a(['attr'])</td>
</tr>
<tr>
<td>.a(&#8216;attr1&nbsp;attr2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.a(['attr1',&nbsp;'attr2'])</td>
</tr>
<tr>
<td>.a({attr:&nbsp;&#8217;value&#8217;})</td>
</tr>
<tr>
<td>.a({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…})</td>
</tr>
<tr>
<td>.a(&#8216;attr&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.a(['attr'], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.a(&#8216;attr1&nbsp;attr2&nbsp;…&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.a(['attr1',&nbsp;'attr2',&nbsp;…], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.a({attr:&nbsp;&#8217;value&#8217;}, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.a({attr1:&nbsp;&#8217;value1&#8242;, attr2:&nbsp;&#8217;value2&#8242;,&nbsp;…}, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th rowspan="8">f</th>
<td>.f(&#8216;attr&#8217;,&nbsp;&#8217;value&#8217;)</td>
<td rowspan="8">{items:ElementsList}</td>
<td rowspan="8">Получить все&nbsp;элементы, в&nbsp;значении указанного атрибута которых встречается хотя&nbsp;бы одно из&nbsp;указанных значений; поиск значений ведется по&nbsp;границе слов (/\bValue\b/); поиск элементов ведется во&nbsp;всем документе</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;, ['value'])</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;,&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;, ['value1',&nbsp;'value2',&nbsp;…])</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;,&nbsp;&#8217;value&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;, ['value'], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;,&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;,&nbsp;&#8217;tagName&#8217;)</td>
</tr>
<tr>
<td>.f(&#8216;attr&#8217;, ['value1',&nbsp;'value2',&nbsp;…], &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th>makeArray</th>
<td>.makeArray(list)</td>
<td>array</td>
<td>Преобразовать список в&nbsp;массив</td>
</tr>
<tr>
<th rowspan="4">forEach</th>
<td>.forEach(array, function(element,&nbsp;index,&nbsp;array)&nbsp;{…})</td>
<td rowspan="2">array</td>
<td rowspan="4">Последовательно выполнить функцию для&nbsp;каждого элемента массива или&nbsp;объекта; чтобы&nbsp;прервать цикл, функция должна вернуть false</td>
</tr>
<tr>
<td>.forEach(array, function(element,&nbsp;index,&nbsp;array)&nbsp;{…}, context)</td>
</tr>
<tr>
<td>.forEach(object, function(element,&nbsp;index,&nbsp;array)&nbsp;{…})</td>
<td rowspan="2">object</td>
</tr>
<tr>
<td>.forEach(object, function(key,&nbsp;value,&nbsp;object)&nbsp;{…}, context)</td>
</tr>
<tr>
<th>extend</th>
<td>.extend(object, hash)</td>
<td>object</td>
<td>Расширить объект object методами и&nbsp;атрибутами объекта hash; имеющиеся атрибуты и&nbsp;методы перезаписываются</td>
</tr>
<tr>
<th rowspan="6">trim</th>
<td>.trim(&#8216;string&#8217;)</td>
<td rowspan="6">string</td>
<td rowspan="2">Удалить все&nbsp;пробельные символы в&nbsp;начале и&nbsp;конце строки</td>
</tr>
<tr>
<td>.trim.both(&#8216;string&#8217;)</td>
</tr>
<tr>
<td>.trim.left(&#8216;string&#8217;)</td>
<td>Удалить все&nbsp;пробельные символы в&nbsp;начале строки</td>
</tr>
<tr>
<td>.trim.right(&#8216;string&#8217;)</td>
<td>Удалить все&nbsp;пробельные символы в&nbsp;конце строки</td>
</tr>
<tr>
<td>.trim.spaces(&#8216;string&#8217;)</td>
<td>Удалить все&nbsp;повторяющиеся пробельные символы</td>
</tr>
<tr>
<td>.trim.all(&#8216;string&#8217;)</td>
<td>Выполнить все&nbsp;виды преобразований</td>
</tr>
<tr>
<th rowspan="6">list</th>
<td>.list(NodeList)</td>
<td rowspan="6">{items:ElementsList}</td>
<td rowspan="2">Получить список элементов с&nbsp;nodeType==1</td>
</tr>
<tr>
<td>new $.list(NodeList)</td>
</tr>
<tr>
<td>.list(NodeList, false)</td>
<td rowspan="2">Получить список элементов; используйте этот&nbsp;вариант для&nbsp;увеличения производительности в&nbsp;случае, если&nbsp;уверены, что&nbsp;в&nbsp;коллекции нет&nbsp;текстовых и&nbsp;других узлов, кроме элементов</td>
</tr>
<tr>
<td>new $.list(NodeList, false)</td>
</tr>
<tr>
<td>.list(NodeList, function(index){…})</td>
<td rowspan="2">Получить список элементов используя функцию-фильтр; если&nbsp;функция возвращает true, элемент включается в&nbsp;коллекцию</td>
</tr>
<tr>
<td>new $.list(NodeList, function(index){…})</td>
</tr>
<tr>
<th rowspan="4">timer</th>
<td>.timer(timeout, func)</td>
<td rowspan="4">object</td>
<td rowspan="4">Получить объект &#171;timer&#187;; методы этого&nbsp;объекта приведены в&nbsp;отдельной таблице</td>
</tr>
<tr>
<td>new $.timer(timeout, func)</td>
</tr>
<tr>
<td>.timer(timeout, func, [arguments])</td>
</tr>
<tr>
<td>new $.timer(timeout, func, [arguments])</td>
</tr>
<tr>
<th rowspan="2">event</th>
<td>.event(eventObject)</td>
<td rowspan="2">{object:eventObject}</td>
<td rowspan="2">Получить объект-событие; методы этого&nbsp;объекта приведены в&nbsp;отдельной таблице</td>
</tr>
<tr>
<td>new $.event(eventObject)</td>
</tr>
<tr>
<th rowspan="2">ajax</th>
<td>.ajax()</td>
<td rowspan="2">{xhr:XMLHttpRequest}</td>
<td rowspan="2">Получить объект для&nbsp;работы с&nbsp;AJAX; методы этого&nbsp;объекта приведены в&nbsp;отдельной таблице;</td>
</tr>
<tr>
<td>new $.ajax()</td>
</tr>
<tr>
<th colspan="4" class="separate">Вспомогательные</th>
</tr>
<tr>
<th>ie</th>
<td>.ie</td>
<td>number|undefined</td>
<td>Номер версии Internet&nbsp;Explorer</td>
</tr>
<tr>
<th>cache</th>
<td>.cache</td>
<td>object</td>
<td>Кэш элементов по&nbsp;идентификаторам</td>
</tr>
<tr>
<th>clear</th>
<td>.clear(HTMLElement)</td>
<td>HTMLElement</td>
<td>Очищает кэш</td>
</tr>
<tr>
<th rowspan="2">id</th>
<td>.id(&#8216;string&#8217;)</td>
<td rowspan="2">HTMLElement</td>
<td rowspan="2">Получить элемент по&nbsp;идентификатору используя кэш</td>
</tr>
<tr>
<td>.id(HTMLElement)</td>
</tr>
<tr>
<th rowspan="4">tag</th>
<td>.tag({})</td>
<td rowspan="4">DOMNodeList</td>
<td>Получить коллекцию всех&nbsp;элементов</td>
</tr>
<tr>
<td>.tag({tag:&nbsp;&#8217;tagName&#8217;})</td>
<td>Получить коллекцию всех&nbsp;элементов с&nbsp;указанным именем тега</td>
</tr>
<tr>
<td>.tag({node:&nbsp;HTMLElement})</td>
<td>Получить коллекцию дочерних элементов указанного узла</td>
</tr>
<tr>
<td>.tag({tag:&nbsp;&#8217;tagName&#8217;, node:&nbsp;HTMLElement})</td>
<td>Получить коллекцию дочерних элементов с&nbsp;указанным именем тега</td>
</tr>
<tr>
<th rowspan="10">tags</th>
<td>.tags({})</td>
<td rowspan="10">array</td>
<td rowspan="5">Получить список элементов; поиск ведется во&nbsp;всем&nbsp;документе</td>
</tr>
<tr>
<td>.tags({tag:&nbsp;&#8217;tagName&#8217;})</td>
</tr>
<tr>
<td>.tags({tag:&nbsp;['tagName']})</td>
</tr>
<tr>
<td>.tags({tag:&nbsp;&#8217;tagName1&nbsp;tagName2&nbsp;…&#8217;})</td>
</tr>
<tr>
<td>.tags({tag:&nbsp;['tagName1', 'tagName2',&nbsp;…])</td>
</tr>
<tr>
<td>.tags({node:&nbsp;HTMLElement})</td>
<td rowspan="5">Получить список дочерних элементов указанного узла; поиск ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.tags({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;})</td>
</tr>
<tr>
<td>.tags({node:&nbsp;HTMLElement, tag:&nbsp;['tagName']})</td>
</tr>
<tr>
<td>.tags({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName1&nbsp;tagName2&nbsp;…&#8217;})</td>
</tr>
<tr>
<td>.tags({node:&nbsp;HTMLElement, tag:&nbsp;['tagName1', 'tagName2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="5">child</th>
<td>.child()</td>
<td rowspan="5">array</td>
<td>Получить все дочерние узлы</td>
</tr>
<tr>
<td>.child(HTMLElement, &#8216;tagName&#8217;)</td>
<td rowspan="4">Получить все&nbsp;дочерние узлы с&nbsp;указанными именами тегов</td>
</tr>
<tr>
<td>.child(HTMLElement, ['tagName'])</td>
</tr>
<tr>
<td>.child(HTMLElement, &#8216;tagName1&nbsp;tagName2&nbsp;…&#8217;)</td>
</tr>
<tr>
<td>.child(HTMLElement, ['tagName', 'tagName2',&nbsp;…])</td>
</tr>
<tr>
<th rowspan="2">create</th>
<td>.create(&#8216;tagName&#8217;)</td>
<td rowspan="2">HTMLElement</td>
<td rowspan="2">Создать новый элемент</td>
</tr>
<tr>
<td>.create(HTMLElement)</td>
</tr>
<tr>
<th rowspan="2">insert</th>
<td>.insert(parentNode, thisNode, beforeNode)</td>
<td rowspan="2">thisNode (HTMLElement)</td>
<td>Вставить элемент thisNode в&nbsp;список дочерних элементов узла parentNode перед&nbsp;элементом beforeNode</td>
</tr>
<tr>
<td>.insert(parentNode, &#8216;tagName&#8217;, beforeNode)</td>
<td>Вставить новый узел в&nbsp;список дочерних элементов узла parentNode перед&nbsp;элементом beforeNode</td>
</tr>
<tr>
<th rowspan="4">sibling</th>
<td>.sibling(HTMLElement, &#8216;nextSibling&#8217;)</td>
<td rowspan="4">HTMLElement</td>
<td rowspan="2">Найти соседний элемент</td>
</tr>
<tr>
<td>.sibling(HTMLElement, &#8216;previousSibling&#8217;)</td>
</tr>
<tr>
<td>.sibling(HTMLElement, &#8216;nextSibling&#8217;, &#8216;tagName&#8217;)</td>
<td rowspan="2">Найти соседний элемент c&nbsp;указанным именем тега</td>
</tr>
<tr>
<td>.sibling(HTMLElement, &#8216;previousSibling&#8217;, &#8216;tagName&#8217;)</td>
</tr>
<tr>
<th>bind</th>
<td>.bind(HTMLElement, &#8216;eventType&#8217;, func)</td>
<td>undefined</td>
<td>Добавить обработчик события</td>
</tr>
<tr>
<th>unbind</th>
<td>.unbind(HTMLElement, &#8216;eventType&#8217;, func)</td>
<td>undefined</td>
<td>Удалить обработчик события</td>
</tr>
<tr>
<th>css</th>
<td>.css(HTMLElement, &#8216;CSS-property&#8217;)</td>
<td>string</td>
<td>Получить значение CSS-свойства</td>
</tr>
<tr>
<th>inStr</th>
<td>.inStr(&#8216;string&#8217;, &#8216;substring&#8217;)</td>
<td>number</td>
<td>Найти строку substring в&nbsp;строке string по&nbsp;шаблону /\bsubstring\b/</td>
</tr>
<tr>
<th rowspan="2">toArray</th>
<td>.toArray(&#8216;string&#8217;)</td>
<td rowspan="2">array</td>
<td rowspan="2">Разбить строку на&nbsp;элементы по&nbsp;шаблону /\s+/</td>
</tr>
<tr>
<td>.toArray(array)</td>
</tr>
<tr>
<th rowspan="10">attr</th>
<td>.attr({attr:&nbsp;['attr']})</td>
<td rowspan="8">array</td>
<td rowspan="4">Получить список элементов с&nbsp;указанными атрибутами; поиск ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.attr({attr:&nbsp;['attr1', 'attr2',&nbsp;…]})</td>
</tr>
<tr>
<td>.attr({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr']})</td>
</tr>
<tr>
<td>.attr({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…]})</td>
</tr>
<tr>
<td>.attr({node:&nbsp;HTMLElement, attr:&nbsp;['attr']})</td>
<td rowspan="4">Получить список дочерних элементов с&nbsp;указанными атрибутами; поиск ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.attr({node:&nbsp;HTMLElement, attr:&nbsp;['attr1', 'attr2',&nbsp;…]})</td>
</tr>
<tr>
<td>.attr({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr']})</td>
</tr>
<tr>
<td>.attr({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…]})</td>
</tr>
<tr>
<td>.attr({node:&nbsp;HTMLElement, attr:&nbsp;{attr:&nbsp;&#8217;value&#8217;}})</td>
<td rowspan="2">undefined</td>
<td rowspan="2">Изменить значения атрибутов указанного узла</td>
</tr>
<tr>
<td>.attr({node:&nbsp;HTMLElement, attr:&nbsp;{attr1:&nbsp;&#8217;value1&#8242;, &#8216;attr2&#8242;:&nbsp;&#8217;value2&#8242;,&nbsp;…}})</td>
</tr>
<tr>
<th rowspan="5">value</th>
<td>.value({attr:&nbsp;{attr:&nbsp;&#8217;value&#8217;}})</td>
<td rowspan="5">array</td>
<td rowspan="3">Получить элементы, у&nbsp;которых совпадают все&nbsp;указанные атрибуты; поиск ведется по&nbsp;всему&nbsp;документу</td>
</tr>
<tr>
<td>.value({attr:&nbsp;{attr1:&nbsp;&#8217;value1&#8242;, &#8216;attr2&#8242;:&nbsp;&#8217;value2&#8242;,&nbsp;…}})</td>
</tr>
<tr>
<td>.value({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;{attr1:&nbsp;&#8217;value1&#8242;, &#8216;attr2&#8242;:&nbsp;&#8217;value2&#8242;,&nbsp;…}})</td>
</tr>
<tr>
<td>.value({node:&nbsp;HTMLElement, attr:&nbsp;{attr1:&nbsp;&#8217;value1&#8242;, &#8216;attr2&#8242;:&nbsp;&#8217;value2&#8242;,&nbsp;…}})</td>
<td rowspan="2">Получить все&nbsp;дочерние элементы, у&nbsp;которых совпадают все&nbsp;указанные атрибуты; поиск ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.value({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;{attr1:&nbsp;&#8217;value1&#8242;, &#8216;attr2&#8242;:&nbsp;&#8217;value2&#8242;,&nbsp;…}})</td>
</tr>
<tr>
<th rowspan="32">values</th>
<td>.values({attr:&nbsp;['attr'], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
<td rowspan="32">array</td>
<td rowspan="32">Получить все&nbsp;элементы, в&nbsp;значении указанного атрибута которых встречается хотя&nbsp;бы одно из&nbsp;указанных значений; поиск значений ведется по&nbsp;границе слов (/\bValue\b/); поиск элементов ведется на&nbsp;всех&nbsp;уровнях вложенности</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr'], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;string&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr'], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['string'], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr'], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr'], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;&#8217;value1&nbsp;value2&nbsp;…&#8217;, attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr'], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr'], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr'], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
<tr>
<td>.values({node:&nbsp;HTMLElement, tag:&nbsp;&#8217;tagName&#8217;, attr:&nbsp;['attr1', 'attr2',&nbsp;…], value:&nbsp;['value1', 'value2',&nbsp;…], attr:&nbsp;&#8217;string&#8217;})</td>
</tr>
</tbody>
</table>
<h4 id="js-core-methods-timer">Методы работы с таймером</h4>
<p>В&nbsp;js-core вводит специальный объект для&nbsp;более удобного использования встроенных методов <code>setTimeout</code> и&nbsp;<code>setInterval</code>. Получить этот&nbsp;объект можно при&nbsp;помощи функции конструктора&nbsp;<code>$.timer(…)</code> или&nbsp;<code>core.timer(…)</code>:</p>
<pre><code class="javascript">// повторить выполнение функции 5 раз с задержкой 100 мс
$.timer(100, function() {…}).repeat(5)

// выполнять функцию с задержкой 50 мс
core.timer(50, function() {…}).start()</code></pre>
<p>Подробнее, об&nbsp;остальных методах, в&nbsp;таблице&nbsp;ниже:</p>
<table style="font:11px/18px Consolas, monospace;width:668px;table-layout:fixed;border:2px solid #22689c" summary="js-core methods">
<colgroup>
<col style="width:70px;background:#f5f5f5;" />
<col style="width:278" />
<col style="width:120px;" />
<col style="width:200px;" /></colgroup>
<thead>
<tr style="background:#22689c;color:#fff;font-size:12px;">
<th>Метод</th>
<th>Варианты вызова</th>
<th>Возвращаемое значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<th>start</th>
<td>.start()</td>
<td>object</td>
<td>Запустить таймер</td>
</tr>
<tr>
<th>stop</th>
<td>.stop()</td>
<td>object</td>
<td>Остановить таймер</td>
</tr>
<tr>
<th rowspan="3">repeat</th>
<td>.repeat(amount)</td>
<td rowspan="3">object</td>
<td>Запустить таймер и&nbsp;выполнить указанное количество раз</td>
</tr>
<tr>
<td>.repeat(amount, func)</td>
<td rowspan="2">Запустить таймер и&nbsp;выполнить указанное количество раз; по&nbsp;окончании запустить callback-функцию func</td>
</tr>
<tr>
<td>.repeat(amount, func, [arguments])</td>
</tr>
</tbody>
</table>
<h4 id="js-core-methods-list">Методы работы со&nbsp;списками узлов</h4>
<p>Все&nbsp;методы фреймворка для&nbsp;работы со&nbsp;списками узлов доступны через&nbsp;прототип функции <code>$.list(…)</code>, которая&nbsp;может&nbsp;быть использована в&nbsp;качестве конструктора любым из&nbsp;представленных ниже&nbsp;способов:</p>
<pre><code class="javascript">var list = $.list(document.getElementsByTagName('div'))

// или
var list = new $.list(document.getElementsByTagName('div'))

// или
var list = core.list(document.getElementsByTagName('div'))

// или
var list = new core.list(document.getElementsByTagName('div'))</code></pre>
<p>Некоторые функции фреймворка автоматически создают подобные списки, например:</p>
<pre><code class="javascript">var list = $.t('div');</code></pre>
<p>В&nbsp;результате в&nbsp;переменной <var>list</var> будет ссылка на&nbsp;объект, содержащий список узлов, над&nbsp;которым можно&nbsp;произвонить действия, например, добавим всем&nbsp;найденным элементам CSS-класс <var>highlight</var>:</p>
<pre><code class="javascript">list.each('addClass', 'highlight');</code></pre>
<p>Подробнее обо&nbsp;всех&nbsp;методах функции-конструктора <code>$.list(…)</code> далее&nbsp;в&nbsp;таблице:</p>
<table style="font:11px/18px Consolas, monospace;width:668px;table-layout:fixed;border:2px solid #22689c" summary="js-core methods">
<colgroup>
<col style="width:70px;background:#f5f5f5;" />
<col style="width:278" />
<col style="width:120px;" />
<col style="width:200px;" /></colgroup>
<thead>
<tr style="background:#22689c;color:#fff;font-size:12px;">
<th>Метод</th>
<th>Варианты вызова</th>
<th>Возвращаемое значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<th>items</th>
<td>.items</td>
<td>ElementsList</td>
<td>Получить прямую ссылку на&nbsp;список или&nbsp;массив узлов</td>
</tr>
<tr>
<th>item</th>
<td>.item(number)</td>
<td>{node:HTMLElement}</td>
<td>Получить элемент списка с&nbsp;указанным номером</td>
</tr>
<tr>
<th>last</th>
<td>.last()</td>
<td>{node:HTMLElement}</td>
<td>Получить последний элемент списка</td>
</tr>
<tr>
<th>size</th>
<td>.size()</td>
<td>number</td>
<td>Получить количество элементов в&nbsp;списке</td>
</tr>
<tr>
<th rowspan="2">each</th>
<td>.each(function(HTMLElement, index, ElementsList){…})</td>
<td rowspan="2">{items:ElementsList}</td>
<td>Последовательно выполнить функцию для&nbsp;каждого элемента списка; чтобы прервать цикл, функция должна вернуть false</td>
</tr>
<tr>
<td>.each(&#8216;method&#8217;, arguments)</td>
<td>Последовательно выполнить указанный метод для&nbsp;каждого элемента списка</td>
</tr>
<tr>
<th rowspan="2">filter</th>
<td>.filter(&#8216;method&#8217;, arguments)</td>
<td rowspan="2">{items:ElementsList}</td>
<td>Получить новый список элементов из&nbsp;текущего используя метод-фильтр; если&nbsp;метод возвращает true, элемент включается в&nbsp;новую коллекцию</td>
</tr>
<tr>
<td>.filter(NodeList, function(index){…})</td>
<td>Получить новый список элементов из&nbsp;текущего используя функцию-фильтр; если&nbsp;функция возвращает true, элемент включается в&nbsp;новую коллекцию</td>
</tr>
</tbody>
</table>
<h4 id="js-core-methods-event">Методы работы с&nbsp;объектом-событие</h4>
<p>Обработка событий, как&nbsp;говорилось ранее, один из&nbsp;самых трудных моментов, но&nbsp;используя js-core, вы&nbsp;избавить себя от&nbsp;ряда проблем.</p>
<pre><code class="javascript">function(e) {
    $.event(e).preventDefault();
}</code></pre>
<p>Подробнее, об&nbsp;остальных методах, в&nbsp;таблице ниже:</p>
<table style="font:11px/18px Consolas, monospace;width:668px;table-layout:fixed;border:2px solid #22689c" summary="js-core methods">
<colgroup>
<col style="width:120px;background:#f5f5f5;" />
<col style="width:220" />
<col style="width:128px;" />
<col style="width:200px;" /></colgroup>
<thead>
<tr style="background:#22689c;color:#fff;font-size:12px;">
<th>Метод</th>
<th>Варианты вызова</th>
<th>Возвращаемое значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<th>preventDefault</th>
<td>.preventDefault()</td>
<td>{object:eventObject}</td>
<td>Предотвратить стандартное действие браузера</td>
</tr>
<tr>
<th>stopPropagation</th>
<td>.stopPropagation()</td>
<td>{object:eventObject}</td>
<td>Остановить всплывание события</td>
</tr>
<tr>
<th>stop</th>
<td>.stop()</td>
<td>{object:eventObject}</td>
<td>Выполнить два предыдущих метода</td>
</tr>
<tr>
<th>target</th>
<td>.target()</td>
<td>HTMLElement</td>
<td>Получить текущий элемент, на&nbsp;котором сработало событие</td>
</tr>
<tr>
<th>mouseButton</th>
<td>.mouseButton()</td>
<td>left|middle|right</td>
<td>Узнать, какая кнопка мыши была&nbsp;нажата</td>
</tr>
<tr>
<th>mousePosition</th>
<td>.mousePosition()</td>
<td>{x:number,y:number}</td>
<td>Получить координаты курсоры мыши</td>
</tr>
<tr>
<th>key</th>
<td>.key()</td>
<td>number</td>
<td>Получить код&nbsp;нажатой клавиши</td>
</tr>
</tbody>
</table>
<h4 id="js-core-methods-ajax">Методы работы с&nbsp;AJAX</h4>
<p>Для&nbsp;того чтобы&nbsp;получить доступ к&nbsp;методам для&nbsp;работы с&nbsp;AJAX в&nbsp;js-core, вам&nbsp;нужно&nbsp;подключить соответствующий модуль, который находится в&nbsp;отдельном файле. Такое разделение было&nbsp;сделано по&nbsp;причине&nbsp;того, что&nbsp;в&nbsp;дальнейшем планируется значительно увеличить функционал этого&nbsp;модуля, что&nbsp;неминуемо приведет к&nbsp;увеличению его&nbsp;размеров, но&nbsp;не&nbsp;каждое JavaScript-приложение использует AJAX для&nbsp;передачи данных.</p>
<p>На&nbsp;данный момент (версия модуля&nbsp;0.2.5) доступно 4&nbsp;метода, которые могут&nbsp;принимать следующие аргументы:</p>
<pre><code class="javascript">// объект с параметрами
var parametrs = {
    method: 'GET'|'POST',      // по умолчанию GET
    url: 'url-encoded-string', // по умолчанию location.href
    async: true|false,         // по умолчанию true
    user: 'string',            // по умолчанию null
    password: 'string',        // по умолчанию null
    params: {param: 'value'},  // по умолчанию null
    processData: true|false,   // по умолчанию false
    timeout: number,           // по умолчанию 0
    contentType: 'string',// по умолчанию application/x-www-form-urlencoded
    dataType: 'string',        // по умолчанию */*
    requestHeaders: {'name': 'content'}, // по умолчанию null
    protocol: 'string'         // по умолчанию http:
}
// callback-функции
function success(responseText [, xhr]) {...}
function error(responseText [, xhr]) {...}</code></pre>
<p>Ни&nbsp;один из&nbsp;аргументов объекта <var>parametrs</var> не&nbsp;обязателен, как&nbsp;и&nbsp;callback-функции. Метод <code>$(…).load(…)</code> выполняет callback-функции в&nbsp;контексте текущего элемента, остальные&nbsp;— AJAX-объекта.</p>
<pre><code class="javascript">$('container').text('loading…').load(parametrs, success, error)</code></pre>
<p><strong>Не забывайте, что в JavaScript действует «правило одного источника», поэтому передачу данных можно производить только в переделах одного домена.</strong></p>
<table style="font:11px/18px Consolas, monospace;width:668px;table-layout:fixed;border:2px solid #22689c" summary="js-core methods">
<colgroup>
<col style="width:120px;background:#f5f5f5;" />
<col style="width:220" />
<col style="width:128px;" />
<col style="width:200px;" /></colgroup>
<thead>
<tr style="background:#22689c;color:#fff;font-size:12px;">
<th>Метод</th>
<th>Варианты вызова</th>
<th>Возвращаемое значение</th>
<th>Действие</th>
</tr>
</thead>
<tbody>
<tr>
<th rowspan="4">load</th>
<td>$(…).load(parametrs)</td>
<td rowspan="4">{node:HTMLElement}</td>
<td rowspan="4">Заменить содержимое текущего узла на&nbsp;данные, полученные с&nbsp;помощью AJAX-запроса</td>
</tr>
<tr>
<td>$(…).load(parametrs, success)</td>
</tr>
<tr>
<td>$(…).load(parametrs, success, error)</td>
</tr>
<tr>
<td>$(…).load(parametrs, null, error)</td>
</tr>
<tr>
<th rowspan="4">$.get</th>
<td>$.get(parametrs)</td>
<td rowspan="4">object</td>
<td rowspan="4">Выполнить GET-запрос средствами AJAX</td>
</tr>
<tr>
<td>$.get(parametrs, success)</td>
</tr>
<tr>
<td>$.get(parametrs, success, error)</td>
</tr>
<tr>
<td>$.get(parametrs, null, error)</td>
</tr>
<tr>
<th rowspan="4">$.post</th>
<td>$.post(parametrs)</td>
<td rowspan="4">object</td>
<td rowspan="4">Выполнить POST-запрос средствами AJAX</td>
</tr>
<tr>
<td>$.post(parametrs, success)</td>
</tr>
<tr>
<td>$.post(parametrs, success, error)</td>
</tr>
<tr>
<td>$.post(parametrs, null, error)</td>
</tr>
<tr>
<th rowspan="4">$.getJSON</th>
<td>$.getJSON(parametrs)</td>
<td rowspan="4">object</td>
<td rowspan="4">Выполнить запрос средствами AJAX и&nbsp;автоматически преобразовать пришедшие от&nbsp;сервера данные в&nbsp;JavaScript-объект</td>
</tr>
<tr>
<td>$.getJSON(parametrs, success)</td>
</tr>
<tr>
<td>$.getJSON(parametrs, success, error)</td>
</tr>
<tr>
<td>$.getJSON(parametrs, null, error)</td>
</tr>
</tbody>
</table>
<h3 id="js-core-writing-extensions">Создание расширений для js-core</h3>
<p>Фреймворк имеет удобный и&nbsp;простой механизм расширения стандартного функционала пользовательскими методами:</p>
<pre><code class="javascript">core.prototype.newMethod = function() {
    // что-то делаем с this.node
    return this; // для обарзования цепочек
}</code></pre>
<p>Добавим метод <code>defaultValue(…)</code>, который&nbsp;служит, чтобы&nbsp;установить значение по&nbsp;умолчанию для&nbsp;элемента ввода:</p>
<pre><code class="javascript">core.prototype.defaultValue = function(str) {
    if(!this.node.value) this.node.value = str;
    return this.bind('focus', function() {
        if(this.value == str) this.value = '';
    }).bind('blur', function() {
        if(!core.trim(this.value)) this.value = str;
    });
};

// используем
$(HTMLInputElement).defaultValue('Найти');</code></pre>
<p>Как&nbsp;видим, механизм расширения предельно прост, достаточно добавить свой&nbsp;метод в&nbsp;прототип объекта&nbsp;<var>core</var>, а&nbsp;для&nbsp;того, чтобы&nbsp;организовать возможность построения цепочек вызовов, можно&nbsp;вернуть в&nbsp;своем&nbsp;методе контекст вызова&nbsp;<code>this</code>.</p>
<h3 id="js-core-features">Что дальше?</h3>
<p>Я&nbsp;планирую поддерживать и&nbsp;развивать проект. За&nbsp;дальнейшими обновлениями следите на&nbsp;сайте <a href="http://www.js-core.ru/">www.js-core.ru</a>. В&nbsp;скором времени там начнет появляться документация с&nbsp;примерами для&nbsp;каждого метода.</p>
<p>Дальнейшие планы по&nbsp;наращиванию функционала:</p>
<ul>
<li><strong>Анимация</strong> (fadeIn, fadeOut, slideToggle), которую&nbsp;вы&nbsp;можете реализовать и&nbsp;сейчас, для&nbsp;этого есть&nbsp;набор необходимых методов (opacity, timer, hide, show и&nbsp;др.);</li>
<li>Обработка форм, маскированный ввод;</li>
<li>Расширение функциональности AJAX-модуля, внедрение глобальных AJAX-событий и&nbsp;очередей перезапускающихся запросов;</li>
<li>Создание набора готовых элементов интерфейса;</li>
<li><del>Подавление других фреймворков</del></li>
</ul>
<p>В&nbsp;каком порядке будут&nbsp;появляться дополнения, не&nbsp;знаю, могу&nbsp;только сказать, что&nbsp;уже&nbsp;начал работать над&nbsp;анимацией.</p>
<p>На&nbsp;этом&nbsp;закончим статью, надеюсь, вам пришлись по&nbsp;вкусу способы, предлагаемые фреймворком js-core, решения задач, и&nbsp;на&nbsp;его&nbsp;основе вы&nbsp;будете создавать современные и&nbsp;динамичные сайты и&nbsp;веб-приложения.</p>
<h3 id="js-core-download">Скачать</h3>
<p>Скачать можно на&nbsp;<a href="http://code.google.com/p/js-core/downloads/list">странице проекта</a> в&nbsp;сервисе Google&nbsp;Code или&nbsp;с&nbsp;сайта <a href="http://www.js-core.ru/downloads/">www.js-core.ru</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-reloaded/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>W3C CSS API селекторы &#8212; методы querySelector() и querySelectorAll()</title>
		<link>http://www.codeisart.ru/w3c-css-selectors-api-the-queryselector-and-queryselectorall-methods/</link>
		<comments>http://www.codeisart.ru/w3c-css-selectors-api-the-queryselector-and-queryselectorall-methods/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 12:20:47 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=761</guid>
		<description><![CDATA[Методы querySelector() и&#160;querySelectorAll() позволяют принимают в&#160;качестве аргументов CSS-селектор и&#160;возвращают найденные элементы в&#160;виде элементов DOM. Разница между этими методами заключается лишь в&#160;количестве возвращаемых элементов&#160;&#8212; первый найденный или все найденные в&#160;документе. Кроме того, что они более универсальны, чем getElementById() и&#160;getElementByTagName(), наши 2&#160;метода отличаются невероятной скоростью поиска, так как они используют преимущества тех&#160;же механизмов, которые использует браузер для [...]]]></description>
			<content:encoded><![CDATA[<p>Методы <code class="javascript">querySelector()</code> и&nbsp;<code class="javascript">querySelectorAll()</code> позволяют принимают в&nbsp;качестве аргументов <abbr title="Cascading Style Sheets">CSS</abbr>-селектор и&nbsp;возвращают найденные элементы в&nbsp;виде элементов <abbr title="Document Object Model">DOM</abbr>.</p>
<p><span id="more-761"></span></p>
<p>Разница между этими методами заключается лишь в&nbsp;количестве возвращаемых элементов&nbsp;&#8212; первый найденный или все найденные в&nbsp;документе. Кроме того, что они более универсальны, чем <code class="javascript">getElementById()</code> и&nbsp;<code class="javascript">getElementByTagName()</code>, наши 2&nbsp;метода отличаются невероятной скоростью поиска, так как они используют преимущества тех&nbsp;же механизмов, которые использует браузер для идентификациии элементов стиля во&nbsp;время просмотра <abbr title="Cascading Style Sheets">CSS</abbr> страницы.</p>
<blockquote><p>Если говорить о&nbsp;совместимости с&nbsp;браузерами, то <code class="javascript">querySelector()</code> и&nbsp;<code class="javascript">querySelectorAll()</code> поддерживаются в&nbsp;<strong>Firefox 3.1+</strong>, <strong>IE8+</strong> (только в&nbsp;стандартном режиме IE8), и&nbsp;<strong>Safari 3.1+</strong>.</p></blockquote>
<h3>Метод querySelector()</h3>
<p>Этот метод относится как к&nbsp;объектам &laquo;Document&raquo;, так и&nbsp;к&nbsp;&laquo;Element&raquo;. Это позволяет вам запрашивать либо всю цепочку элементов всего документа, либо какую-либо ее&nbsp;часть в&nbsp;поиске нужного вам элемента.</p>
<p>Он принимает в&nbsp;качестве аргумента параметра любой <abbr title="Cascading Style Sheets">CSS</abbr>-селектор (IE:&nbsp;<code class="html">"#mydiv img"</code>) и&nbsp;возвращает первый совпавший элемент (если их&nbsp;несколько) или null если нет совпадений. Например:</p>
<pre><code class="javascript">document.querySelector('#myheader') //возвращает элемент с ID="myheader"
document.querySelector('p.description') //возвращает элемент P с class="description"
document.querySelector('#content img:nth-of-type(1)') //возвращает первой изображение, содержащее "#content"
document.querySelector('#myform input[type="radio"]:checked') //выбирает отмеченный пункт из "#myform"
document.querySelector('#biography, #gallery') //вовращает или элемент "#biography" или "#gallery", в зависимости от того, какой из них был найден первым в списке
</code></pre>
<p>Обратите внимание на&nbsp;последний пример&nbsp;&#8212; вы&nbsp;можете передавать несколько <abbr title="Cascading Style Sheets">CSS</abbr>-селекторов, разделяя их&nbsp;запятой (&laquo;,&raquo;). Запятая играет роль логического &laquo;или&raquo;, которое позволяет <code class="javascript">querySelector()</code> возвратить первый элемент из&nbsp;дерева документов, который совпадает с&nbsp;одним из&nbsp;введенных <abbr title="Cascading Style Sheets">CSS</abbr>-селекторов.</p>
<h4>Небольшая демонстрация</h4>
<p>Нижеописанный HTML-код создает 2&nbsp;вложенных DIV с&nbsp;изменяющимся цветом фона внутреннего DIV при наведении курсора мыши на&nbsp;внешний DIV.</p>
<p>Пример показывает использование <code class="javascript">querySelector()</code> одновременно в&nbsp;виде метода &laquo;Document&raquo; и&nbsp;&laquo;Element&raquo;:</p>
<pre><code class="javascript">&lt;div id=&quot;outerdiv&quot; style=&quot;padding:50px; width:100px; height:100px; border:1px solid black&quot;&gt;
&lt;div id=&quot;innerdiv&quot; style=&quot;width:100%; height:100%; border:1px solid black; background:silver;&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
if (document.querySelector){
  var outerdiv=document.querySelector('#outerdiv')
  outerdiv.onmouseover=function(){
    this.querySelector('#innerdiv').style.background=&quot;yellow&quot;
  }
  outerdiv.onmouseout=function(){
    this.querySelector('#innerdiv').style.background=&quot;silver&quot;
  }
}
&lt;/script&gt;</code></pre>
<div id="outerdiv" style="padding:50px; width:100px; height:100px; border:1px solid black">
<div id="innerdiv" style="width:100%; height:100%; border:1px solid black; background:silver;"></div>
</div>
<p><script type="text/javascript">
if (document.querySelector){
 var outerdiv=document.querySelector('#outerdiv')
 outerdiv.onmouseover=function(){
  this.querySelector('#innerdiv').style.background="yellow"
 }
 outerdiv.onmouseout=function(){
  this.querySelector('#innerdiv').style.background="silver"
 }
}
</script></p>
<h3>Метод querySelectorAll()</h3>
<p>Этот метод возвращает не&nbsp;только один элемент, совпадающий с&nbsp;<abbr title="Cascading Style Sheets">CSS</abbr>-селектором, но&nbsp;и&nbsp;все остальные, в&nbsp;виде &laquo;staticNodeList&raquo;. &laquo;StaticNodeList&raquo; &mdash; это статичный набор элементов, на&nbsp;которые не&nbsp;влияют последующие изменения, происходящие в&nbsp;дереве документов, например удаление одного из&nbsp;элементов. Метод имеет аттрибут &laquo;<code>length</code>&raquo;, позволяющий вам заносить каждый из&nbsp;похожих элементов в&nbsp;массив. Примеры:</p>
<pre><code class="javascript">document.querySelectorAll('.mygroup'); //вовзращает все элементы с class="mygroup";
document.querySelectorAll('option[selected="selected"]'); //возвращает каждый выбранный по умолчанию пункт меню
document.querySelectorAll('#mytable tr>td:nth-of-type(1)'); //возвращает первый элемент каждой строки таблицы "mytable";
document.querySelectorAll('#biography, #gallery'); //возвращает и элементы "#biography" и "#gallery"</code></pre>
<h4>Время для демострации!</h4>
<p>Давайте используем <code class="javascript">querySelectorAll()</code> для быстрого определния выставленных чекбоксов:</p>
<pre><code class="javascript">&lt;form id=&quot;myform&quot; onSubmit=&quot;return false&quot;&gt;
  &lt;b&gt;Your hobbies:&lt;/b&gt;&lt;input name=&quot;hobbies&quot; type=&quot;checkbox&quot; value=&quot;movies&quot; /&gt;Movies &lt;input name=&quot;hobbies&quot; type=&quot;checkbox&quot; value=&quot;sports&quot; /&gt;Sports &lt;input name=&quot;hobbies&quot; type=&quot;checkbox&quot; value=&quot;reading&quot; /&gt;Reading &lt;input name=&quot;hobbies&quot; type=&quot;checkbox&quot; value=&quot;sleeping&quot; /&gt;Sleeping
  &lt;br /&gt;
  &lt;input type=&quot;submit&quot; /&gt;
  &lt;/form&gt;

&lt;script type=&quot;text/javascript&quot;&gt;
  if (document.querySelector){
    document.querySelector('#myform').onsubmit=function(){
      var checkedhobbies=this.querySelectorAll('input[name=&quot;hobbies&quot;]:checked');
      for (var i=0; i&lt;checkedhobbies.length; i++){
        alert(checkedhobbies[i].value);
      }
    return false
    }
  }
&lt;/script&gt;</code></pre>
<p><a href="http://www.codeisart.ru/files/w3c-css-api.html">Открыть пример</a></p>
<h3>Ограничения IE8</h3>
<p>В IE8&nbsp;есть несколько ограничений, которых нужно придерживаться используя <code class="javascript">querySelector()</code> и&nbsp;<code class="javascript">querySelectorAll()</code>:</p>
<ul>
<li>Ваш документ должен соответствовать стандартному режиму IE8, чтобы эти 2&nbsp;метода работали. Документ становится нестандартным, если он&nbsp;имеет не&nbsp;четкий тип, или настроен для работы со&nbsp;стандартом IE7&nbsp;с&nbsp;помощью мета-тега: <code>&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=7&quot; /&gt;</code>.</li>
<li>IE8&nbsp;не&nbsp;поддерживает дополнительный параметр &laquo;NSResolver&raquo;, используемый в&nbsp;<code class="javascript">querySelector()</code> или <code class="javascript">querySelectorAll()</code> для определения префиксов имен в&nbsp;XHTML документах.</li>
<li>По соображениям безопасности, IE8&nbsp;не&nbsp;будет возвращать элементы, полученные с&nbsp;использованием <abbr title="Cascading Style Sheets">CSS</abbr>-селекторов &laquo;<code>:visited</code>&raquo; или &laquo;<code>:link</code>&raquo;. Это сделано для того, чтобы веб-мастера не&nbsp;могли определить ссылки на&nbsp;страницы, посещенные пользователем.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/w3c-css-selectors-api-the-queryselector-and-queryselectorall-methods/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Интеграция «Peppy» и «js-core»</title>
		<link>http://www.codeisart.ru/js-core-and-peppy-integration/</link>
		<comments>http://www.codeisart.ru/js-core-and-peppy-integration/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 00:39:55 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js-core]]></category>
		<category><![CDATA[Peppy]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=741</guid>
		<description><![CDATA[Не&#160;так&#160;давно Джеймс&#160;Донахью выпустил первый бета-релиз «Peppy»&#160;— движка селекторов, предоставляющего возможность использовать CSS3 для&#160;выборки элементов. По&#160;результатам сравнительных тестов на&#160;производительность «Peppy» занимает топовые позиции. Так&#160;как&#160;я&#160;пока&#160;сомневаюсь, стоит&#160;ли&#160;мне&#160;писать подобный модуль для&#160;«js-core», потому&#160;что считаю, что&#160;вполне достаточно стандартных методов DOM для&#160;выбора нужных узлов, но&#160;всё-таки иногда бывают случаи, когда&#160;использование синтаксиса CSS-селекторов для&#160;этих&#160;целей очень&#160;удобно, я&#160;решил попробовать совместить мой&#160;фреймворк и&#160;библиотеку «Peppy». Как&#160;оказалось, все&#160;очень&#160;просто. Никаких [...]]]></description>
			<content:encoded><![CDATA[<p>Не&nbsp;так&nbsp;давно <a href="http://jamesdonaghue.com/?p=157" hreflang="en">Джеймс&nbsp;Донахью</a> выпустил первый бета-релиз «<a href="http://jamesdonaghue.com/static/peppy/" hreflang="en">Peppy</a>»&nbsp;— движка селекторов, предоставляющего возможность использовать <abbr title="Cascading Style Sheets Level 3">CSS3</abbr> для&nbsp;выборки элементов. По&nbsp;результатам сравнительных тестов на&nbsp;производительность «Peppy» занимает топовые позиции.</p>
<p>Так&nbsp;как&nbsp;я&nbsp;пока&nbsp;сомневаюсь, стоит&nbsp;ли&nbsp;мне&nbsp;писать подобный модуль для&nbsp;«<a href="http://code.google.com/p/js-core/">js-core</a>», потому&nbsp;что считаю, что&nbsp;вполне достаточно стандартных методов <abbr title="Document Object Model">DOM</abbr> для&nbsp;выбора нужных узлов, но&nbsp;всё-таки иногда бывают случаи, когда&nbsp;использование синтаксиса <abbr title="Cascading Style Sheets">CSS</abbr>-селекторов для&nbsp;этих&nbsp;целей очень&nbsp;удобно, я&nbsp;решил попробовать совместить мой&nbsp;фреймворк и&nbsp;библиотеку «Peppy». Как&nbsp;оказалось, все&nbsp;очень&nbsp;просто.</p>
<p><span id="more-741"></span></p>
<p>Никаких изменений в&nbsp;файле «peppy.js» делать не&nbsp;нужно, просто подключите его&nbsp;к&nbsp;проекту после&nbsp;«js-core-2.5.4.js». Затем,&nbsp;в&nbsp;файл, где&nbsp;у&nbsp;вас&nbsp;будет код проекта или&nbsp;расширения для&nbsp;«js-core», добавьте несколько строк:</p>
<pre><code class="javascript">_$.prototype.query = function(selectorGroups, includeRoot, recursed, flat) {
  return peppy.query(selectorGroups, this.node, includeRoot, recursed, flat);
};

$.query = peppy.query;</code></pre>
<p>Все&nbsp;готово, теперь вы&nbsp;можете использовать все&nbsp;прелести <abbr title="Cascading Style Sheets Level 3">CSS3</abbr>-селекторов, предоставляемые «Peppy», совместно с&nbsp;фунционалом «js-core». Функция «<code>query</code>» возвращает список найденных элементов.</p>
<pre><code class="javascript">var list1 = $('id'|node).query('selector' [, …]);
var list2 = $.query('selector' [, …]);</code></pre>
<p>Давайте рассмотрим какой-нибудь наглядный пример. Допустим&nbsp;у&nbsp;нас&nbsp;есть такой&nbsp;вот&nbsp;семантичный код&nbsp;формы:</p>
<pre><code class="html">&lt;form id=&quot;my-form&quot; action=&quot;&quot;&gt;
  &lt;fieldset&gt;
    &lt;label for=&quot;given-name&quot;&gt;Given name: &lt;input type=&quot;text&quot; id=&quot;given-name&quot; /&gt;&lt;/label&gt;
    &lt;label for=&quot;family-name&quot;&gt;Family name: &lt;input type=&quot;text&quot; id=&quot;family-name&quot; /&gt;&lt;/label&gt;
    &lt;label for=&quot;male&quot;&gt;Male:&lt;/label&gt;
    &lt;ul id=&quot;male&quot;&gt;
      &lt;li&gt;&lt;label for=&quot;man&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;man&quot; name=&quot;male&quot; /&gt; man&lt;/label&gt;&lt;/li&gt;
      &lt;li&gt;&lt;label for=&quot;woman&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;woman&quot; name=&quot;male&quot; /&gt; woman&lt;/label&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Отправить&quot; /&gt;
  &lt;/fieldset&gt;
&lt;/form&gt;</code></pre>
<p>Теперь, чтобы&nbsp;получить все&nbsp;<code>&lt;input&nbsp;type=&quot;text&quot;&nbsp;/&gt;</code> внутри&nbsp;«<var>#my-form</var>», достаточно написать:</p>
<pre><code class="javascript">var inputs = $('my-form').query('input:text');
// или
var inputs = $('my-form').query('input[type=&quot;text&quot;]');
</code></pre>
<p>В&nbsp;этом&nbsp;случае в&nbsp;функцию «<code>peppy.query</code>» автоматически отправляется параметр «<var>root</var>»&nbsp;— ссылка на&nbsp;узел с&nbsp;идентификатором «<var>my-form</var>».</p>
<p>Метод «<code>$.query(…)</code>» будет в&nbsp;точности соответствовать «<code>peppy.query(…)</code>».</p>
<pre><code class="javascript">var labels = $.query('label[for=&quot;man&quot;]', '#my-form');</code></pre>
<p>Вот&nbsp;и&nbsp;всё,&nbsp;как&nbsp;видим ничего&nbsp;сложного, все&nbsp;просто и&nbsp;удобно <img src='http://www.codeisart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-and-peppy-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ключевое слово this в JavaScript</title>
		<link>http://www.codeisart.ru/keyword-this-in-javascript/</link>
		<comments>http://www.codeisart.ru/keyword-this-in-javascript/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 23:55:39 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Переводы]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=703</guid>
		<description><![CDATA[Слово this является одним из&#160;наиболее мощных ключевых слов JavaScript. Но&#160;могут возникнуть трудности с&#160;его использованием, если вы&#160;точно не&#160;знаете, как оно работает и&#160;где применяется. В этой статье я&#160;расскажу, как использовать ключевое слово this в&#160;обработке событий. Опытным программистам быть может данная статья не&#160;принесет никакой опльзы, но&#160;новичкам несомненно будет полезно ее&#160;изучить. Владелец Вопрос, который мы&#160;рассмотрим в&#160;этом пункте&#160;&#8212; это &#171;К&#160;чему [...]]]></description>
			<content:encoded><![CDATA[<p>Слово <code>this</code> является одним из&nbsp;наиболее мощных ключевых слов JavaScript. Но&nbsp;могут возникнуть трудности с&nbsp;его использованием, если вы&nbsp;точно не&nbsp;знаете, как оно работает и&nbsp;где применяется.</p>
<p>В этой статье я&nbsp;расскажу, как использовать ключевое слово <code>this</code> в&nbsp;обработке событий.</p>
<p><span id="more-703"></span></p>
<p>Опытным программистам быть может данная статья не&nbsp;принесет никакой опльзы, но&nbsp;новичкам несомненно будет полезно ее&nbsp;изучить.</p>
<h3>Владелец</h3>
<p>Вопрос, который мы&nbsp;рассмотрим в&nbsp;этом пункте&nbsp;&#8212; это &laquo;К&nbsp;чему мы&nbsp;обращаемся через ключевое слово <code>this</code> в&nbsp;функции <code>doSomething()</code>&raquo;?</p>
<pre><code class="javascript">function doSomething() {
   this.style.color = '#cc0000';
}</code></pre>
<p>В JavaScript <code>this</code> всегда относится к&nbsp;&laquo;владельцу&raquo; выполняемой функции, или, если быть точнее, к&nbsp;объекту, методом которого является функция. Когда мы&nbsp;определяем нашу функцию <code>doSomething()</code> в&nbsp;глобальном пространстве, владельцем является страница или объект window (глобальный обект) JavaScript. Например, аттрибут <code>&laquo;onclick&raquo;</code> принадлежит тому элементу(объекту) <abbr title="HyperText Markup Language">HTML</abbr>, к&nbsp;которому он&nbsp;относится.</p>
<p>Это &laquo;владение&raquo; &mdash; результат объектно-ориентированного подхода JavaScript.</p>
<pre>
------------ window --------------------------------------
|                                          / \           |
|                                           |            |
|                                          this          |
|   ----------------                        |            |
|   | HTML element | &lt;-- this         -----------------  |
|   ----------------      |           | doSomething() |  |
|               |         |           -----------------  |
|          --------------------                          |
|          | onclick property |                          |
|          --------------------                          |
|                                                        |
----------------------------------------------------------
</pre>
<p>Если мы&nbsp;напрямую выполним <code>doSomething()</code>, ключевое слово <code>this</code> будет относиться к&nbsp;окну, и&nbsp;функция попытается изменить <code>style.color</code> окна. Но&nbsp;так как у&nbsp;окна нет объекта <code>style</code>, функция завершается неудачей и&nbsp;вовзратит ошибку.</p>
<h3>Копирование</h3>
<p>Итак, для того, чтобы использовать <code>this</code> в&nbsp;полном объеме, нам нужно позаботится о&nbsp;том, чтобы &laquo;владельцем&raquo; функции, использующей <code>this</code> являлся правильный объект <abbr title="HyperText Markup Language">HTML</abbr>. Например нам нужно скопировать функцию в&nbsp;наш аттрибут <code>&laquo;onclick&raquo;</code>.</p>
<pre><code class="javascript">element.onclick = doSomething;</code></pre>
<p>Функция полностью скопирована в&nbsp;аттрибут <code>&laquo;onclick&raquo;</code> (который теперь становится методом). Теперь при выполнении обработчика событий <code>this</code> относится к&nbsp;элементу <abbr title="HyperText Markup Language">HTML</abbr> и&nbsp;его color поменяется.</p>
<pre>
------------ window --------------------------------------
|                                                        |
|                                                        |
|                                                        |
|   ----------------                                     |
|   | HTML element | &lt;-- this         -----------------  |
|   ----------------      |           | doSomething() |  |
|               |         |           -----------------  |
|          -----------------------          |            |
|          |copy of doSomething()|  &lt;-- copy function    |
|          -----------------------                       |
|                                                        |
----------------------------------------------------------
</pre>
<p>Конечно&nbsp;же мы&nbsp;можем скопировать функцию в&nbsp;несколько обработчиков событий сразу, будь то&nbsp;<code>&laquo;onclick&raquo;</code> или любые другие. Каждый раз <code>this</code> будет относиться к&nbsp;определенному элементу <abbr title="HyperText Markup Language">HTML</abbr>:</p>
<pre>
------------ window --------------------------------------
|                                                        |
|                                                        |
|                                                        |
|   ----------------                                     |
|   | HTML element | &lt;-- this         -----------------  |
|   ----------------      |           | doSomething() |  |
|               |         |           -----------------  |
|          -----------------------          |            |
|          |copy of doSomething()|  &lt;-- copy function    |
|          -----------------------          |            |
|                                           |            |
|   -----------------------                 |            |
|   | another HTML element| &lt;-- this        |            |
|   -----------------------     |           |            |
|               |               |           |            |
|          -----------------------          |            |
|          |copy of doSomething()|  &lt;-- copy function    |
|          -----------------------                       |
|                                                        |
----------------------------------------------------------
</pre>
<p>Таким образом ключевое слово <code>this</code> используется наиболее эффективно. При каждом вызове функции, <code>this</code> относится к&nbsp;тому элементу <abbr title="HyperText Markup Language">HTML</abbr>, который в&nbsp;этот момент обрабатывает событие, элемент <abbr title="HyperText Markup Language">HTML</abbr>, &laquo;владеющий&raquo; копией <code>doSomething()</code>.</p>
<h3>Ссылки</h3>
<p>Однако, если вы&nbsp;используете линейную регистрацию событий:</p>
<pre><code class="javascript">&lt;element onclick="doSomething()"&gt;</code></pre>
<p>Вы не&nbsp;делаете копии функции! Вместо этого вы&nbsp;обращаетесь к&nbsp;ней, и&nbsp;разница огромна! Аттрибут <code>&laquo;onclick&raquo;</code> не&nbsp;содержит саму функцию, а&nbsp;только ее&nbsp;вызов:</p>
<pre><code class="javascript">doSomething();</code></pre>
<p>То есть он&nbsp;говорит &laquo;обратись к&nbsp;<code>doSomething()</code> и&nbsp;выполни ее&raquo;. Обратившись к&nbsp;<code>doSomething()</code>, ключевое слово <code>this</code> относится к&nbsp;глобальному объекту window и&nbsp;функция возвращает сообщения об&nbsp;ошибках.</p>
<pre>
------------ window --------------------------------------
|                                          / \           |
|                                           |            |
|                                          this          |
|   ----------------                        |            |
|   | HTML element | &lt;-- this         -----------------  |
|   ----------------      |           | doSomething() |  |
|               |         |           -----------------  |
|          -----------------------         / \           |
|          | go to doSomething() |          |            |
|          | and execute it      | ---- reference to     |
|          -----------------------       function        |
|                                                        |
----------------------------------------------------------
</pre>
<h3>Разница</h3>
<p>Если вы&nbsp;хотите использовать <code>this</code> для доступа к&nbsp;<abbr title="HyperText Markup Language">HTML</abbr> элементу, обрабатывающему событие, вам нужно убедиться, что ключевое слово <code>this</code> написано именно в&nbsp;аттрибуте <code>&laquo;onclick&raquo;</code>. Только в&nbsp;этом случае оно относится к&nbsp;тому элементу <abbr title="HyperText Markup Language">HTML</abbr>, к&nbsp;которому преписан обработчик событий. То&nbsp;есть если вы&nbsp;выполните</p>
<pre><code class="javascript">element.onclick = doSomething;
alert(element.onclick)</code></pre>
<p>то получите</p>
<pre><code class="javascript">function doSomething()
{
	this.style.color = '#cc0000';
}</code></pre>
<p>Как вы&nbsp;видите, ключевое слово <code>this</code> находится в&nbsp;методе <code>&laquo;onclick()&raquo;</code>. Следовательно, оно относится к&nbsp;элементу <abbr title="HyperText Markup Language">HTML</abbr>.</p>
<p>Но если вы&nbsp;выполните</p>
<pre><code class="javascript">&lt;element onclick="doSomething()"&gt;</code></pre>
<pre><code class="javascript">alert(element.onclick)</code></pre>
<p>то получите</p>
<pre><code class="javascript">function onclick()
{
	doSomething()
}</code></pre>
<p>Это только ссылка на&nbsp;функцию <code>doSomething()</code>. Ключевое слово <code>this</code> не&nbsp;находится в&nbsp;методе <code>&laquo;onclick&raquo;</code> и&nbsp;поэтому не&nbsp;относится к&nbsp;элементу <abbr title="HyperText Markup Language">HTML</abbr>.</p>
<h3>Примеры&nbsp;&#8212; копирование</h3>
<p><code>This</code> записывается в&nbsp;метод <code>&laquo;onclick&raquo;</code> в&nbsp;следующих случаях:</p>
<pre><code class="javascript">element.onclick = doSomething
element.addEventListener('click',doSomething,false)
element.onclick = function () {this.style.color = '#cc0000';}
&lt;element onclick="this.style.color = '#cc0000';"&gt;</code></pre>
<h3>Примеры&nbsp;&#8212; ссылки</h3>
<p>В этих примерах <code>this</code> относится к&nbsp;окну:</p>
<pre><code class="javascript">element.onclick = function () {doSomething()}
element.attachEvent('onclick',doSomething)
&lt;element onclick="doSomething()"&gt;</code></pre>
<p>Заметьте наличие <code>attachEvent()</code>. Главная проблема модели регистрации событий Microsoft в&nbsp;том, что <code>attachEvent()</code> создает ссылку на&nbsp;функцию, а&nbsp;не&nbsp;копирует ее.&nbsp;Поэтому иногда невохможно узнать, какой объект <abbr title="HyperText Markup Language">HTML</abbr> в&nbsp;данный момент обрабатывает событие.</p>
<h3>Комбинации</h3>
<p>При использовании линейной регистрации событий вы&nbsp;также можете пересылать <code>this</code> в&nbsp;функцию, то&nbsp;есть вы&nbsp;все еще можете использовать его:</p>
<pre><code class="javascript">&lt;element onclick="doSomething(this)"&gt;

function doSomething(obj) {
	obj.style.color = '#cc0000';
}</code></pre>
<p>Английский вариант статьи: <a href="http://www.quirksmode.org/js/this.html">The this keyword</a></p>
<blockquote><p><b>Спонсор поста</b>: Агентство &laquo;Web++&raquo;&nbsp;&mdash;&nbsp;продвижение и <a href="http://www.webpp.ru/" title="Создание и продвижение сайтов в Волгограде">создание сайтов в Волгограде</a>.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/keyword-this-in-javascript/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Вставка Flash-анимации</title>
		<link>http://www.codeisart.ru/flash-insert/</link>
		<comments>http://www.codeisart.ru/flash-insert/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 22:02:28 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[XHTML]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=662</guid>
		<description><![CDATA[Поговорим о&#160;том, как&#160;кросс-браузерно разместить на&#160;страницах сайта Flash-анимацию и&#160;сохранить валидность XHTML-документа. Мы&#160;знаем, что&#160;тег &#60;embed&#62;, который так&#160;часто используется для&#160;внедрения swf-файлов в&#160;HTML-страницы отсутствует в&#160;популярной на&#160;данный момент спецификации &#171;XHTML&#160;1.0&#160;Strict&#187;, что&#160;вызывает ошибки во&#160;время прохождения тестов W3C на&#160;соответствие стандартам при&#160;использовании этого&#160;тега. Современные браузеры поддерживают универсальный контейнер &#60;object&#62;, с&#160;помощью которого можно легко вставить Flash-файл на сайт, указав атрибуты &#171;data&#187; (ссылку на&#160;файл) и&#160;&#171;type&#187; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2008/10/flash-insert.png" alt="Flash insert" width="228" height="168" class="left" />Поговорим о&nbsp;том, как&nbsp;кросс-браузерно разместить на&nbsp;страницах сайта Flash-анимацию и&nbsp;сохранить валидность XHTML-документа.</p>
<p>Мы&nbsp;знаем, что&nbsp;тег <code>&lt;embed&gt;</code>, который так&nbsp;часто используется для&nbsp;внедрения swf-файлов в&nbsp;HTML-страницы отсутствует в&nbsp;популярной на&nbsp;данный момент спецификации &laquo;XHTML&nbsp;1.0&nbsp;Strict&raquo;, что&nbsp;вызывает ошибки во&nbsp;время прохождения тестов W3C на&nbsp;соответствие стандартам при&nbsp;использовании этого&nbsp;тега.</p>
<p><span id="more-662"></span></p>
<p>Современные браузеры поддерживают универсальный контейнер <code>&lt;object&gt;</code>, с&nbsp;помощью которого можно легко вставить Flash-файл на сайт, указав атрибуты &laquo;<code>data</code>&raquo; (ссылку на&nbsp;файл) и&nbsp;&laquo;<code>type</code>&raquo; (тип контента), но &laquo;Internet&nbsp;Explorer&raquo; работает с&nbsp;<code>&lt;object&gt;</code> по&nbsp;своему, он&nbsp;не&nbsp;воспринимает ссылку на&nbsp;swf-файл, указанную в&nbsp;атрибуте &laquo;<code>data</code>&raquo;, а&nbsp;требует добавления дочернего тега <code>&lt;param&gt;</code> c&nbsp;атрибутами <code>name=&quot;movie&quot;</code> и <code>value=&quot;ссылка-на-swf-файл&quot;</code>. На&nbsp;этом проблемы не&nbsp;заканчиваются. Для&nbsp;&laquo;Internet&nbsp;Explorer&raquo; в&nbsp;теге <code>&lt;object&gt;</code> необходимо указать &laquo;<code>classid</code>&raquo; ActiveX-элемента, но &laquo;FireFox&raquo; почему-то блокирует такой&nbsp;контейнер.</p>
<p>Получается, что&nbsp;для&nbsp;&laquo;FireFox&raquo; и&nbsp;&laquo;Internet&nbsp;Explorer&raquo; нужно&nbsp;выдать совершенно разный XHTML-код. Что&nbsp;же&nbsp;делать? Очевидный вариант&nbsp;&mdash; использовать возможности JavaScript для&nbsp;динамического создания нужных&nbsp;узлов. Существует готовое решение &laquo;<a href="http://code.google.com/p/swfobject/" rel="external nofollow">SWFObject</a>&raquo;&nbsp;&mdash; это&nbsp;огромный скрипт, позволяющий внедрять &laquo;Flash&raquo; в&nbsp;веб-страницы, но&nbsp;его&nbsp;размер мне&nbsp;кажется не&nbsp;приемлимым. Версия <var>2.1</var>&nbsp;занимает <var>9,5кб</var>&nbsp;в&nbsp;минифицированном виде, мне&nbsp;кажется, что&nbsp;для&nbsp;решения столь узкоспециализированной задачи это&nbsp;слишком много. Хотя конечно &laquo;SWFObject&raquo; предоставляет богатый функционал для внедрения &laquo;Flash&raquo;.</p>
<p>Немного поэкспериментировав, я&nbsp;нашел 2&nbsp;самых&nbsp;простых варианта XHTML-кода:</p>
<p><b>Для&nbsp;Internet Explorer:</b></p>
<pre><code class="html">&lt;OBJECT classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; width=&quot;&quot; height=&quot;&quot;&gt;
&lt;PARAM name=&quot;movie&quot; value=&quot;url&quot; /&gt;
&lt;/OBJECT&gt;</code></pre>
<p><b>Для&nbsp;остальных браузеров:</b></p>
<pre><code class="html">&lt;object type=&quot;application/x-shockwave-flash&quot; data=&quot;url&quot; width=&quot;&quot; height=&quot;&quot;&gt;&lt;/object&gt;</code></pre>
<p>Этого кода достаточно, чтобы мы&nbsp;увидели работающую Flash&#8217;ку на&nbsp;сайте. Теперь напишем скрипт, который будет динамически генерировать данные DOM-узлы с&nbsp;необходимыми атрибутами, в&nbsp;зависимости от&nbsp;используемого браузера. А&nbsp;так&nbsp;же&nbsp;добавим возможность указать свои&nbsp;параметры, такие&nbsp;как&nbsp;&laquo;<code>flashvars</code>&raquo;, &laquo;<code>quality</code>&raquo;, &laquo;<code>wmode</code>&raquo;&nbsp;и&nbsp;другие.</p>
<pre><code class="javascript">function insertFlash(node, url, width, height, params) {
  var object, param, key;
  function newParam(name, value) {
    if(0 /*@cc_on + 1 @*/) return ['&lt;PARAM name=&quot;', name, '&quot; value=&quot;', value, '&quot; /&gt;'].join('');
    else {
      param = document.createElement('param');
      param.name = name;
      param.value = value;
      return param;
    }
  }
  if(0 /*@cc_on + 1 @*/) {
    object = ['&lt;OBJECT classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; width=&quot;', width, '&quot; height=&quot;', height, '&quot;&gt;&lt;PARAM name=&quot;movie&quot; value=&quot;', url, '&quot; /&gt;'];
    if(params) for(key in params) if(params.hasOwnProperty(key)) object.push(newParam(key, params[key]));
    object.push('&lt;/OBJECT&gt;');
    node.innerHTML = object.join('');
  }
  else {
    object = document.createElement('object');
    object.type = 'application/x-shockwave-flash';
    object.data = url;
    object.width = width;
    object.height = height;
    if(params) for(key in params) if(params.hasOwnProperty(key)) object.appendChild(newParam(key, params[key]));
    while(node.firstChild) node.removeChild(node.firstChild);
    node.appendChild(object);
  }
}</code></pre>
<p>Теперь&nbsp;в&nbsp;любое время, после&nbsp;того, как&nbsp;будет готов DOM, можно вставить &laquo;Flash&raquo; на&nbsp;страницу в&nbsp;указанный контейнер, при&nbsp;помощи функции &laquo;<code>insertFlash</code>&raquo;.</p>
<pre><code class="javascript">// Пример
window.onload = function() {
  var logo = document.getElementById('logotype');
  var url = '../flash/logo.swf';
  var width = 320;
  var height = 240;
  var parametrs = {
    wmode: 'transparent',
    quality: 'high'
  };
  insertFlash(logo, url, width, height, parametrs);
};</code></pre>
<p>Тестировал в&nbsp;FireFox&nbsp;2.0.0.13/3.0.3, Opera&nbsp;9.27/9.52/9.60b, Safari&nbsp;3.1&nbsp;(win), Google&nbsp;Chrome&nbsp;0.2 и Internet&nbsp;Explorer&nbsp;5.5/6/8b2.</p>
<p>При&nbsp;желании можно добавить проверку версии установленного у&nbsp;пользователя Flash-плеера и&nbsp;в&nbsp;случае не&nbsp;соответствия требуемой, выводить сообщение с&nbsp;просьбой об&nbsp;обновлении. Так&nbsp;же&nbsp;при&nbsp;помощи callback-вызова от&nbsp;swf-файла можно определить доступность Flash на&nbsp;компьютере клиента. Но&nbsp;в&nbsp;большинстве случаев это&nbsp;всё&nbsp;не&nbsp;нужно.
<p>В&nbsp;дополнение приведу пример добавления своих&nbsp;методов для&nbsp;работы с&nbsp;DOM-узлами в&nbsp;моем <a href="http://www.codeisart.ru/js-core-javascript-framework/">JavaScript&nbsp;framework&#8217;е&nbsp;&laquo;js-core&raquo;</a>. Добавим метод &laquo;<code>flash</code>&raquo;, который выполняет аналогичные вышеприведенному скрипту действия, но&nbsp;написан с&nbsp;использованием функций framework&#8217;а.</p>
<pre><code class="javascript">_$.prototype.extend({
  flash: function(url, width, height, param) {
    if(core.ie) {
      var obj = ['&lt;OBJECT classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; width=&quot;', width, '&quot; height=&quot;', height, '&quot;&gt;&lt;PARAM name=&quot;movie&quot; value=&quot;', url, '&quot; /&gt;'];
      if(param) $.foreach(param, function(name, value) { obj = obj.concat(['&lt;PARAM name=&quot;', name, '&quot; value=&quot;', value, '&quot; /&gt;']); });
      obj.push('&lt;/OBJECT&gt;');
      this.html(obj.join(''));
    }
    else ({}).extend(param).each(function(obj) { obj.append('param').attr({name: this, value: param[this]}); }, [this.empty().empty().append('object').attr({type: 'application/x-shockwave-flash', data: url, width: width, height: height})]);
    return this;
  }
});</code></pre>
<p>Используем&nbsp;так:</p>
<pre><code class="javascript">$('logotype').flash('../flash/logo.swf', 320, 240, {wmode: 'transparent'});</code></pre>
<p>Надеюсь теперь у&nbsp;Вас&nbsp;не&nbsp;возникнет проблем с&nbsp;внедрением &laquo;Flash&raquo; в&nbsp;свои веб-проекты.</p>
<p class="bold">Полезно почитать</p>
<p>В&nbsp;начале статьи говорилось о&nbsp;&laquo;SWFObject&raquo;, как&nbsp;его&nbsp;использовать можно прочесть на&nbsp;русском языке в&nbsp;статье &laquo;<a href="http://designformasters.info/posts/flash-embed-with-swfobject-2/">Внедрение Flash с&nbsp;помощью SWFObject</a>&raquo;. О&nbsp;том, что&nbsp;можно ставить активные ссылки не&nbsp;только для&nbsp;e-mail, читаем в&nbsp;заметке &laquo;<a href="http://rotorweb.ru/xhtmlcss-verstka/ssylki-na-skype-i-icq.html">Ссылки на&nbsp;Skype и&nbsp;ICQ</a>&raquo;. Примите участие в&nbsp;обсуждении вопроса: &laquo;<a href="http://www.mannodesign.com/nuzhna-li-bolshaya-ryzhaya-knopka-rss-na-sajte">Нужна&nbsp;ли Большая Рыжая Кнопка RSS на&nbsp;сайте?</a>&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/flash-insert/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Обработка форм на&#160;JavaScript</title>
		<link>http://www.codeisart.ru/processing-forms-javascript/</link>
		<comments>http://www.codeisart.ru/processing-forms-javascript/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 22:07:52 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=569</guid>
		<description><![CDATA[В&#160;этой статье разберем наиболее эффективную модель построения обработчиков элементов веб-интерфейсов на&#160;примере&#160;HTML-форм. Для&#160;понимания материала, изложенного в&#160;этой статье, от&#160;Вас&#160;потребуется знание объектной модели JavaScript. Обычно встречаются 2&#160;ситуации неправильно организованного алгоритма обработки веб-форм: Программисты, пришедшие из&#160;других языков, например&#160;PHP, пытаются реализовать полноценный шаблон&#160;MVC. В&#160;итоге получается слишком сложный и&#160;медленный код. Начинающие программисты пишут для&#160;каждой формы отдельный набор функций, и&#160;что хуже всего, [...]]]></description>
			<content:encoded><![CDATA[<p>В&nbsp;этой статье разберем наиболее эффективную модель построения обработчиков элементов веб-интерфейсов на&nbsp;примере&nbsp;HTML-форм. Для&nbsp;понимания материала, изложенного в&nbsp;этой статье, от&nbsp;Вас&nbsp;потребуется знание объектной модели JavaScript.</p>
<p>Обычно встречаются 2&nbsp;ситуации неправильно организованного алгоритма обработки веб-форм:</p>
<ol>
<li>Программисты, пришедшие из&nbsp;других языков, например&nbsp;PHP, пытаются реализовать полноценный шаблон&nbsp;<abbr title="Model-view-controller">MVC</abbr>. В&nbsp;итоге получается слишком сложный и&nbsp;медленный код.</li>
<li>Начинающие программисты пишут для&nbsp;каждой формы отдельный набор функций, и&nbsp;что хуже всего, хранят их&nbsp;в&nbsp;глобальном пространстве имен.</li>
</ol>
<p><span id="more-569"></span></p>
<p>Если со&nbsp;второй ситуацией все&nbsp;ясно, со&nbsp;временем, такие программисты могут начать писать более грамотный код, то&nbsp;на&nbsp;первом случае остановимся поподробнее.</p>
<p>Почему&nbsp;же не&nbsp;стоит пытаться реализовать полноценный <a href="http://ru.wikipedia.org/wiki/Mvc" rel="nofollow">шаблон&nbsp;<abbr title="Model-view-controller">MVC</abbr></a> на&nbsp;JavaScript? Потому&nbsp;что в&nbsp;большинстве случаев работа с&nbsp;объектом требует обновления внешнего вида, а&nbsp;межкомпонентные связи &laquo;View&raquo; и&nbsp;&laquo;Model&raquo; добавляют много лишнего, ничем не&nbsp;оправданного кода, который к&nbsp;тому&nbsp;же снижает производительность.</p>
<blockquote>
<p><q>Controller пусть остается отдельно, а&nbsp;Model от&nbsp;View отделять не&nbsp;надо. Особенности Javascript/DOM/CSS позволяют успешно реализовывать аспекты Model средствами View</q></p>
<address>
		<cite><a href="http://javascript.ru/optimize/antimvc">javascript.ru</a></cite><br />
		</address>
</blockquote>
<p>Если Вы&nbsp;активно применяете принципы&nbsp;<abbr title="Model-view-controller">MVC</abbr> в&nbsp;своей практике, то&nbsp;на&nbsp;время прочтения этой статьи постарайтесь их&nbsp;забыть вообще.</p>
<h3>Обработка форм</h3>
<p>Итак, в&nbsp;начале статьи говорилось, что&nbsp;мы&nbsp;будем рассматривать модель обработчика элемента веб-интерфейса на&nbsp;примере <abbr title="Hypertext Markup Language">HTML</abbr>-форм.</p>
<p>Представим, что&nbsp;у&nbsp;нас в&nbsp;проекте будет несколько форм, которые будут совершенно одинаково оформлены. То&nbsp;есть способ отображение ошибок, сообщение об&nbsp;успешной отправке данных и&nbsp;т.&nbsp;д. будут отображаться во&nbsp;всех формах по&nbsp;единому принципу. Данные будут передаваться через <abbr title="Asynchronous Javascript and XML">AJAX</abbr>. Если Вы&nbsp;уже&nbsp;сталкивались с&nbsp;написанием обработчиков форм, то&nbsp;наверное убедились, что&nbsp;один универсальный код для&nbsp;всех форм на&nbsp;все случаи написать невозможно, да&nbsp;это и&nbsp;не&nbsp;нужно. Такой обработчик для&nbsp;каждого проекта должен быть свой. А&nbsp;вот&nbsp;в&nbsp;рамках одного проекта все&nbsp;же можно и&nbsp;нужно выделить общий обработчик из&nbsp;конкретного функционала каждой формы.</p>
<p>Далее, чтобы немного сократить код, будет использоваться функция:</p>
<pre><code class="javascript">function $(id) {
  return document.getElementById(id);
}</code></pre>
<p>Всего лишь сокращаем запись получения ссылки на&nbsp;<abbr title="Document Object Model">DOM</abbr>-узел по&nbsp;идентификатору. Эта&nbsp;функция обычно уже&nbsp;есть в&nbsp;Вашем наборе частоиспользуемых методов или&nbsp;входит в&nbsp;состав используемого в&nbsp;проекте фреймворка.</p>
<p>Воспользуемся функцией-конструктором, для&nbsp;создания объекта&nbsp;&mdash; обработчика формы:</p>
<pre><code class="javascript">function Form(id) {
  this.form = $(id);
}</code></pre>
<p>Функция &laquo;<var>Form</var>&raquo; создает объект, с&nbsp;атрибутом &laquo;<var>form</var>&raquo;, содержащим ссылку на&nbsp;<abbr title="Hypertext Markup Language">HTML</abbr>-форму, полученную по&nbsp;идентификатору. Для&nbsp;чего функция, если&nbsp;можно сразу записать объект, спросите&nbsp;Вы? Для&nbsp;того, чтобы&nbsp;было возможно использовать &laquo;<code>prototype</code>&raquo;.</p>
<p>Добавим в&nbsp;&laquo;<code>prototype</code>&raquo; функции &laquo;<var>Form</var>&raquo; набор методов, которые будут использоваться в&nbsp;каждой форме нашего проекта:</p>
<pre><code class="javascript">Form.prototype = {

  // функция init принимает 3 входных параметра;
  // submit - функция, срабатывющая по событию формы onsubmit;
  // success - функция вызываемая в результате
  // успешной обработки формы;
  // error - функция вызываемая при ошибке.
  init: function(submit, success, error) {

    // добавляем принятые функции, как методы текущего объекта
    this.submit = submit;
    this.success = success;
    this.error = error;

    // создаем атрибут, отвечающий за состояние формы
    this.enabled = true; // включена

    // создаем функцию, которая будет вызвана
    // по событию формы onsubmit
    var _this = this, listener = function() {

      // функция process находится в прототипе функции Form
      // и служит для выполнения дополнительных операций
      // при вызове переданной пользователем функции submit
      _this.process();

      // предотвращаем стандартное действие отправки данных
      // формы на сервер по событию onsubmit
      var ev = arguments[0] || window.event;
      ev.preventDefault ? ev.preventDefault() : ev.returnValue = false;
    };

    // добавляем созданный выше обработчик listener
    // к событию формы onsubmit
    // для нормальных браузеров
    if(this.form.addEventListener)
      this.form.addEventListener('submit', listener, false);
    // для IE
    //@cc_on this.form.attachEvent('onsubmit', listener);
  },

  // функция process выполняет дополнительные действия
  // при вызове указанной пользователем функции submit
  process: function() {
    if(this.enabled) { // если форма включена
      this.enabled = false; // отключаем форму
      this.submit(); // вызываем функцию submit
    }
  },

  // функция message управляет отображением сообщений
  // об ошибках и удачной отправке данных
  message: function(text) {
    // здесь должен находиться код, отвечающий
    // за способ отображения сообщений форм
    // конкретного проекта
    alert(text);
  }
};</code></pre>
<p>Таким образом, мы&nbsp;создали конструктор объекта&nbsp;&mdash; обработчик формы, в&nbsp;списке методов которого есть 3&nbsp;функции:</p>
<ol>
<li><b>&laquo;<var>init</var>&raquo;</b>&nbsp;&mdash; функция, с&nbsp;которой будет начинаться работа с&nbsp;каждой формой. Она&nbsp;расширяет каждый новый объект, функциями, указанными программистом. Создает атрибут &laquo;<var>enabled</var>&raquo;, отвечающий за&nbsp;состояние формы (влючена/выключена), для&nbsp;предотвращения повторной отправки данных, а&nbsp;так&nbsp;же отключает стандартное поведение формы по&nbsp;событию &laquo;<code>onsubmit</code>&raquo;.</li>
<li><b>&laquo;<var>process</var>&raquo;</b>&nbsp;&mdash; выполняет дополнительные операции, присущие всем формам конкретного проекта, перед запуском указанной программистом функции &laquo;<code>submit</code>&raquo;.</li>
<li><b>&laquo;<var>message</var>&raquo;</b>&nbsp;&mdash; управляет отображением информации об&nbsp;ошибках и&nbsp;успешной отправке. <b>Должна&nbsp;быть тесно связана с&nbsp;версткой и&nbsp;оформлением форм в&nbsp;рамках конкретного проекта.</b></li>
</ol>
<p>Как&nbsp;же&nbsp;теперь все&nbsp;это использовать? Да&nbsp;очень просто, а&nbsp;главное удобно:</p>
<pre><code class="javascript">// создаем новую копию объекта Form
// для HTML-формы с идентификатором &quot;my-form&quot;
var myForm = new Form('my-form');

// вызываем метод init и передаем ему 3 функции
myForm.init(

  // submit
  function() {
    // здесь должен находится код, отвечающий
    // за обработку конкретной формы, например,
    // здесь мы проверяем, не пусты ли поля ввода
    // с идентифкаторами &quot;log&quot; и &quot;pwd&quot;?
    $('log').value &amp;&amp; $('pwd').value ? this.success() : this.error();
  },

  // success
  function() {
    // показываем пользователю сообщение об
    // успешной передаче данных
    this.message('Успешно');
  },

  // error
  function() {
    // показываем сообщение об ошибке
    this.message('Ошибка');
    // включаем форму для того,
    // чтобы пользователь имел возможность
    // повторить попытку снова
    this.enabled = true;
  }
);</code></pre>
<p>Функция &laquo;<var>submit</var>&raquo; должна содержать код, проверяющий правильность ввода данных, выполняющий отправку данных формы на&nbsp;сервер через&nbsp;<abbr title="Asynchronous Javascript and XML">AJAX</abbr> и&nbsp;вызывающий функции успешного выполнения операции&nbsp;(<var>success</var>) или&nbsp;ошибки&nbsp;(<var>error</var>) отправки или&nbsp;некорректного ввода данных пользователем.</p>
<p>В&nbsp;некоторых проектах функции &laquo;<var>success</var>&raquo; и&nbsp;&laquo;<var>error</var>&raquo; можно разместить в&nbsp;&laquo;<code>prototype</code>&raquo; функции-конструктора &laquo;<var>Form</var>&raquo;, если способ отображения сообщений совершенно ничем&nbsp;не&nbsp;будет отличаться во&nbsp;всех формах проекта.</p>
<p>Чтобы добавить что-то&nbsp;еще, не&nbsp;предусмотренное функционалом метода &laquo;<var>init</var>&raquo;, но&nbsp;необходимое для&nbsp;работы конкретной формы, можно использовать созданную ссылку на&nbsp;новую копию объекта &laquo;<var>Form</var>&raquo;, например:</p>
<pre><code class="javascript">myForm.form.getElementsByTagName('input')[0].onfocus = function() {
  // какой-то код&hellip;
};</code></pre>
<p>	<b>Вывод</b></p>
<p>Таким&nbsp;образом, мы&nbsp;создали обработчик <abbr title="Hypertext Markup Language">HTML</abbr>-форм в&nbsp;рамках одного конкретного проекта. Самым главным достоинством такого подхода является&nbsp;то, что&nbsp;написав подобный обработчик, при&nbsp;создании каждой новой формы Вам&nbsp;не&nbsp;придется задумываться о&nbsp;коде, отвечающем за&nbsp;ее&nbsp;оформление, которое&nbsp;в&nbsp;большинстве случаем в&nbsp;рамках одного проекта для&nbsp;всех форм одинаковое.</p>
<p>Этот&nbsp;же принцип можно применять и&nbsp;для&nbsp;других элементов веб-интерфейса.</p>
<p>	<b>Полезно почитать</b></p>
<p>Отвлекитесь от&nbsp;программирования и&nbsp;уделите внимание оформлению форм. Советую прочесть статью &laquo;<a href="http://rotorweb.ru/xhtmlcss-verstka/krossbrauzernoe-vyravnivanie-knopok-izobrazhenij-v-formax.html">Кроссбраузерное выравнивание кнопок-изображений в&nbsp;формах</a>&raquo;, сэкономите себе много времени в&nbsp;итоге.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/processing-forms-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>«js-core» — новый JavaScript framework</title>
		<link>http://www.codeisart.ru/js-core-javascript-framework-intro/</link>
		<comments>http://www.codeisart.ru/js-core-javascript-framework-intro/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 10:45:28 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js-core]]></category>
		<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=555</guid>
		<description><![CDATA[Разработка Коробкина Дмитрия (Octane)&#160;&#8212; специалиста по&#160;веб-интерфейсам в&#160;нашей веб-студии&#160;в&#160;Волгограде. Небольшой, но&#160;многофункциональный framework для&#160;удобного и&#160;быстрого программирования на&#160;JavaScript. небольшой размер (около 520 строк кода); работает во&#160;всех актуальных на&#160;данный момент браузерах; поддерживает &#171;DOMContentLoaded&#187; и&#160;кэширование для&#160;&#171;getElementById&#187;; обеспечивает работу с&#160;AJAX; легок в&#160;изучении. На&#160;данный момент подробная документация отсутствует, но&#160;в&#160;скором времени она&#160;будет размещена на&#160;страницах нашего блога, в&#160;рубрике&#160;&#171;js-core&#187;. Скачать последнюю версию &#171;js-core&#187;.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2008/09/js-core.png" alt="js-core" title="«js-core» — JavaScript framework" width="352" height="138" class="left" />Разработка Коробкина Дмитрия (<a href="http://octane.myopenid.com/">Octane</a>)&nbsp;&mdash; специалиста по&nbsp;веб-интерфейсам в&nbsp;нашей <a href="http://www.webpp.ru/">веб-студии&nbsp;в&nbsp;Волгограде</a>. Небольшой, но&nbsp;многофункциональный framework для&nbsp;удобного и&nbsp;быстрого программирования на&nbsp;JavaScript.</p>
<p><span id="more-555"></span></p>
<ul>
<li>небольшой размер (около 520 строк кода);</li>
<li>работает во&nbsp;всех актуальных на&nbsp;данный момент браузерах;</li>
<li>поддерживает &laquo;<code>DOMContentLoaded</code>&raquo; и&nbsp;кэширование для&nbsp;&laquo;<code>getElementById</code>&raquo;;</li>
<li>обеспечивает работу с&nbsp;<abbr title="Asynchronous Javascript and XML">AJAX</abbr>;</li>
<li>легок в&nbsp;изучении.</li>
</ul>
<p>На&nbsp;данный момент подробная документация отсутствует, но&nbsp;в&nbsp;скором времени она&nbsp;будет размещена на&nbsp;страницах нашего блога, в&nbsp;<a href="http://www.codeisart.ru/rubric/js-core/">рубрике&nbsp;&laquo;js-core&raquo;</a>.</p>
<p>Скачать последнюю версию &laquo;<a href="http://code.google.com/p/js-core/">js-core</a>&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-javascript-framework-intro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Способы сокращения JavaScript кода (продолжение)</title>
		<link>http://www.codeisart.ru/javascript-coding-tips-to-write-less-code-continuation/</link>
		<comments>http://www.codeisart.ru/javascript-coding-tips-to-write-less-code-continuation/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 11:57:18 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=508</guid>
		<description><![CDATA[Как&#160;и&#160;обещал, представляю Вам&#160;продолжение статьи &#171;Способы сокращения JavaScript кода&#187;. Быстрый способ преобразования &#171;DOMNodeList&#187; в&#160;&#171;Array&#187; Итак, чем&#160;нас&#160;не&#160;устраивает &#171;DOMNodeList&#187;? Объект такого типа хоть&#160;и&#160;представляет из&#160;себя&#160;нумерованный массив, но&#160;не&#160;имеет методов, присущих объекту&#160;&#171;Array&#187;. Например, в&#160;полученную коллекцию DOM-элементов мы&#160;хотим добавить еще&#160;несколько узлов, но&#160;удобного метода&#160;&#171;push&#187; у&#160;&#171;DOMNodeList&#187;&#160;нет, потому&#160;что это&#160;не&#160;&#171;Array&#187;. var list = document.body.childNodes; alert(typeof list.push); В&#160;результате выполнения этого&#160;кода, будет&#160;выведено сообщение&#160;&#171;undefined&#187;. Преобразовать &#171;list&#187; в&#160;массив можно простым [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2008/08/javascript-coding-tips-2.png" alt="Способы сокращения JavaScript кода (продолжение)" width="288" height="216" class="left" />Как&nbsp;и&nbsp;обещал, представляю Вам&nbsp;продолжение статьи &laquo;<a href="http://www.codeisart.ru/javascript-coding-tips-to-write-less-code/">Способы сокращения JavaScript кода</a>&raquo;.</p>
<h3>Быстрый способ преобразования &laquo;<code>DOMNodeList</code>&raquo; в&nbsp;&laquo;<code>Array</code>&raquo;</h3>
<p>Итак, чем&nbsp;нас&nbsp;не&nbsp;устраивает &laquo;<code>DOMNodeList</code>&raquo;? Объект такого типа хоть&nbsp;и&nbsp;представляет из&nbsp;себя&nbsp;нумерованный массив, но&nbsp;не&nbsp;имеет методов, присущих объекту&nbsp;&laquo;<code>Array</code>&raquo;. Например, в&nbsp;полученную коллекцию <abbr title="Document Object Model">DOM</abbr>-элементов мы&nbsp;хотим добавить еще&nbsp;несколько узлов, но&nbsp;удобного метода&nbsp;&laquo;<code>push</code>&raquo; у&nbsp;&laquo;<code>DOMNodeList</code>&raquo;&nbsp;нет, потому&nbsp;что это&nbsp;не&nbsp;&laquo;<code>Array</code>&raquo;.</p>
<p><span id="more-508"></span></p>
<pre><code class="javascript">var list = document.body.childNodes;
alert(typeof list.push);</code></pre>
<p>В&nbsp;результате выполнения этого&nbsp;кода, будет&nbsp;выведено сообщение&nbsp;&laquo;<samp>undefined</samp>&raquo;. Преобразовать &laquo;<var>list</var>&raquo; в&nbsp;массив можно простым перебором элементов.</p>
<pre><code class="javascript">var list = document.body.childNodes,
length = list.length, array = [], i;
for(i = 0; i &lt; length; array.push(list[i++]));
alert(typeof array.push);</code></pre>
<p>Теперь выводится сообщение &laquo;<samp>function</samp>&raquo;, мы&nbsp;успешно преобразовали &laquo;<code>DOMNodeList</code>&raquo; в &laquo;<code>Array</code>&raquo;. Казалось бы, если нам потребуется такое преобразование выполнять в&nbsp;коде несколько&nbsp;раз, запишем все&nbsp;это в&nbsp;функцию и&nbsp;будем пользоваться, но&nbsp;есть еще&nbsp;более удобный и&nbsp;короткий способ. В&nbsp;JavaScript объект &laquo;<code>Array</code>&raquo; имеет метод &laquo;<code>slice</code>&raquo;, который используется для&nbsp;выделения части массива. Так&nbsp;как элементы структуры &laquo;<code>DOMNodeList</code>&raquo; тоже&nbsp;представляют собой нумерованный список, то&nbsp;метод &laquo;<code>slice</code>&raquo; успешно преобразует &laquo;<code>DOMNodeList</code>&raquo; в&nbsp;&laquo;<code>Array</code>&raquo;.</p>
<p class="warning">Оказалось, что&nbsp;этот&nbsp;пример не&nbsp;работает в&nbsp;<abbr title="Internet Explorer">IE</abbr>. Если&nbsp;Вы&nbsp;знаете способ, как&nbsp;обойти ошибку, пожалуйста, напишите об&nbsp;этом в&nbsp;комментариях.</p>
<pre><code class="javascript">var list = document.body.childNodes, array = [];
array = array.slice.call(list);
alert(typeof array.push);</code></pre>
<p>Снова &laquo;<code>alert(typeof array.push);</code>&raquo; выдает сообщение &laquo;<samp>function</samp>&raquo;. Теперь запишем преобразование в&nbsp;самом кратком виде:</p>
<pre><code class="javascript">var array = [].slice.call(document.body.childNodes);</code></pre>
<p>В&nbsp;итоге даже&nbsp;не&nbsp;нужно будет создавать отдельной функции, преобразующей &laquo;<code>DOMNodeList</code>&raquo; в&nbsp;&laquo;<code>Array</code>&raquo;, итак&nbsp;все&nbsp;коротко и&nbsp;красиво.</p>
<h3>Конструкция&nbsp;&laquo;<code>for(&hellip;in&hellip;)</code>&raquo; работает не&nbsp;только с&nbsp;ассоциативными массивами</h3>
<p>Многие программисты, пришедшие в&nbsp;JavaScript из&nbsp;<abbr title="Hypertext Preprocessor">PHP</abbr>, очень любят использовать везде ассоциативные массивы&nbsp;(хэши) и&nbsp;аналог &laquo;<code>foreach</code>&raquo;, представленный в&nbsp;JavaScript конструкцией &laquo;<code>for(&hellip;in&hellip;)</code>&raquo;, даже&nbsp;там, где&nbsp;это&nbsp;совершенно не&nbsp;нужно. Конструкция &laquo;<code>for(&hellip;in&hellip;)</code>&raquo; работает с&nbsp;любым объектом, в&nbsp;том&nbsp;числе и&nbsp;с&nbsp;&laquo;<code>Array</code>&raquo;.</p>
<p>Например, нам&nbsp;нужно выполнить функцию, для&nbsp;некоторого набора элементов. Нас&nbsp;не&nbsp;интересует их&nbsp;количество и&nbsp;названия&nbsp;(ключи).</p>
<pre><code class="javascript">var key, list = {
	x: 'xxx',
	y: 'yyy',
	z: 'zzz'
}
for(key in list) alert(key);</code></pre>
<p>Ключи &laquo;<var>x</var>&raquo;, &laquo;<var>y</var>&raquo; и&nbsp;&laquo;<var>z</var>&raquo; вообще&nbsp;нигде не&nbsp;участвуют в&nbsp;коде. Давайте перепишем код с&nbsp;использованием &laquo;<code>Array</code>&raquo;.</p>
<pre><code class="javascript">var key, list = ['xxx', 'yyy', 'zzz'];
for(key in list) alert(key);</code></pre>
<p>Запись стала немного короче, за&nbsp;счет удаления ключей ассоциативного массива и&nbsp;разделителя&nbsp;&laquo;<code>:</code>&raquo;&nbsp;(двоеточие). Таким&nbsp;образом, можно перебрать еще&nbsp;и&nbsp;все символы в&nbsp;строке. Главное <b>не&nbsp;забывайте</b>, что&nbsp;если в&nbsp;&laquo;<code>prototype</code>&raquo; этого&nbsp;объекта находятся пользовательские методы, то&nbsp;переменная &laquo;<var>key</var>&raquo; будет получать ссылки и&nbsp;на&nbsp;них&nbsp;тоже. Чтобы этого избежать, необходимо ввести проверку на&nbsp;принадлежность метода/атрибута текущему объекту.</p>
<pre><code class="javascript">var key, list = ['xxx', 'yyy', 'zzz'];
for(key in list) if(list.hasOwnProperty(key)) alert(key);</code></pre>
<p>Чтобы&nbsp;не&nbsp;делать подобных вещей, в&nbsp;этих&nbsp;случаях лучше&nbsp;использовать обычный перебор по&nbsp;номеру элемента.</p>
<pre><code class="javascript">var i, list = ['xxx', 'yyy', 'zzz'], length = list.length;
for(i = 0; i &lt; length; alert(list[i++]));</code></pre>
<p>В&nbsp;таком&nbsp;виде в&nbsp;цикле всегда перебираются только&nbsp;нужные нам&nbsp;элементы. Использование &laquo;<code>for(&hellip;in&hellip;)</code>&raquo; не&nbsp;только для&nbsp;ассоциативных массивов в&nbsp;некоторых случаях помогает сократить код, но&nbsp;нужно&nbsp;быть предельно внимательным, используя эту&nbsp;конструкцию. В&nbsp;общем, забудьте этот&nbsp;пример, зря&nbsp;я&nbsp;его, наверное, написал <img src='http://www.codeisart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Сокращаем и&nbsp;упорядочиваем названия переменных и&nbsp;функций</h3>
<p>Обычно, если&nbsp;в&nbsp;проекте уже&nbsp;не&nbsp;используется какой-либо JavaScript framework, то&nbsp;программист пишет свой&nbsp;набор функций, которые часто&nbsp;будет применять.</p>
<pre><code class="javascript">function newElement(tag) {
  return document.createElement(tag);
}

function newText(str) {
  return document.createTextNode(str);
}

function getElement(id) {
  return document.getElementById(id);
}

function getElements(tag) {
  return document.getElementsByTagName(tag);
}

function addEvent(obj, type, listener) {
  if(obj.addEventListener)
    obj.addEventListener(type, listener, false);
  else if(obj.attachEvent)
    obj.attachEvent('on' + type, listener);
}</code></pre>
<p>В&nbsp;большинстве случаев, эти&nbsp;функции так&nbsp;и&nbsp;остаются лежать в&nbsp;глобальном пространстве имен, поэтому для&nbsp;них&nbsp;придумывают достаточно длинные названия, чтобы&nbsp;вдруг не&nbsp;пересекались с&nbsp;уже имеющимися именами переменных. Да&nbsp;еще&nbsp;и&nbsp;<abbr title="Internet Explorer">IE</abbr> портит жизнь, добавляя идентификаторы <abbr title="Document Object Model">DOM</abbr>-узлов, как&nbsp;переменные в&nbsp;глобальном пространстве имен. Давайте как-нибудь получше организуем наш&nbsp;набор функций.</p>
<pre><code class="javascript">var dom = {
  new: {
    tag: function(tag) {
      return document.createElement(tag);
    },
    text: function(str) {
      return document.createTextNode(str);
    }
  },
  get: {
    id: function(id) {
      return document.getElementById(id);
    },
    tag: function(tag) {
      return document.getElementsByTagName(tag);
    }
  },
  event: {
    add: function(obj, type, listener) {
      if(obj.addEventListener)
        obj.addEventListener(type, listener, false);
      else if(obj.attachEvent)
        obj.attachEvent('on' + type, listener);
    }
  }
}</code></pre>
<p>Кода стало немного больше, но&nbsp;теперь внутри объекта &laquo;<var>dom</var>&raquo; мы&nbsp;можем использовать любые короткие и&nbsp;понятные названия.</p>
<pre><code class="javascript">// было
var list = getElements('div');
// стало
var list = dom.get.tag('div');

// было
var node = newElement('span');
// стало
var node = dom.new.tag('span');</code></pre>
<p>Помоему, стало все&nbsp;логичнее и&nbsp;удобнее для&nbsp;восприятия. Вы&nbsp;тоже так&nbsp;считаете?</p>
<h3>Используем логичные и&nbsp;понятные названия функций и&nbsp;переменных</h3>
<p>Я&nbsp;предпочитаю практически не&nbsp;использовать комментарии в&nbsp;JavaScript коде, а&nbsp;чтобы сохранить читаемость, всегда придумываю короткие, но&nbsp;в&nbsp;тоже&nbsp;время понятные и&nbsp;логичные названия функциям и&nbsp;переменным, а&nbsp;так&nbsp;же&nbsp;применяю структурирование, как&nbsp;это&nbsp;показано в&nbsp;предыдущем примере. От&nbsp;комментариев приходится отказываться из-за&nbsp;критичности размера js-файла.</p>
<h3>Всегда ли нужны &laquo;<code>true</code>&raquo; и &laquo;<code>false</code>&raquo;?</h3>
<p>В&nbsp;условных конструкциях языка JavaScript могут использоваться не&nbsp;только значения &laquo;<code>true</code>&raquo; и &laquo;<code>false</code>&raquo;. В качестве ложного значения могут приниматься: &laquo;<code>0</code>&raquo;, &laquo;<code>undefined</code>&raquo;, &laquo;<code>null</code>&raquo;. За&nbsp;истинное значение может использоваться, например, факт наличия объекта или&nbsp;любое число, отличное от&nbsp;нуля&hellip; Поэтому&nbsp;не&nbsp;усложняйте условные конструкции дополнительными логическими выражениями.</p>
<pre><code class="javascript">if(typeof document.getElementById('test') != 'undefined')
  alert('exist');
else alert('not find');
// или
if(!!document.getElementById('test')) alert('exist');
else alert('not find');

// тоже самое
if(document.getElementById('test')) alert('exist');
else alert('not find');
// или
alert(document.getElementById('test') ? 'exist' : 'not find');</code></pre>
<p>Или&nbsp;вот&nbsp;еще&nbsp;яркий пример, при&nbsp;определении длины массивов и&nbsp;строк:</p>
<pre><code class="javascript">var array = ['a', 'b', 'c'];

if(array.length != 0) {
  // что-то делаем c array
}
// или
if(array.length &gt; 0) {
  // что-то делаем c array
}

//тоже самое
if(array.length) {
  // что-то делаем c array
}</code></pre>
<h3>&laquo;copy-paste&raquo; для ленивых</h3>
<p><b>Никогда не&nbsp;копируйте чужие коды</b>. Не&nbsp;поленитесь и&nbsp;напишите то&nbsp;же&nbsp;самое самостоятельно. Уверен, что&nbsp;Вы&nbsp;найдете способ написать код лучше, чем&nbsp;это&nbsp;сделано в&nbsp;рассматриваемом Вами примере.</p>
<blockquote><p><b>Спонсор поста</b>: Агентство &laquo;Web++&raquo;&nbsp;&mdash;&nbsp;продвижение и <a href="http://www.webpp.ru/" title="Создание и продвижение сайтов в Волгограде">создание сайтов в Волгограде</a>.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/javascript-coding-tips-to-write-less-code-continuation/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Способы сокращения JavaScript кода</title>
		<link>http://www.codeisart.ru/javascript-coding-tips-to-write-less-code/</link>
		<comments>http://www.codeisart.ru/javascript-coding-tips-to-write-less-code/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 19:48:28 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=450</guid>
		<description><![CDATA[Продолжая предыдущую статью, о&#160;том, &#171;как&#160;короче&#160;записывать&#160;PHP-код&#187;, хочу показать Вам&#160;несколько похожих приемов, но&#160;на&#160;языке JavaScript. Используем сокращенную форму записи создания объектов типа &#171;Object&#187; и&#160;&#171;Array&#187; // Создаем Object: var obj = new Object(); // сокращенная запись: var obj = {}; // Создаем Array: var obj = new Array(); // сокращенная запись: var obj = []; Используем возможности логических операции [...]]]></description>
			<content:encoded><![CDATA[<p>Продолжая предыдущую статью, о&nbsp;том, &laquo;<a href="http://www.codeisart.ru/php-coding-tips-to-write-less-code/">как&nbsp;короче&nbsp;записывать&nbsp;PHP-код</a>&raquo;, хочу показать Вам&nbsp;несколько похожих приемов, но&nbsp;на&nbsp;языке JavaScript.</p>
<h3>Используем сокращенную форму записи создания объектов типа &laquo;Object&raquo; и&nbsp;&laquo;Array&raquo;</h3>
<pre><code class="javascript">// Создаем Object:
var obj = new Object();
// сокращенная запись:
var obj = {};

// Создаем Array:
var obj = new Array();
// сокращенная запись:
var obj = [];</code></pre>
<p><span id="more-450"></span></p>
<h3>Используем возможности логических операции JavaScript по-максимуму</h3>
<p>JavaScript предоставляет очень широкие возможности работы с&nbsp;логическими выражениями. Например, &laquo;логическое&nbsp;сложение&raquo; можно выполнить с&nbsp;любыми объектами, в&nbsp;результате будет возвращен первый найденный элемент:</p>
<pre><code class="javascript">// длинная запись
function $tag(tag, node) {
  var list = [];
  if(node) {
    list = node.getElementsByTagName(tag);
  }
  else {
    list = document.getElementsByTagName(tag);
  }
  return list;
}

// запись короче
function $tag(tag, node) {
  if(!node) node = document;
  return node.getElementsByTagName(tag);
}

// еще короче
function $tag(tag, node) {
  return (node || document).getElementsByTagName(tag);
}</code></pre>
<p>Вариант с&nbsp;&laquo;логическим&nbsp;сложением&raquo; не&nbsp;единственный, внимательно прочтите раздел &laquo;Логические&nbsp;выражения&raquo; в&nbsp;Вашей книге по&nbsp;JavaScript и&nbsp;особое внимание уделите&nbsp;тому, что&nbsp;является результатом выполнения логического выражения, т.&nbsp;к.&nbsp;в&nbsp;JavaScript они&nbsp;могут возвращать не&nbsp;только&nbsp;&laquo;<code>true</code>&raquo; или&nbsp;&laquo;<code>false</code>&raquo;.</p>
<p>В&nbsp;операциях присваивания очень&nbsp;удобно использовать &laquo;тернарный&nbsp;оператор&raquo;:</p>
<pre><code class="javascript">var a;
if(b &lt; c) a = b;
else a = c;

//тоже самое
var a = b &lt; c ? b : c;</code></pre>
<h3>Используем &laquo;<code>Object</code>&raquo; вместо&nbsp;&laquo;<code>switch</code>&raquo;</h3>
<p>Конечно, полностью заменить функционал &laquo;<code>switch</code>&raquo; использованием &laquo;<code>Object</code>&raquo; не&nbsp;получится, но&nbsp;в&nbsp;большинстве случаев требуется всего&nbsp;лишь выбор действия по&nbsp;ключу:</p>
<pre><code class="javascript">function showMessage(type) {
  var msg;
  switch(type) {
    case 'error': msg = 'Error!'; break;
    case 'warning': msg = 'Warning!'; break;
    case 'notify': msg = 'All ready!'; break;
    case 'confirm': msg = 'Are you ready?'; break;
    default: msg = 'Nothing...';
  }
  alert(msg);
}

showMessage('warning');</code></pre>
<p>Меня&nbsp;сильно раздражает в&nbsp;этой записи необходимость постоянно повторять &laquo;<code>case&nbsp;&hellip;&nbsp;break;</code>&raquo;. Давайте перепишем этот&nbsp;код, используя &laquo;<code>Object</code>&raquo;:</p>
<pre><code class="javascript">var messages = {
  error: 'Error!',
  warning: 'Warning!',
  notify: 'All ready!',
  confirm: 'Are you ready?',
  show: function(type) {
    alert(this[type] || 'Nothing...');
  }
};

messages.show('notify');</code></pre>
<p>Как&nbsp;видим, код&nbsp;немного сократился, а&nbsp;самое главное исчезли все&nbsp;эти&nbsp;&laquo;<code>case&nbsp;&hellip;&nbsp;break;</code>&raquo; и&nbsp;инициализация переменной&nbsp;&laquo;<var>msg</var>&raquo;. А&nbsp;если в&nbsp;проекте&nbsp;бы было 100&nbsp;типов сообщений, при&nbsp;использовании первого способа пришлось&nbsp;бы 100&nbsp;раз написать &laquo;<code>case&nbsp;&hellip;&nbsp;break;</code>&raquo;&hellip;</p>
<h3>Самая короткая запись кода только для&nbsp;IE</h3>
<p>Чтобы выполнить код&nbsp;только для&nbsp;<abbr title="Internet Explorer">IE</abbr> совсем&nbsp;не&nbsp;обязательно делать громоздкие условия, с&nbsp;поиском подстроки&nbsp;&laquo;<code>MSIE</code>&raquo; в&nbsp;строке &laquo;<code>navigator.userAgent</code>&raquo; или&nbsp;проверять наличие &laquo;<code>window.ActiveXObject</code>&raquo;.</p>
<pre><code class="javascript">if(navigator.userAgent.search('MSIE') != -1) {
	alert('This is Internet Explorer!');
}</code></pre>
<p>Достаточно всего&nbsp;лишь заключить этот&nbsp;код&nbsp;в&nbsp;специальные комментарии (Conditional&nbsp;Compilation), которые понимает только&nbsp;<abbr title="Internet Explorer">IE</abbr>:</p>
<pre><code class="javascript">//@cc_on	alert('This is Internet Explorer!');</code></pre>
<p>Подробнее про&nbsp;&laquo;Conditional Compilation&raquo; можно прочитать в&nbsp;моей статье &laquo;<a href="http://www.codeisart.ru/abbr-%D0%B8-q-%D0%B2-internet-explorer/">&lt;abbr&gt;&nbsp;и&nbsp;&lt;q&gt;&nbsp;в&nbsp;Internet&nbsp;Explorer</a>&raquo;.</p>
<h3>Используем правила обращения к методам и атрибутам объекта</h3>
<p>Для&nbsp;работы с&nbsp;атрибутами узла&nbsp;<abbr title="Document Object Model">DOM</abbr> можно использовать стандартные правила обращения к&nbsp;методам и&nbsp;атрибутам объекта JavaScript:</p>
<pre><code class="javascript">node.setAttribute('title', 'Hello!');
// тоже самое
node.title = 'Hello!';
// или
node['title'] = 'Hello!';</code></pre>
<p>Более&nbsp;того, такой&nbsp;способ часто оказывается единственным кросс-браузерным решением.</p>
<p class="center">Продолжение&nbsp;будет&hellip;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/javascript-coding-tips-to-write-less-code/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>&lt;abbr&gt; и&#160;&lt;q&gt; в&#160;Internet Explorer</title>
		<link>http://www.codeisart.ru/abbr-%d0%b8-q-%d0%b2-internet-explorer/</link>
		<comments>http://www.codeisart.ru/abbr-%d0%b8-q-%d0%b2-internet-explorer/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 14:21:18 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=307</guid>
		<description><![CDATA[Всем известно, что&#160;самый замечательный браузер &#171;Internet&#160;Explorer&#187; ниже&#160;7-й версии не&#160;поддерживает тег &#60;abbr&#62;&#160;&#8212; аббревиатура, а&#160;в&#160;вплоть до&#160;7-й&#160;версии включительно невозможно средствами CSS задать оформление кавычек для&#160;тега &#60;q&#62;&#160;&#8212; inline-цитата. Что&#160;же&#160;делать? В&#160;случае&#160;с&#160;&#60;abbr&#62; можно заменить этот тег на&#160;похожий &#60;acronym&#62;, который поддерживает IE, а&#160;вот&#160;с&#160;&#60;q&#62; все сложнее, потому&#160;что IE не&#160;поддерживает ни&#160;&#171;Generated&#160;Content&#187; не&#160;селекторы &#171;:before&#187; и&#160;&#171;:after&#187; в&#160;CSS. Итак,&#160;добавим поддержку &#60;abbr&#62;, а&#160;точнее его&#160;эмуляцию, для&#160;IE ниже 7-й&#160;версии. Для&#160;этого [...]]]></description>
			<content:encoded><![CDATA[<p>Всем известно, что&nbsp;<del>самый замечательный браузер</del> <strong class="normal">&laquo;Internet&nbsp;Explorer&raquo; ниже&nbsp;7-й версии не&nbsp;поддерживает тег <code>&lt;abbr&gt;</code></strong>&nbsp;&mdash; аббревиатура, а&nbsp;в&nbsp;вплоть до&nbsp;7-й&nbsp;версии включительно невозможно средствами <abbr title="Cascading Style Sheets">CSS</abbr> задать оформление кавычек для&nbsp;тега <code>&lt;q&gt;</code>&nbsp;&mdash; inline-цитата. Что&nbsp;же&nbsp;делать? В&nbsp;случае&nbsp;с&nbsp;<code>&lt;abbr&gt;</code> можно заменить этот тег на&nbsp;похожий <code>&lt;acronym&gt;</code>, который поддерживает <abbr title="Internet Explorer">IE</abbr>, а&nbsp;вот&nbsp;с&nbsp;<code>&lt;q&gt;</code> все сложнее, потому&nbsp;что <abbr title="Internet Explorer">IE</abbr> не&nbsp;поддерживает ни&nbsp;&laquo;<a href="http://www.w3.org/TR/REC-CSS2/generate.html" hreflang="en" rel="external nofollow">Generated&nbsp;Content</a>&raquo; не&nbsp;селекторы &laquo;<code>:before</code>&raquo; и&nbsp;&laquo;<code>:after</code>&raquo; в&nbsp;<abbr title="Cascading Style Sheets">CSS</abbr>.</p>
<p><span id="more-307"></span></p>
<p>Итак,&nbsp;добавим поддержку <code>&lt;abbr&gt;</code>, а&nbsp;точнее его&nbsp;эмуляцию, для&nbsp;<abbr title="Internet Explorer">IE</abbr> ниже 7-й&nbsp;версии. Для&nbsp;этого заменим <code>&lt;abbr&gt;&lt;/abbr&gt;</code> на&nbsp;<code>&lt;span&nbsp;class=&quot;abbr&quot;&gt;&lt;/span&gt;</code>:</p>
<pre><code class="javascript">function abbr() {
  var node = document.getElementsByTagName('body')[0];
  node.innerHTML = node.innerHTML
  .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
  .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
}</code></pre>
<p>Почему используется &laquo;<code>innerHTML</code>&raquo;, а&nbsp;не&nbsp;&laquo;<code>getElementsByTagName('abbr')</code>&raquo;? Потому&nbsp;что <abbr title="Internet Explorer">IE</abbr>&nbsp;не&nbsp;воспринимает <code>&lt;abbr&gt;</code> как&nbsp;тег, и&nbsp;&laquo;<code>getElementsByTagName('abbr')</code>&raquo; вернет &laquo;пустой&raquo; массив. Еще&nbsp;одна особенность <abbr title="Internet Explorer">IE</abbr>&nbsp;(и&nbsp;Opera)&nbsp;&mdash; имена тегов, в&nbsp;нашем случае, необходимо писать заглавными буквами: <code>.replace(/&lt;\/ABBR&gt;/g,&nbsp;'&lt;/SPAN&gt;')</code>, а&nbsp;не&nbsp;<code>.replace(/&lt;\/abbr>/,&nbsp;'&lt;/span>')</code>.</p>
<p>Мы&nbsp;заменили все&nbsp;<code>&lt;abbr&gt;</code> на&nbsp;<code>&lt;span&nbsp;class=&quot;abbr&quot;&gt;</code> тем&nbsp;самым добавили поддержку отображения текста, записанного в&nbsp;атрибут &laquo;<code>title</code>&raquo;, во&nbsp;&laquo;всплывающей&raquo; подсказке.</p>
<p><b>Пример:</b> <abbr title="Extensible Hypertext Markup Language">XHTML</abbr></p>
<p>Теперь оформим <code>&lt;span&nbsp;class=&quot;abbr&quot;&gt;</code> так&nbsp;же, как&nbsp;и&nbsp;<code>&lt;abbr&gt;</code> в&nbsp;<abbr title="Cascading Style Sheets">CSS</abbr>:</p>
<pre><code class="css">abbr, span.abbr {
/* стили для &lt;abbr&gt; */
} </code></pre>
<p>Добавим распознавание <abbr title="Internet Explorer">IE</abbr>&nbsp;и&nbsp;его версии, чтобы не&nbsp;выполнять замену для&nbsp;нормальных браузеров и&nbsp;<del>ненорм</del> <abbr title="Internet Explorer">IE</abbr>&nbsp;версии 7&nbsp;и&nbsp;выше:</p>
<pre><code class="javascript">var MSIE = 0/*@cc_on+@_jscript_version*10%10@*/;
function abbr() {
  if(MSIE &amp;&amp; MSIE &lt; 7) {
    var node = document.getElementsByTagName('body')[0];
    node.innerHTML = node.innerHTML
    .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
    .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
  }
}</code></pre>
<p>Переменная &laquo;<var>MSIE</var>&raquo; равна <var>0</var> если используется любой браузер, кроме <abbr title="Internet Explorer">IE</abbr>, или содержит номер версии &laquo;JScript&raquo;, поддерживаемый <abbr title="Internet Explorer">IE</abbr>:</p>
<ul>
<li><var>1</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.1&nbsp;в&nbsp;<abbr title="Internet Explorer 5.0">IE5.0</abbr></li>
<li><var>5</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.5&nbsp;в&nbsp;<abbr title="Internet Explorer 5.5">IE5.5</abbr></li>
<li><var>6</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.6&nbsp;в&nbsp;<abbr title="Internet Explorer 6.0">IE6.0</abbr></li>
<li><var>7</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.7&nbsp;в&nbsp;<abbr title="Internet Explorer 7">IE&nbsp;7.0</abbr>&nbsp;и&nbsp;8.0b1</li>
</ul>
<p>Таким&nbsp;образом, мы&nbsp;еще и&nbsp;отсекаем <abbr title="Internet Explorer 4">IE4</abbr>, т.&nbsp;к.&nbsp;результатом выполнения выражения &laquo;<code>0&nbsp;+&nbsp;@_jscript_version&nbsp;*&nbsp;10&nbsp;%&nbsp;10</code>&raquo; будет&nbsp;<var>0</var>.</p>
<p>Что&nbsp;же&nbsp;за&nbsp;конструкция &laquo;<code>/*@cc_on&nbsp;&hellip;&nbsp;@*/</code>&raquo; и&nbsp;переменная &laquo;<var>@_jscript_version</var>&raquo;? Первое&nbsp;&mdash; это&nbsp;&laquo;<a href="http://msdn.microsoft.com/en-us/library/ahx1z4fs%28VS.80%29.aspx" rel="external nofollow" hreflang="en">Conditional&nbsp;Compilation</a>&raquo;&nbsp;&mdash; условное выполнение в&nbsp;&laquo;JScript&raquo;. Это&nbsp;аналог &laquo;<a href="http://designformasters.info/posts/conditional-comments/" hreflang="ru">условных&nbsp;комментариев</a>&raquo; (<a href="http://msdn.microsoft.com/en-us/library/ms537512.aspx" rel="external nofollow" hreflang="en">Conditional&nbsp;Comments</a>), которые воспринимает только <abbr title="Internet Explorer">IE</abbr>, второе&nbsp;&mdash; зарезервированная переменная, в&nbsp;которой хранится номер версии &laquo;JScript&raquo;.</p>
<blockquote>
<p>Эта пляска с&nbsp;собачками называется &laquo;условное&nbsp;выполнение&raquo; (Conditional&nbsp;Compilation) и&nbsp;формально вообще не&nbsp;является JavaScript&#39;ом, это&nbsp;JScript. Если&nbsp;я&nbsp;не&nbsp;ошибаюсь, только его&nbsp;IE и&nbsp;понимает, а&nbsp;официальный JavaScript работает только благодаря довольно широкой совместимости этих&nbsp;языков.</p>
<address><cite><a href="http://pepelsbey.net/2008/05/five-stars/">Вадим Макеев</a></cite></address>
</blockquote>
<p>Браузеры, поддерживающие &laquo;JavaScript&raquo;, просто проигнорируют выражение внутри &laquo;<code>/*@cc_on&nbsp;&hellip;&nbsp;@*/</code>&raquo;, посчитав его&nbsp;за&nbsp;обычный комментарий вида &laquo;<code>/*&nbsp;&hellip;&nbsp;*/</code>&raquo;, и&nbsp;переменная &laquo;<var>MSIE</var>&raquo; останется равной&nbsp;<var>0</var>.</p>
<p>Получается, что&nbsp;выражение &laquo;<code>MSIE&nbsp;&amp;&amp;&nbsp;MSIE&nbsp;&lt;&nbsp;7</code>&raquo; будет равно &laquo;<var>true</var>&raquo; в&nbsp;случае если&nbsp;используется <abbr title="Internet Explorer 5.0">IE5.0</abbr>,&nbsp;5.5 или&nbsp;6.0, что&nbsp;собственно нам&nbsp;и&nbsp;требовалось.</p>
<p>Добавим кавычки для inline-цитат в&nbsp;<abbr title="Internet Explorer">IE</abbr> ниже 8-й&nbsp;версии:</p>
<pre><code class="javascript">function quote() {
  if(MSIE &amp;&amp; navigator.userAgent.search('MSIE 8.') == -1) {
    var i, list = document.getElementsByTagName('q'),
    length = list.length;
    for(i = 0; i &lt; length; i++)
      list[i].innerHTML = '&amp;laquo;' + list[i].innerHTML + '&amp;raquo;';
  }
}</code></pre>
<p><abbr title="Internet Explorer 8.0 beta 1">IE8b1</abbr>&nbsp;выдает такой же&nbsp;номер версии &laquo;JScript&raquo;, как&nbsp;и&nbsp;<abbr title="Internet Explorer 7">IE 7</abbr>, поэтому &laquo;отсекаем&raquo; его, используя поиск подстроки &laquo;<var>MSIE&nbsp;8.</var>&raquo; в&nbsp;строке, возвращаемой выражением &laquo;<code>navigator.userAgent</code>&raquo;.</p>
<p>Добавление кавычек выполняется заменой &laquo;<code>.innerHTML</code>&raquo; для&nbsp;каждого тега&nbsp;<code>&lt;q&gt;</code> на&nbsp;результат сложения 3-х&nbsp;строк: &laquo;<code>&amp;laquo;</code>&raquo;, &laquo;<code>list[i].innerHTML</code>&raquo; и&nbsp;&laquo;<code>&amp;raquo;</code>&raquo;, где&nbsp;&laquo;<code>list[i].innerHTML</code>&raquo;&nbsp;&mdash; <abbr title="Hypertext Markup Language">HTML</abbr>-код текущего тега <code>&lt;q&gt;</code> на&nbsp;каждом шаге цикла&nbsp;&laquo;<code>for</code>&raquo;, перебирающего по&nbsp;порядку все&nbsp;теги <code>&lt;q&gt;</code>, встречающиеся в&nbsp;документе. Вставляем именно &laquo;<code>&amp;laquo;</code>&raquo; и&nbsp;&laquo;<code>&amp;raquo;</code>&raquo;&nbsp;&mdash; &laquo;елочки&raquo;, потому&nbsp;что в&nbsp;русской типоргафике принято ставить кавычки такого вида. Можно пойти дальше и&nbsp;по правилам типографики оформить вложенные inline-цитаты, но&nbsp;такие случаи встречаются крайне редко, поэтому не&nbsp;будем усложнять код и&nbsp;остановимся на&nbsp;таком варианте.</p>
<p>Перепишем наш код более грамотно, чтобы не&nbsp;засорять глобальное пространство имен:</p>
<pre><code class="javascript">var correction = {
  MSIE: 0/*@cc_on+@_jscript_version*10%10@*/,
  abbr: function() {
    if(this.MSIE &amp;&amp; this.MSIE &lt; 7) {
      var node = document.getElementsByTagName('body')[0];
      node.innerHTML = node.innerHTML
      .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
      .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
    }
  },
  quote: function() {
    if(this.MSIE &amp;&amp; navigator.userAgent.search('MSIE 8.') == -1) {
      var i, list = document.getElementsByTagName('q'),
      length = list.length;
      for(i = 0; i &lt; length; i++)
        list[i].innerHTML = '&amp;laquo;' + list[i].innerHTML + '&amp;raquo;';
    }
  }
};</code></pre>
<p>Теперь объект &laquo;<var>correction</var>&raquo; содержит числовое значение &laquo;<var>MSIE</var>&raquo; и&nbsp;2&nbsp;функции: &laquo;<code>abbr</code>&raquo; и&nbsp;&laquo;<code>quote</code>&raquo;. Выполним эти&nbsp;функции по&nbsp;событию &laquo;<code>window.onload</code>&raquo;:</p>
<pre><code class="javascript">var correction = {
  MSIE: 0/*@cc_on+@_jscript_version*10%10@*/,
  abbr: function() {
    if(this.MSIE &amp;&amp; this.MSIE &lt; 7) {
      var node = document.getElementsByTagName('body')[0];
      node.innerHTML = node.innerHTML
      .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
      .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
    }
  },
  quote: function() {
    if(this.MSIE &amp;&amp; navigator.userAgent.search('MSIE 8.') == -1) {
      var i, list = document.getElementsByTagName('q'),
      length = list.length;
      for(i = 0; i &lt; length; i++)
        list[i].innerHTML = '&amp;laquo;' + list[i].innerHTML + '&amp;raquo;';
    }
  },
  fixIE: function(listener) {
    if(window.attachEvent) window.attachEvent('onload', function() {
      correction.abbr();
      correction.quote();
    });
  }
};

correction.fixIE();</code></pre>
<p>Мы&nbsp;добавили функцию &laquo;<code>fixIE</code>&raquo;, которая поместит в&nbsp;обработчик события &laquo;<code>window.onload</code>&raquo; запуск функций &laquo;<code>abbr</code>&raquo; и&nbsp;&laquo;<code>quote</code>&raquo;. Объект &laquo;<var>correction</var>&raquo; можно расширять, добавляя всевозможные &laquo;фиксы&raquo; для&nbsp;разных браузеров.</p>
<p>Теперь Вы&nbsp;можете использовать теги <code>&lt;abbr&gt;</code> и&nbsp;<code>&lt;q&gt;</code> на&nbsp;страницах Вашего сайта, не&nbsp;боясь, что&nbsp;для&nbsp;пользователей <abbr title="Internet Explorer">IE</abbr> они&nbsp;будут представлены в&nbsp;неправильном виде.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/abbr-%d0%b8-q-%d0%b2-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Расширение объекта Date языка JavaScript</title>
		<link>http://www.codeisart.ru/%d1%80%d0%b0%d1%81%d1%88%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%b0-date-%d1%8f%d0%b7%d1%8b%d0%ba%d0%b0-javascript/</link>
		<comments>http://www.codeisart.ru/%d1%80%d0%b0%d1%81%d1%88%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%b0-date-%d1%8f%d0%b7%d1%8b%d0%ba%d0%b0-javascript/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 10:12:43 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Переводы]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=190</guid>
		<description><![CDATA[Перевод статьи о расширении объектов JavaScript. Оригинал статьи тут Большинство приложений, особенно бизнес-приложений, как правило, требуют множество операций с датой и временем. Код этих операций может быть упрощен, если объект Date ядра JavaScript расширить собственными дополнительными методами. Данная статья рассказывает о том, как добавлять в объект Date пользовательские методы, значительно упрощающие работу с датой в [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод статьи о расширении объектов JavaScript.<br />
Оригинал статьи <a href="http://www.digital-web.com/articles/javascript_date_object_with_user_methods/">тут</a></p>
<p>Большинство приложений, особенно бизнес-приложений, как правило, требуют <strong class="normal">множество операций с датой и временем</strong>. Код этих операций может быть упрощен, если <strong class="normal">объект Date ядра JavaScript расширить собственными дополнительными методами</strong>. Данная статья рассказывает о том, как добавлять в <strong class="normal">объект Date</strong> пользовательские методы, значительно упрощающие <strong class="normal">работу с датой в языке JavaScript</strong> и которые будут наследоваться <strong class="normal">каждым экземпляром данного объекта</strong>. Описанная в данной статье техника так же может быть применима ко всем <strong class="normal">объектам ядра JavaScript</strong>.</p>
<p>Практически все созданные нами методы могут быть использованы самостоятельно, без необходимости создания остальных. Но нужно помнить, что некоторые методы зависят от copy(), lastday(), getDaysBetween() и getMonthsBetween().</p>
<p>Безусловно, все наши методы могут быть реализованы как глобальные функции, но, <strong class="normal">расширяя класс Date</strong>, мы получаем несколько преимуществ:</p>
<ul>
<li>при <strong class="normal">расширении объекта Date языка JavaScript</strong>,  глобальное пространство имен меньше загромождается, код более читаем, и производительность немного выше (хотя это только наносекунды);</li>
<li>наши методы будут обладать всеми преимуществами объектно-ориентированного программирования;</li>
</ul>
<p><span id="more-190"></span></p>
<p>Итак, приступим.</p>
<h2>Как это работает?</h2>
<p>Техника расширения использует преимущества реализации объектов в JavaScript. В основном, когда программисты говорят об объектно-ориентированном программировании (ООП), они подразумевают С++, Java или PHP. В этих языках строго типизированный класс определяет каждый объект – это все определяется до выполнения программы. Но JavaScript – <strong class="normal">это язык, основанный на прототипах</strong>. Функция-конструктор определяет каждый из объектов, а их методы могут быть расширены во время выполнения программы. Реализованные методы и свойства относятся к свойству прототипов функции конструктора, которое, по сути, также является объектом. Методы и свойства создаются объявлением, и новые или существующие экземпляры объектов наследуют их.</p>
<pre><code class="javascript">Date.prototype.method_name = function ([arguments]) {
  // Здесь идет код
};</code></pre>
<p>В этом примере анонимная функция присваивается атрибуту method_name объекта prototype. Синтаксис вызова метода:</p>
<pre><code class="javascript">date_instance.method_name([arguments]);</code></pre>
<p>Внутри кода метода ключевое слово this обращается к экземпляру объекта.<br />
Теперь понятно, как это работает, давайте сделаем встроенный объект Date немного более полезным!</p>
<h2>Копирование дат</h2>
<p>В языке языке JavaScript присваивание объектов создает ссылку на объект, а не его копию. В следующем коде переменная date1 инициализирована значением 10 Февраля 2008 и это значение присвоено date2.  Так как date2 не является копией date1, изменение числа на 20-ое касается только date1 и Alert выдает обе даты – 20 Февраля 2008. Они фактически являются одной и той же копией даты.</p>
<pre><code class="javascript">var date1 = new Date(2008, 1, 10);
var date2 = date1;
date2.setDate(20);
alert(date1 + &quot;\n&quot; + date2);</code></pre>
<p>Для копирования даты её нужно преобразовать в базовое значение (строковое, числовое или булевое) и создать новую дату. Метод getTime() идеально подходит для этого. Он возвращает внутреннее представление даты с точностью до миллисекунды и может быть использован в качестве аргумента для конструктора даты:</p>
<pre><code class="javascript">var oldDate = new Date(); // сегодня
var dateCopy = new Date(oldDate.getTime());</code></pre>
<p>Вместо написания этих строк везде, где они нужны, или создания глобальной функции мы добавим наследуемый метод copy() в конструктор Date:</p>
<pre><code class="javascript">Date.prototype.copy = function () {
  return new Date(this.getTime());
};</code></pre>
<p>Вот пример его использования:</p>
<pre><code class="javascript">var oldDate = new Date(2008, 1, 10);
var newDate = oldDate.copy();

newDate.setDate(20);
alert(oldDate + &quot;\n&quot; + newDate);</code></pre>
<p>Изменение newDate не влияет на oldDate. Даты, показанные в Alert это 10 февраля 2008 и 20 февраля 2008. Этот метод полезен, если вам нужно произвести несколько арифметических операций с датой, сохранив начальное её значение.</p>
<h2>Получение информации о дате</h2>
<p>Наши следующие четыре метода созданы для получения имени или аббревиатуры для недели или месяца. Создаются два массива: один для названий дней недели, второй для месяцев. Методы getDay() или getMonth() объекта Date возвращают указатель, использующийся для доступа к значению массива дней или месяцев.</p>
<p>Кроме описанных выше проблем с использованием глобальных функций здесь есть другая угроза. Массивы (всех переменных) – это не константы, и они очень чувствительны к изменениям. Константы могут быть объявлены ключевым словом const в новых версиях языка JavaScript, но это не поддерживается большинством браузеров. К счастью, JavaScript предлагает альтернативные решения.</p>
<p>Массивы можно создать как свойства конструктора даты, исключая их из глобального пространства имен. Это можно сделать двумя способами: как статические атрибуты или наследуемые атрибуты. Примером статического атрибута служит PI, который является статическим атрибутом объекта Math. Массивы добавляются в конструктор Date с помощью присваивания, как это показано ниже:</p>
<pre><code class="javascript">Date.DAYNAMES = [&quot;Sunday&quot;, &quot;Monday&quot;, &quot;Tuesday&quot;, &quot;Wednesday&quot;, &quot;Thursday&quot;, ..., &quot;Friday&quot;, &quot;Saturday&quot;];
Date.MONTHNAMES = [&quot;January&quot;, &quot;February&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;, &quot;June&quot;, &quot;July&quot;, ..., &quot;August&quot;, &quot;September&quot;, &quot;October&quot;, &quot;November&quot;, &quot;December&quot;];</code></pre>
<p>Получить доступ к массивам можно  следующим образом:</p>
<pre><code class="javascript">Date.DAYNAMES[index];</code></pre>
<p>Второй вариант – это <strong class="normal">создание аттрибутов массива в объекте prototype конструктора даты</strong>:</p>
<pre><code class="javascript">Date.prototype.DAYNAMES = [&quot;Sunday&quot;, &quot;Monday&quot;, &quot;Tuesday&quot;, &quot;Wednesday&quot;, &quot;Thursday&quot;, ..., &quot;Friday&quot;, &quot;Saturday&quot;];
Date.prototype.MONTHNAMES = [&quot;January&quot;, &quot;February&quot;, &quot;March&quot;, &quot;April&quot;, &quot;May&quot;, &quot;June&quot;, &quot;July&quot;, ..., &quot;August&quot;, &quot;September&quot;, &quot;October&quot;, &quot;November&quot;, &quot;December&quot;];</code></pre>
<p>Разница между этими двумя подходами в том, что они наследуются и доступны методам Date только при использовании ключевого слова this (этот метод будет использоваться на протяжении всей статьи).</p>
<p>Существует третий вариант – мы можем делать и то, и другое. Например:</p>
<pre><code class="javascript">Date.DAYNAMES = [&quot;Sunday&quot;, &quot;Monday&quot;, &quot;Tuesday&quot;, &quot;Wednesday&quot;, &quot;Thursday&quot;, ..., &quot;Friday&quot;, &quot;Saturday&quot;];
Date.prototype.DAYNAMES = Date.DAYNAMES;</code></pre>
<p>(Поднимая тему статических атрибутов и методов, необходимо упомянуть, что представленные методы могут быть не статическими, но относящимися к объекту prototype. Потребуются небольшие изменения, чтобы преобразовать эти методы в статические.)</p>
<p>А вот возможность сделать ваш код интернациональным. Код DAYNAMES и MONTHNAMES может быть отделен от других методов, так что можно установить названия дней и месяцев на разных языках:</p>
<pre><code class="javascript">Date.prototype.DAYNAMES = [&quot;Dimanche&quot;, &quot;Lundi&quot;, &quot;Mardi&quot;, &quot;Mercredi&quot;, &quot;Jeudi&quot;, ..., &quot;Vendredi&quot;, &quot;Samedi&quot;];
Date.prototype.MONTHNAMES = [&quot;Janvier&quot;, &quot;Fevrier&quot;, &quot;Mars&quot;, &quot;Avril&quot;, &quot;Mai&quot;, ..., &quot;Juin&quot;, &quot;Juillet&quot;, &quot;Aout&quot;, &quot;Septembre&quot;, &quot;Octobre&quot;, &quot;Novembre&quot;, &quot;Decembre&quot;];</code></pre>
<p>С массивами на месте, четыре метода могут быть заданы следующим образом:</p>
<pre><code class="javascript">Date.prototype.getFullDay = function() {
  return this.DAYNAMES[this.getDay()];
};
Date.prototype.getDayAbbr = function() {
  return this.getFullDay().slice(0, 3);
};

Date.prototype.getFullMonth = function() {
  return this.MONTHNAMES[this.getMonth()];
};
Date.prototype.getMonthAbbr = function() {
  return this.getFullMonth().slice(0, 3);
};</code></pre>
<p>А вот образец использования этих методов:</p>
<pre><code class="javascript">var example_date = new Date(2008, 1, 20);
alert("Day: " + example_date.getFullDay() +
  "\nDay abbr: " + example_date.getDayAbbr() +
  "\nMonth: " + example_date.getFullMonth() +
  "\nMonth Abbr: " + example_date.getMonthAbbr());</code></pre>
<p>Alert покажет:<br />
Day: Wednesday<br />
Day abbr: Wed<br />
Month: February<br />
Month: Abbr Feb</p>
<h2>Задание формата времени дня</h2>
<p><strong class="normal">Объект Date</strong> содержит 2 метода для получения строкового представления времени суток: toTimeString() и toLocaleTimeString(). Формат строки зависит от настроек клиента и может отличаться у разных пользователей. В общем, это все хорошо, но может не работать в вашем приложении. Следующие два метода возвращают определенный формат:<br />
Первый возвращает время в формате “чч:мм:сс am/pm” с двумя цифрами в каждом числе.</p>
<pre><code class="javascript">Date.prototype.to12HourTimeString = function () {
  var h = thi  s.getHours();
  var m = "0" + this.getMinutes();
  var s = "0" + this.getSeconds();
  var ap = "am";

  if (h >= 12) {
      ap = "pm";

      if (h >= 13)
        h -= 12;
    } else if (h == 0)
      h = 12;
    }
  h = "0" + h;
  return h.slice(-2) + ":" +
           m.slice(-2) + ":" +
           s.slice(-2) + " " + ap;
};</code></pre>
<p>Второй метод возвращает время в 24-часовом формате, также с двумя цифрами в каждом числе.</p>
<pre><code class="javascript">Date.prototype.to24HourTimeString = function () {
  var h = "0" + this.getHours();
  var m = "0" + this.getMinutes();
  var s = "0" + this.getSeconds();
  return h.slice(-2) + ":" + m.slice(-2) + ":" + s.slice(-2);
};</code></pre>
<p>Наверное, в этом коде интересно только использование slice(). Чтобы сделать числа двузначными, к ним  добавляется ведущий ноль, и затем slice() используется для захвата крайних справа 2 цифр. Если число меньше 10, включается дополнительный ведущий ноль. Эти методы используются вот так:</p>
<pre><code class="javascript">var dte = new Date(2008, 1, 20, 19, 30, 5);
alert(dte.to12HourTimeString() + "\n" + dte.to24HourTimeString());</code></pre>
<p>Alert покажет:<br />
07:30:05 pm<br />
19:30:05</p>
<h2>Получение количества дней в месяце</h2>
<p>Бывает, что необходимо узнать количество дней в месяце.  Для этого можно использовать массив с дополнительным кодом для Февраля, но есть способ проще. JavaScript переполнит даты, созданные с недопустимыми значениями. Например, если мы создадим дату 33 февраля 2008 как:</p>
<pre><code class="javascript">var d = new Date(2008, 1, 33);
alert(d);</code></pre>
<p>Дата, созданная и отображенная в окне, &#8212; это 4 марта 2008 (2008 год – високосный).<br />
Следовательно, мы можем сказать, что последний день месяца – и число дней в месяце – это «нулевой» день следующего месяца – один день до первого. Следующий месяц  вычисляется как текущий месяц (date.getMonth()) плюс один. JavaScript возвратит Январь следующего месяца, если прибавить 1 к Декабрю, то есть года переводятся так же, как и месяцы. Последний день месяца вычисляется так:</p>
<pre><code class="javascript">Date.prototype.lastday = function() {
  var d = new Date(this.getFullYear(), this.getMonth() + 1, 0);
  return d.getDate();
};</code></pre>
<p>Число дней в месяце любой даты находится следующим образом:</p>
<pre><code class="javascript">var d = new Date(2008, 1, 5);
alert(d.lastday());</code></pre>
<p>Окно предупреждения покажет число дней в месяце: в этом примере – 29. (Второй аргумент, 1, в конструкторе Date это Февраль, Январь – 0.)</p>
<h2>Поиск количества дней между двумя датами</h2>
<p>Деловые проекты часто нуждаются в определении количества дней между двумя датами. Мы создадим метод getDaysBetween() – но сначала давайте добавим ещё один атрибут к прототипу конструктора даты, названный msPERDAY. Его значение – это число миллисекунд в 24 часах. Все что нам нужно – эта строка кода:</p>
<pre><code class="javascript">Date.prototype.msPERDAY = 1000 ∗ 60 ∗ 60 ∗ 24;</code></pre>
<p>Другими словами, 1000 миллисекунд в секунде, 60 секунд в минуте, 60 минут в одном часе, 24 часа в сутках.</p>
<p>В большинстве случаев, определение количества дней между двумя датами исключает учет времени. Это требование мы будем использовать. Между 1 февраля и 10 февраля 9 дней, не обращая внимания на время – в одной дате может быть 01 00 часов, а в другой 23 00, но разница &#8212; всё равно 9 дней.  Несмотря на это даты JavaScript включают время, так что необходимо корректирование:</p>
<pre><code class="javascript">Date.prototype.getDaysBetween = function(d) {
  d = d.copy();

  d.setHours(this.getHours(), this.getMinutes(), this.getSeconds(), ...
    this.getMilliseconds());

  var diff = d.getTime() - this.getTime();
  return (diff)/this.msPERDAY;
};</code></pre>
<p>В данном коде, новая дата создается с таким же значением, что и аргумент, чтобы избежать изменения исходной даты. Временная часть новой даты поставлена, чтобы соответствовать времени даты, вызывающей метод,  исключающий влияние времени дня.<br />
Метод используется следующим образом:</p>
<pre><code class="javascript">var today = new Date();
var birthday = new Date(2008, 9, 31);
var days = today.getDaysBetween(birthday);

if (days > 0)
  alert(days + " days 'til my birthday.");
else if (days < 0)
  alert(days + " days since my birthday.");
else
  alert("It's my birthday!!");</code></pre>
<p>Если дата, используемая как аргумент позже, чем дата, вызывающая метод, то возвращается положительное значение. Отрицательное значение возвращается, если аргумент – более ранняя дата. Может возвращаться и абсолютное значение, но знание того, какая дата была раньше, может быть важным, как в примере.</p>
<h2>Использование представлений данных как аргумента</h2>
<p>Метод getDaysBetween(d), показанный выше, принимает <strong class="normal">объект Date</strong> в качестве своего аргумента, но может быть удобнее использовать другие типы данных для представления даты. Конструктор Date имеет четыре различных процедуры:</p>
<pre><code class="javascript">new Date(); // без аргумента, использует текущее время и дату
new Date("Feb 20, 2008 10:20:05"); // символьное представление даты
new Date(2008, 1, 20, 10, 20, 05); // числовое представление даты
new Date(milliseconds); // число миллисекунд</code></pre>
<p>Любой из методов, которые мы создаем, использующий дату как аргумент, может быть преобразован, чтобы принимать любые аргументы, распознанные конструктором данных, с добавлением следующего кода:</p>
<pre><code class="javascript">Date.prototype.getDaysBetween = function(d) {
  var d2;

  // дополнительный код для свойств аргументов
  if (arguments.length == 0) {
    d2 = new Date():
  } else if (d instanceof Date) {
    d2 = new Date(d.getTime());
  } else if (typeof d == "string") {
    d2 = new Date(d);
  } else if (arguments.length >= 3) {
    var dte = [0, 0, 0, 0, 0, 0];
    for (var i = 0; i < arguments.length; i++) {
      dte  [i] = arguments[i];
    }
    d2 = new Date(dte[0], dte[1], dte[2], dte[3], dte[4], ...
      dte[5]);
  } else if (typeof d == "number") {
    d2 = new Date(d);
  } else {
    return null;
  }

  if (d2 == "Invalid Date")
    return null;
  // Конец дополнительного кода

  d2.setHours(this.getHours(), this.getMinutes(), ...
    this.getSeconds(), this.getMilliseconds());

  var diff = d2.getTime() - this.getTime();
  return (diff)/this.msPERDAY;
};</code></pre>
<p>Если используемый аргумент не преобразуется в дату, конструктор создает экземпляр даты со значением “Invalid Date”. В этом случае возвращается ноль.<br />
(Мы всегда будем считать, что аргумент – это дата, чтобы уберечь статью от путаницы.)</p>
<h2>Добавление дней, недель, месяцев и лет к дате</h2>
<p>Для изменения даты прибавлением (или вычитанием) числа к ней используются 4 метода – addDays(), addWeeks(), addMonths() и addYears(). Каждый  метод берет числовой аргумент, означающий количество дней, месяцев или лет, которые нужно добавить как подходящие к методу. Код для этих методов следующий:</p>
<pre><code class="javascript">Date.prototype.addDays = function(d) {
  this.setDate( this.getDate() + d );
};

Date.prototype.addWeeks = function(w) {
  this.addDays(w ∗ 7);
};

Date.prototype.addMonths= function(m) {
  var d = this.getDate();
  this.setMonth(this.getMonth() + m);

  if (this.getDate() < d)
    this.setDate(0);
};

Date.prototype.addYears = function(y) {
  var m = this.getMonth();
  this.setFullYear(this.getFullYear() + y);

  if (m < this.getMonth()) {
    this.setDate(0);
  }
};</code></pre>
<p>Первый метод, addDays(), использует тот же принцип, что и метод lastDay(). Метод getDate() объекта даты возвращает число дней в месяце (от 1 до 31). К нему прибавляется количество дополнительных дней, и затем метод setDate объекта Date устанавливает день месяца на новое значение. Когда число, используемое как дата превышает (или становится меньше чем) количество дней в месяце, JavaScript отсчитывает дни вперед(или назад) до правильной даты.<br />
Метод addWeeks() преобразует недели в дни, а затем использует метод addDays() для  изменения даты. Если, например, дата – Среда, то новая дата будет – Среда.</p>
<p>Методы addMonths() и addYears() работают также, как addDays(). Они используют <strong class="normal">методы объекта Date getMonth и setMonth() или getFullYear и setFullYear()</strong> соответствено. У этих методов есть корректировка для согласования неравных длин месяцев или лет.</p>
<p>Добавляя месяцы, нужно ожидать, что новая дата будет тем же днем месяца – если месяц прибавлен ко 2 января какого-либо года, то результат должен быть 2 февраля - но, если месяц добавлен к 31 января, то результат без корректировки это 3 марта( 2 марта если год – високосный). Для наших целей должен был получиться последний день Февраля, поэтому есть тест для проверки является ли день месяца, полученный в результате, меньше, чем исходная дата. Если получилось так, это показывает, что дата отодвинулась в месяц, следующий за тем, который нам нужен. Отладка использует тот же способ, что и метод lastDay(): дата устанавливается на нулевой день.</p>
<p>Метод addYears имеет похожие проблемы в високосные годы. Прибавляя год к  29 февраля, получим 1 марта, поэтому необходимо вернуться в 28.<br />
Методы могут использоваться вот так:</p>
<pre><code class="javascript">var date = new Date(2008, 1, 1); // 1ое февраля 2008
alert(date.addDays(7));
alert(date.addWeeks(3));
alert(date.addMonths(2));
alert(date.addYears(-2));</code></pre>
<p>Alert-ы покажут 8 февраля, 29 февраля, 29 апрель.</p>
<h2>Добавление дней недели</h2>
<p>В некоторых бизнес приложениях считаются только дни недели – может появиться проблема во время подсчета даты окончания проекта, а вы не хотите работать в выходные! Следующий метод добавляет количество дней недели, считающихся выходными, так что период между начальной и новой датами включает в себя требуемое число дней в неделе.</p>
<pre><code class="javascript">Date.prototype.addWeekDays = function(d) {
  var startDay = this.getDay();  //текущий день недели от 0 до 6
  var wkEnds = 0;  //число нужных выходных
  var partialWeek = d % 5;  //количество дней для неполной недели

  if (d < 0) {  //вычитание дней недели
    wkEnds = Math.ceil(d/5); //отрицательное количество выходных

    switch (startDay) {
    case 6:  //начинаем с субботы, на 1 выходной меньше
      if (partialWeek  0 &#038;&#038; wkEnds < 0)
        wkEnds++;
      break;
    case 0:  //начальный день - воскресенье
      if (partialWeek  0)
        d++;  //уменьшаем добавленные дни
      else
        d—;  // увеличиваем добавленные дни
      break;
    default:
      if (partialWeek <= -startDay)
      wkEnds—;
    }
  }
  else if (d > 0) {  //adding weekdays
    wkEnds = Math.floor(d/5);
    var w = wkEnds;
    switch (startDay) {
    case 6:
      // Если начальный день – суббота и
      // неделя полная, нужно уменьшить дни на 1
      // неделя неполная, нужно увеличить дни на 1
      if (partialWeek 0)
        d--;
      else
        d++;
      break;
    case 0:
      //Sunday
      if (partialWeek 0 &#038;&#038; wkEnds > 0)
        wkEnds—;
      break;
    default:
      if (5 – day < partialWeek)
        wkEnds++;
    }
  }

  d += wkEnds ∗ 2;
  this.addDays(d);
};</code></pre>
<p>Метод addWeekDays() вычисляет количество выходных дней, которые будут нужны в диапазоне дат, и добавляет его к требуемым дням недели. Эта сумма прибавляется к дате, с помощью нашего метода addDays(). addWeekDays() всегда вычисляет дату с понедельника по пятницу включительно. Например, сейчас суббота и мы завершаем планирование проекта, который начинается в понедельник. Мы определили, что проект займет 50 дней и хотим вычислить дату завершения. Следующий код сделает это:</p>
<pre><code class="javascript">var today = new Date(2008, 1, 23);
var endDate = today.copy();
endDate.addWeekDays(50);
alert(endDate);
Alert покажет 2 мая 2008.
К несчастью, менеджеры решили, что проект должен быть перенесен, так что он закончится 31 октября. Они хотят знать, когда вам нужно начать.
var endDate = new Date(2008, 9, 31);
var startDate = endDate.copy();
startDate.addWeekDays(-50);
alert(startDate);</code></pre>
<p>Alert покажет 22 августа 2008, последний день, когда проект можно начать, разумно ожидая закончить его в последний день октября.</p>
<p>Этот код не считает выходные или другие дни, когда фирма не работает. Для подсчета выходных мы можем добавить в addWeekDays() цикл, который повышает число требуемых дней в диапазоне от начальной даты до конечной на 1 в каждый выходной день. Вот пример функции:</p>
<pre><code class="javascript">function due_date(start_date, workDays) {
  var dueDate = new Date();
  var days = 0;
  var holidays = 0;

  do {
    dueDate.setYear(start_date.getFullYear());
    dueDate.setMonth(start_date.getMonth());
    dueDate.setDate(start_date.getDate());

    days = workDays + holidays;
    dueDate.addWeekDays(days);

    // Ваш собственный поиск.
    // Поиск по базе данных или массиву
    // выходных дней между  start_date и dueDate
    holidays = [query-results]

  } while (days != workDays + holidays);

  return dueDate;
}</code></pre>
<p>(Функция due_date() не является средством объекта Date, так как она требует внешний источник данных, который может измениться.)<br />
Функция due_date() предполагает, что существует источник данных (массив или база данных), содержащий даты всех выходных дней вашей компании, и что у вас есть возможность сделать запрос к этой таблице, возвращающий количество выходных дней, встретившихся между двумя датами.</p>
<p>Цикл начинается с установки dueDate на start_date. Он добавляет число выходных дней (с нулевым  начальным значением) к рабочим дням и использует метод addWeekDays() для получения срока выполнения. Запрос получает количество выходных дней между начальной датой и сроком завершения( исключая те, что выпадают на субботу и воскресенье). Если количество выходных в сумме с начальным числом рабочих дней даёт количество дней, использующихся для вычисления значения конечной даты, то работа окончена. В противном случае, значение срока завершения сбрасывается, и цикл запускается ещё раз с новым количеством выходных.</p>
<h2>Вычисление времени между двумя датами</h2>
<p>Во многих деловых приложениях необходимо определить время между двумя датами в днях, месяцах, годах или днях недели. Мы уже создали метод для подсчета дней между двуся датами: getDaysBetween().</p>
<p>Вместе с addWeekDays() может работать getWeekDays(). Она вычисляет количество дней между двумя датами. Так же, как addWeekDays, этот метод не учитывает выходные дни при вычислении, но его можно включить в функцию, которая сделает это.</p>
<pre><code class="javascript">Date.prototype.getWeekDays = function(d) {

  var wkEnds = 0;
  var days = Math.abs(this.getDaysBetween(d));
  var startDay = 0, endDay = 0;

  if (days) {
    if (d < this) {
      startDay = d.getDay();
      endDay = this.getDay();
    } else {
      startDay = this.getDay();
      endDay = d.getDay();
    }
    wkEnds = Math.floor(days/7);

    if (startDay != 6 &#038;&#038; startDay > endDay)
      wkEnds++;

    if (startDay != endDay &#038;&#038; (startDay  6 || endDay  6) )
      days-;

    days -= (wkEnds ∗ 2);
  }
  return days;
};</code></pre>
<p>Этот код определяет, какое количество выходных дней необходимо вычесть из общего количества дней между двумя датами. Кроме того, в отличие от других методов, он возвращает абсолютное значение вместо числа со знаком. Вот пример его использования:</p>
<pre><code class="javascript">var endDate = new Date(2007, 11, 5); // 5-е декабря 2007
var startDate = new Date(2008, 1, 20); // 20-е февраля 2008
alert(startDate.getWeekDays(endDate));</code></pre>
<p>Alert покажет 55, число выходных дней между двумя датами.</p>
<p>Простой алгоритм, вычисляющий количество месяцев между двумя датами может выглядеть так:</p>
<pre><code class="javascript">var d1 = this.getFullYear() ∗ 12 + this.getMonth();
var d2 = d.getFullYear() ∗ 12 + d.getMonth();
return d2 - d1;</code></pre>
<p>Данный алгоритм  будет работать для дат, содержащих в себе несколько лет, когда разбиение на месяцы не так существенно.<br />
Подсчет количества месяцев между двумя датами осложняется, так как бывают неполные месяцы для каждой из дат – очевидно, что между 1 января и 28 февраля больше 1 месяца. Дни, включаемые в часть месяца, зависят от хронологического порядка дат. Нам требуются только дни от даты до конца месяца или с 1-го дня месяца до даты. Нам также нужно возвратить отрицательное значение, если дата, используемая как аргумент, стоит раньше другой.</p>
<pre><code class="javascript">Date.prototype.getMonthsBetween = function(d) {
  var sDate, eDate;
  var d1 = this.getFullYear() ∗ 12 + this.getMonth();
  var d2 = d.getFullYear() ∗ 12 + d.getMonth();
  var sign;
  var months = 0;

  if (this == d) {
    months = 0;
  } else if (d1 == d2) { //тот же год и месяц
    months = (d.getDate() - this.getDate()) / this.lastday();
  } else {
    if (d1 <  d2) {
      sDate = this;
      eDate = d;
      sign = 1;
    } else {
      sDate = d;
      eDate = this;
      sign = -1;
    }

    var sAdj = sDate.lastday() - sDate.getDate();
    var eAdj = eDate.getDate();
    var adj = (sAdj + eAdj) / sDate.lastday() - 1;
    months = Math.abs(d2 - d1) + adj;
    months = (months ∗ sign)
  }
  return months;
};</code></pre>
<p>Две даты конвертируются в количество полных месяцев от общей точки – год 1. Затем происходит разветвление  кода, в зависимости от хронологического порядка дат. Если даты одинаковы, то номер месяцев - ноль. Если даты относятся к одному году и месяцу, то число месяцев – это разница между датами, поделенная на количество дней в месяце. Иначе, создаются переменные ссылочного типа, показывающие, какая дата более ранняя. После этого вычисляется количество дней, оставшихся в начальной дате, и количество дней в последнем месяце, которое является днем месяца, затем полученная сумма делится на количество дней в более раннем из двух месяцев.</p>
<p>Количество дней в начальном месяце используется как делитель, потому что сумма будет равна номеру дней в начальном месяце, если даты одинаковы.<br />
После создания getMonthsBetween() можно легко написать метод, вычисляющий количество лет между двумя датами. Только необходимо разделить количество месяцев между ними на 12:</p>
<pre><code class="javascript">Date.prototype.getYearsBetween = function(d) {
  var months = this.getMonthsBetween(d);
  return months/12;
};</code></pre>
<p>Метод особого назначения getAge() может быть написан, используя getYearsBetween() следующим образом:</p>
<pre><code class="javascript">Date.prototype.getAge = function() {
  var today = new Date();
  return this.getYearsBetween(today).toFixed(2);
};</code></pre>
<p>А использовать его можно вот так:</p>
<pre><code class="javascript">var dateOfBirth = new Date(yob, mob, dob);
var age = dateOfBirth.getAge();</code></pre>
<p>Последний метод, sameDayEachWeek(), немного отличается от остальных. Он возвращает массив с датами для определенного дня недели – от воскресенья  до субботы – для каждой недели между двумя датами. Его можно использовать в приложении, которое требует планирование постоянных событий.</p>
<pre><code class="javascript">Date.prototype.sameDayEachWeek = function (day, date) {
  var aDays = new Array();
  var eDate, nextDate, adj;

  if (this > date) {
    eDate = this;
    nextDate = date.copy();
  } else {
    eDate = date;
    nextDate = this.copy();
  }

  adj = (day - nextDate.getDay() + 7) % 7;
  nextDate.setDate(nextDate.getDate() + adj);

  while (nextDate < eDate) {
    aDays[aDays.length] = nextDate.copy();
    nextDate.setDate(nextDate.getDate() + 7);
  }
  return aDays;
};</code></pre>
<p>Метод использует в качестве аргументов значение дня недели (от 0 - для воскресенья, до 6 - для субботы) и дату.<br />
Первая часть кода вычисляет, какая дата является ранней. В ней генерируется дата для увеличения, nextDate, которая является копией более ранней даты, как начальной точки, и ссылку к более поздней дате, как конечной точки. Новый объект Date используется для nextDate, так что он может быть изменен без влияния на начальную дату.<br />
Затем вычисляется дата первого дня недели, который нам необходим. Перед добавлением необходимо произвести вычитание из переменной date, так как вычитание приводит строку в числовую форму (если просматривается переменная строкового типа), таким будет произведено сложение чисел, а не их конкатенация (т. е. объединение строк, а не арифметическая операция сложения).<br />
После этого, в цикле выполняется nextDate для каждого из семи дней, до тех пор, пока дата не выйдет из диапазона. Каждый проход добавляет новый объект Date в возвращаемый массив.<br />
Метод можно использовать следующим образом:</p>
<pre><code class="javascript">var enddate = new Date(2008, 0, 5); // 5ое января 2008
var date = new Date(2008, 1, 10); // 10ое февраля 2008

var listofdays = date.sameDayEachWeek(2, enddate); // 2 = вторник
alert("Tuedays in range are:\n\n" + listofdays.join("\n"));</code></pre>
<p>Команда Alert выдаст следующее:<br />
Tuedays in range are:</p>
<p>Tue Jan 08 2008 00:00:00 GMT-0600 (Central Standard Time)<br />
Tue Jan 15 2008 00:00:00 GMT-0600 (Central Standard Time)<br />
Tue Jan 22 2008 00:00:00 GMT-0600 (Central Standard Time)<br />
Tue Jan 29 2008 00:00:00 GMT-0600 (Central Standard Time)<br />
Tue Feb 05 2008 00:00:00 GMT-0600 (Central Standard Time)</p>
<h2>Заключение</h2>
<p>Многие из показанных методов могут быть использованы самостоятельно, без остальных. Главное помнить о том, что некоторые методы зависят от copy(), lastday(), getDaysBetween() и getMonthsBetween(), а некоторые – от трех созданных свойств. Таким образом, Вы сможете написать только нужный Вашему проекту код.</p>
<p>Также, методы могут быть добавлены в любой другой встроенный конструктор объектов – Array, String, Math, Object – используя такой же способ: присваивать их атрибуту prototype.</p>
<p>Надеемся, Вы найдете эту статью полезной в Вашей работе.  Вы с легкостью сможете <strong class="normal">расширить встроенные объекты JavaScript</strong> с помощью вашего собственного кода и <strong class="normal">добавить Ваши собственные методы</strong>. <strong class="normal">Добавление методов через prototype</strong> делает Ваш код более понятным и добавляет ему преимущества в выполнении (благодаря способу обработки ссылок на <strong class="normal">объекты в JavaScript</strong> – сначала он ищет локальные объекты и затем проходит по цепочке прототипов, глобальное пространство – это последнее место, где JavaScript выполнит поиск).</p>
<blockquote><p><b>Спонсор поста</b>: Агентство &laquo;Web++&raquo;&nbsp;&mdash;&nbsp;создание и <a href="http://www.webpp.ru/service/seo" title="Создание и продвижение сайтов в Волгограде">продвижение сайтов в Волгограде</a>.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/%d1%80%d0%b0%d1%81%d1%88%d0%b8%d1%80%d0%b5%d0%bd%d0%b8%d0%b5-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d0%b0-date-%d1%8f%d0%b7%d1%8b%d0%ba%d0%b0-javascript/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Работа со строками в JavaScript</title>
		<link>http://www.codeisart.ru/%d0%a0%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81%d0%be-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b0%d0%bc%d0%b8-%d0%b2-javascript/</link>
		<comments>http://www.codeisart.ru/%d0%a0%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81%d0%be-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b0%d0%bc%d0%b8-%d0%b2-javascript/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 10:46:09 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Переводы]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=155</guid>
		<description><![CDATA[Описание работы со строками в языке JavaScript. Выделение подстроки, склейка строк и прочие методы.]]></description>
			<content:encoded><![CDATA[<p>Перевод статьи &laquo;Strings&raquo;<br />Оригинал: <a href="http://www.quirksmode.org/js/strings.html" hreflang="en" rel="original" rev="translation">quirksmode.org/js/strings.htm</a></p>
<p><img src="http://www.codeisart.ru/wp-content/uploads/2008/07/string.jpg" alt="string" width="182" height="264" class="left" />В&nbsp;этой статье речь пойдет о&nbsp;том, что&nbsp;такое <strong class="normal"><dfn>строки</dfn> в&nbsp;JavaScript</strong> и&nbsp;методах работы с&nbsp;ними.</p>
<p><dfn>Строки</dfn>&nbsp;&mdash; это&nbsp;просто группы символов, такие&nbsp;как &laquo;<samp>JavaScript</samp>&raquo;, &laquo;<samp>Hello&nbsp;world!</samp>&raquo;, &laquo;<samp>http://www.quirksmode.org</samp>&raquo; или&nbsp;даже &laquo;<samp>14</samp>&raquo;. Для&nbsp;программирования на&nbsp;JavaScript Вам&nbsp;необходимо знать, что&nbsp;такое строки и&nbsp;как&nbsp;с&nbsp;ними работать, т.&nbsp;к.&nbsp;использовать их&nbsp;придется очень часто. Многие вещи, такие&nbsp;как <abbr title="Uniform Resource Locator">URL</abbr>-страницы, значения <abbr title="Cascading Style Sheets">CSS</abbr>-параметров и&nbsp;элементов ввода форм&nbsp;&mdash; все&nbsp;является строками.</p>
<p>Сначала постараюсь объяснить <strong class="normal"><a href="http://www.codeisart.ru/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81%D0%BE-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8-%D0%B2-javascript/#basics">основы</a> работы со строками</strong>, затем&nbsp;&mdash; разницу между <a href="http://www.codeisart.ru/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81%D0%BE-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8-%D0%B2-javascript/#strings-numbers">строками и&nbsp;числами</a> в&nbsp;JavaScript. Даже если у&nbsp;Вас есть опыт программирования на&nbsp;другом языке, внимательно прочтите эту&nbsp;часть. В&nbsp;конце я&nbsp;расскажу о&nbsp;самых важных <strong class="normal"><a href="http://www.codeisart.ru/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81%D0%BE-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8-%D0%B2-javascript/#method-property">методах и&nbsp;свойствах</a> строк в&nbsp;JavaScript</strong>.</p>
<p><span id="more-155"></span></p>
<h3 id="basics">Основы работы со строками</h3>
<p>Давайте рассмотрим основы работы со&nbsp;строками в&nbsp;JavaScript.</p>
<h4>Использование кавычек</h4>
<p>Когда Вы объявляете <strong class="normal">строки в&nbsp;JavaScript</strong> или работаете с&nbsp;ними, всегда заключайте их&nbsp;в&nbsp;одинарные или&nbsp;двойные кавычки. Этим&nbsp;Вы объясняете браузеру, что&nbsp;он&nbsp;имеет дело со&nbsp;строкой. Не смешивайте использование кавычек в&nbsp;коде, если Вы&nbsp;начали строку с&nbsp;одинарной кавычки, а&nbsp;закончили двойной, JavaScript не&nbsp;поймет, что&nbsp;Вы&nbsp;имели в&nbsp;виду. Как правило, я&nbsp;использую одинарные кавычки для работы со&nbsp;строками, так&nbsp;как&nbsp;двойные кавычки я&nbsp;решил использовать для <abbr title="Hypertext Markup Language">HTML</abbr>, а&nbsp;одинарные&nbsp;&mdash; для JavaScript. Конечно,&nbsp;Вы&nbsp;можете делать все&nbsp;по-другому, но&nbsp;я&nbsp;советую вам&nbsp;придумать подобное правило для&nbsp;себя.</p>
<p>Давайте представим две строки, которые мы&nbsp;будем использовать на&nbsp;протяжении всей статьи:</p>
<pre><code class="javascript">var a = &#39;Hello world!&#39;;
var b = &#39;I am a student.&#39;;</code></pre>
<p>Сейчас мы&nbsp;объявили две переменные, &laquo;<var>a</var>&raquo; и &laquo;<var>b</var>&raquo;, и&nbsp;присвоили им&nbsp;строковые значения. После этого мы&nbsp;можем с&nbsp;ними работать, но&nbsp;сначала решим одну проблему: допустим, я&nbsp;написал:</p>
<pre><code class="javascript">var b = &#39;I&#39;m a student.&#39;;</code></pre>
<p>Строка содержит в&nbsp;себе лишнюю одинарную кавычку, и&nbsp;JavaScript думает, что&nbsp;строка закончена и&nbsp;выводит сообщение об&nbsp;ошибке, не&nbsp;понимая, что&nbsp;следует дальше. Поэтому Вам&nbsp;нужно <strong class="normal">экранировать кавычку</strong>, сообщая браузеру, что&nbsp;её&nbsp;нужно рассматривать как&nbsp;символ, а&nbsp;не&nbsp;как&nbsp;окончание строки. Это&nbsp;осуществляется с&nbsp;помощью &laquo;обратного&nbsp;слеша&raquo; перед кавычкой:</p>
<pre><code class="javascript">var b = &#39;I\&#39;m a student.&#39;;</code></pre>
<p>Заметьте,&nbsp;что&nbsp;Вы&nbsp;можете вставлять в&nbsp;строку двойные кавычки без&nbsp;их&nbsp;экранирования. Так как&nbsp;Вы&nbsp;используете одинарные кавычки, как&nbsp;начало и&nbsp;конец строки,</p>
<pre><code class="javascript">var b = &#39;I\&#39;m a &quot;student&quot;.&#39;;</code></pre>
<p>воспринимается без&nbsp;проблем. Двойные кавычки автоматически рассматриваются, как&nbsp;части строки, а&nbsp;не&nbsp;команды.</p>
<h4>Встроенные функции</h4>
<p>После определения строк можно начать их&nbsp;использование. Например,&nbsp;Вы&nbsp;можете <strong class="normal">соединить одну строку с&nbsp;другой</strong>, или&nbsp;взять из&nbsp;строки&nbsp;&laquo;<var>b</var>&raquo; подстроку, состоящую из&nbsp;второго&mdash;четвертого символов и&nbsp;вставить их&nbsp;в&nbsp;середину строки&nbsp;&laquo;<var>a</var>&raquo;, или&nbsp;определить какой символ стоит двенадцатым в&nbsp;&laquo;<var>a</var>&raquo;, сколько символов в&nbsp;&laquo;<var>b</var>&raquo;, есть&nbsp;ли&nbsp;в&nbsp;них&nbsp;буква&nbsp;&laquo;q&raquo;&nbsp;и&nbsp;т.&nbsp;д.</p>
<p>Для&nbsp;этого Вы&nbsp;можете использовать встроенные функции, которые JavaScript предопределяет для&nbsp;каждой строки. Одна&nbsp;из&nbsp;них&nbsp;&mdash; &laquo;length&raquo;&nbsp;&mdash; возвращает длину строки. То&nbsp;есть&nbsp;если Вы&nbsp;хотите вычислить длину &laquo;Hello world!&raquo;, напишите:</p>
<pre><code class="javascript">var c = &#39;Hello world!&#39;.length;</code></pre>
<p>Ранее&nbsp;мы&nbsp;присвоили эту&nbsp;строку переменной&nbsp;&laquo;<var>а</var>&raquo;. Таким&nbsp;образом, Вы&nbsp;сделали переменную&nbsp;&laquo;<var>a</var>&raquo; строкой, поэтому&nbsp;к&nbsp;ней&nbsp;тоже&nbsp;применима функция &laquo;length&raquo;, и&nbsp;следующая операция даст такой&nbsp;же&nbsp;результат:</p>
<pre><code class="javascript">var c = a.length;</code></pre>
<p>Запомните,&nbsp;что&nbsp;Вы&nbsp;можете использовать &laquo;length&raquo; для&nbsp;любой строки&nbsp;&mdash; это&nbsp;встроенная функция. Вы&nbsp;можете <strong class="normal">вычислить длину любой строки</strong>, например: &laquo;<code>location.href</code>&raquo; или&nbsp;&laquo;<code>document.title</code>&raquo; или&nbsp;объявленной Вами.</p>
<p>Ниже я&nbsp;представлю список распространенных встроенных методов и&nbsp;свойств.</p>
<h4 id="strings-numbers">Строки и числа</h4>
<p>В&nbsp;некоторых языках программирования от&nbsp;Вас требуется указывать, является ли&nbsp;переменная числом или&nbsp;строкой, перед&nbsp;тем, как&nbsp;делать с&nbsp;ней что-либо&nbsp;ещё. JavaScript проще относится к&nbsp;разнице между строками и&nbsp;числами. Фактически Вы&nbsp;даже&nbsp;можете складывать числа со&nbsp;строками:</p>
<pre><code class="javascript">var c = a + 12;</code></pre>
<p>В&nbsp;некоторых языках программирования обработка такой строки приведет к&nbsp;ошибке. Всё&nbsp;же&nbsp;&laquo;<var>a</var>&raquo;&nbsp;&mdash; это строка, а&nbsp;&laquo;12&raquo;&nbsp;&mdash; число. Однако JavaScript пытается решить проблему, предполагая, что&nbsp;&laquo;12&raquo;&nbsp;&mdash; тоже&nbsp;строка. Таким&nbsp;образом&nbsp;&laquo;<var>с</var>&raquo; принимает значение &laquo;<samp>Hello&nbsp;world!12</samp>&raquo;. Значит,&nbsp;если&nbsp;Вы&nbsp;используете &laquo;+&raquo; со&nbsp;строкой и&nbsp;числом, JavaScript пытается сделать из&nbsp;числа строку. Если&nbsp;же&nbsp;Вы&nbsp;применяете математические операции к&nbsp;строке, JavaScript пробует превратить её&nbsp;в&nbsp;число. При&nbsp;отсутствии возможности перевода строки в&nbsp;число (например, из-за&nbsp;наличия в&nbsp;ней&nbsp;букв), JavaScript возвращает <abbr title="Not a Number">NaN</abbr>&nbsp;&mdash; &laquo;Not&nbsp;a&nbsp;Number&nbsp;&mdash; не&nbsp;является числом&raquo;.</p>
<p>Наконец, в&nbsp;JavaScript нет&nbsp;разницы между целыми величинами и&nbsp;числами с&nbsp;плавающей точкой.</p>
<h4>Число&nbsp;&rarr; строка</h4>
<p>Для&nbsp;<strong class="normal">преобразования числа в&nbsp;строку</strong> введите:</p>
<pre><code class="javascript">var c = (16 * 24) / 49 + 12;
d = c.toString();</code></pre>
<p>После&nbsp;этого&nbsp;Вы&nbsp;можете применять к&nbsp;&laquo;<var>d</var>&raquo; все&nbsp;строковые методы, а&nbsp;&laquo;<var>c</var>&raquo; все&nbsp;ещё&nbsp;содержит число.</p>
<h4>Строка&nbsp;&rarr; число</h4>
<p>Если&nbsp;Вы&nbsp;хотите преобразовать строку в&nbsp;число, сначала&nbsp;убедитесь, что&nbsp;она&nbsp;состоит только из&nbsp;символов <var>0&mdash;9</var>. Для&nbsp;этого я&nbsp;просто умножаю строку на&nbsp;<var>1</var>.</p>
<pre><code class="javascript">var c = &#39;1234&#39;;
d = c * 1;</code></pre>
<p>Так&nbsp;как&nbsp;умножение производится только с&nbsp;числами, JavaScript превращает строку в&nbsp;число, если это&nbsp;возможно. В&nbsp;противном случае, результат&nbsp;&mdash;&nbsp;<abbr title="Not a Number">NaN</abbr>.</p>
<p>Заметим, если написать:</p>
<pre><code class="javascript">var c = &#39;1234&#39;;
d = c + 0;</code></pre>
<p>Результатом будет &laquo;<samp>12340</samp>&raquo;, потому&nbsp;что&nbsp;JavaScript использует&nbsp;&laquo;+&raquo; для&nbsp;соединения строк, а&nbsp;не&nbsp;их&nbsp;сложения.</p>
<h3 id="method-property">Строковые свойства и методы</h3>
<p>Так&nbsp;что&nbsp;же&nbsp;мы&nbsp;можем делать со&nbsp;строками? Объединение&nbsp;&mdash; это&nbsp;особый случай, но&nbsp;все остальные команды (методы) могут использоваться с&nbsp;любой строкой с&nbsp;помощью конструкции:</p>
<pre><code class="javascript">имя_строки.метод();</code></pre>
<h3>Список встроенных методов JavaScript для&nbsp;работы со&nbsp;строками</h3>
<ul>
<li><a href="#concat" rel="bookmark">Конкатенация&nbsp;(+)</a></li>
<li><a href="#indexOf" rel="bookmark">indexOf</a></li>
<li><a href="#lastIndexOf" rel="bookmark">lastIndexOf</a></li>
<li><a href="#charAt" rel="bookmark">charAt</a></li>
<li><a href="#length" rel="bookmark">length</a></li>
<li><a href="#split" rel="bookmark">split</a></li>
<li><a href="#substring" rel="bookmark">substring</a></li>
<li><a href="#substr" rel="bookmark">substr</a></li>
<li><a href="#toLowerCase" rel="bookmark">toLowerCase и toUpperCase</a></li>
</ul>
<h4 id="concat">Конкатенация&nbsp;&mdash; объединение строк</h4>
<p>Во-первых, Вы&nbsp;можете объединить строки, сложив их&nbsp;вместе, вот&nbsp;так:</p>
<pre><code class="javascript">document.write(a + b);</code></pre>
<p>в&nbsp;результате получится: &laquo;<samp>Hello&nbsp;world!I&nbsp;am&nbsp;a&nbsp;student.</samp>&raquo;. Но,&nbsp;конечно&nbsp;же,&nbsp;Вы&nbsp;хотите, чтобы&nbsp;между предложениями был&nbsp;пробел. Для&nbsp;этого запишем код следующим образом:</p>
<pre><code class="javascript">document.write(a + &#39; &#39; + b);</code></pre>
<p>Так&nbsp;мы&nbsp;соединим три строки: &laquo;<var>а</var>&raquo;, &laquo;<var>&#39;&nbsp;&#39;</var>&raquo; (один&nbsp;пробел) и&nbsp;&laquo;<var>b</var>&raquo;, в&nbsp;итоге получив: &laquo;<samp>Hello&nbsp;world!&nbsp;I&nbsp;am&nbsp;a&nbsp;student.</samp>&raquo;</p>
<p>Вы&nbsp;можете использовать даже&nbsp;числа или&nbsp;вычисления, например:</p>
<pre><code class="javascript">document.write (a + 3 * 3 + b);</code></pre>
<p>Сейчас&nbsp;мы&nbsp;соединяем строку&nbsp;&laquo;<var>а</var>&raquo;, затем результат выражения &laquo;<code>3 * 3</code>&raquo;,  рассматриваемый как&nbsp;строка, и&nbsp;&laquo;<var>b</var>&raquo;, получая: &laquo;<samp>Hello&nbsp;world!<span style="color:#f00;">9</span>I&nbsp;am&nbsp;a&nbsp;student.</samp>&raquo;</p>
<p>При&nbsp;использовании сложения нужно быть внимательным. Команда</p>
<pre><code class="javascript">document.write (a + 3 + 3 + b);</code></pre>
<p>соединяет 4&nbsp;строки: &laquo;<var>а</var>&raquo;, &laquo;<var>3</var>&raquo;, &laquo;<var>3</var>&raquo; и&nbsp;&laquo;<var>b</var>&raquo;, потому&nbsp;что&nbsp;&laquo;+&raquo; в&nbsp;данном случае означает &laquo;соединить&nbsp;строки&raquo;, а&nbsp;не&nbsp;&laquo;сложить&raquo; и&nbsp;в&nbsp;результате: &laquo;<samp>Hello&nbsp;world!<span style="color:#f00;">33</span>I&nbsp;am&nbsp;a&nbsp;student.</samp>&raquo;. Если&nbsp;Вы&nbsp;хотите сложить <var>3</var> и&nbsp;<var>3</var> перед созданием строки, используйте скобки.</p>
<pre><code class="javascript">document.write (a + (3 + 3) + b);</code></pre>
<p>Данное выражение соединяет строку &laquo;<var>а</var>&raquo;, результат выражения &laquo;<code>3&nbsp;+&nbsp;3</code>&raquo;  и&nbsp;&laquo;<var>b</var>&raquo;, в&nbsp;итоге: &laquo;<samp>Hello&nbsp;world!<span style="color:#f00;">6</span>I&nbsp;am&nbsp;a&nbsp;student.</samp>&raquo;.</p>
<h4 id="indexOf">indexOf</h4>
<p>Один&nbsp;из&nbsp;самых широко используемых встроенных методов это&nbsp;&laquo;indexOf&raquo;. Каждый символ имеет свой индекс, содержащий номер его&nbsp;позиции в&nbsp;строке. Заметим,&nbsp;что индекс первого символа&nbsp;&mdash; <var>0</var>, второго&nbsp;&mdash; <var>1</var> и&nbsp;т.&nbsp;д. Таким&nbsp;образом, индекс символа &laquo;w&raquo; в&nbsp;сроке &laquo;<var>а</var>&raquo;&nbsp;&mdash;&nbsp;<var>6</var>.</p>
<p>Используя &laquo;indexOf&raquo; мы&nbsp;можем вывести индекс символа. Напишите &laquo;<kbd>.indexOf(&#39;&nbsp;&#39;)</kbd>&raquo; после названия строки и&nbsp;вставьте искомый символ между кавычками. Например:</p>
<pre><code class="javascript">var a = &#39;Hello world!&#39;;
document.write(a.indexOf(&#39;w&#39;));</code></pre>
<p>возвратит&nbsp;<var>6</var>. Если&nbsp;символ встречается несколько раз, этот&nbsp;метод возвращает первое вхождение. То&nbsp;есть</p>
<pre><code class="javascript">document.write(a.indexOf(&#39;o&#39;));</code></pre>
<p>возвратит&nbsp;<var>4</var>, потому&nbsp;что&nbsp;это индекс первой&nbsp;&laquo;o&raquo; в&nbsp;строке.</p>
<p>Вы&nbsp;также можете искать комбинацию символов. (Конечно, это&nbsp;тоже&nbsp;строка, но,&nbsp;чтобы&nbsp;избежать путаницы, я&nbsp;не&nbsp;буду называть&nbsp;её&nbsp;так). &laquo;indexOf&raquo; возвращает позицию первого символа комбинации. Например:</p>
<pre><code class="javascript">document.write(a.indexOf(&#39;o w&#39;));</code></pre>
<p>тоже возвратит&nbsp;<var>4</var>, потому&nbsp;что это&nbsp;индекс &laquo;o&raquo;.</p>
<p>Более&nbsp;того, возможен поиск символа после определенного индекса. Если&nbsp;Вы&nbsp;введете</p>
<pre><code class="javascript">document.write(a.indexOf(&#39;o&#39;, 5));</code></pre>
<p>то&nbsp;получите индекс первой &laquo;o&raquo;, следующей за&nbsp;символом с&nbsp;индексом&nbsp;<var>5</var> (это&nbsp;пробел), то&nbsp;есть&nbsp;результат будет&nbsp;&mdash;&nbsp;<var>7</var>.</p>
<p>Если&nbsp;символ или&nbsp;комбинация не&nbsp;встречается в&nbsp;строке, &laquo;indexOf&raquo; возвратит&nbsp;&laquo;<samp>-1</samp>&raquo;. Это,&nbsp;по&nbsp;сути,&nbsp;самое популярное применение &laquo;indexOf&raquo;: проверка существования определенной комбинации символов. Оно&nbsp;является ядром скрипта, определяющего браузер. Для&nbsp;определения&nbsp;<abbr title="Internet Explorer">IE</abbr> Вы&nbsp;берете строку:</p>
<pre><code class="javascript">navigator.userAgent;</code></pre>
<p>и&nbsp;проверяете, содержит&nbsp;ли&nbsp;она&nbsp;&laquo;<var>MSIE</var>&raquo;:</p>
<pre><code class="javascript">if(navigator.userAgent.indexOf(&#39;MSIE&#39;) != -1) {
//Какие-либо дествия с Internet Explorer
}</code></pre>
<p>Если&nbsp;индекс &laquo;<var>MSIE</var>&raquo;&nbsp;&mdash; не&nbsp;&laquo;<var>-1</var>&raquo; (если&nbsp;&laquo;<var>MSIE</var>&raquo; встречается где-либо&nbsp;в&nbsp;строке), то&nbsp;текущий браузер&nbsp;&mdash;&nbsp;<abbr title="Internet Explorer">IE</abbr>.</p>
<h4 id="lastIndexOf">lastIndexOf</h4>
<p>Также&nbsp;существует метод &laquo;lastIndexOf&raquo;, который&nbsp;возвращает последнее вхождение символа или&nbsp;комбинации. Он&nbsp;действует противоположно &laquo;indexOf&raquo;.  Команда</p>
<pre><code class="javascript">var b = &#39;I am a student.&#39;;
document.write(b.lastIndexOf(&#39;t&#39;));</code></pre>
<p>возвратит&nbsp;<var>13</var>, потому&nbsp;что&nbsp;это&nbsp;индекс последней&nbsp;&laquo;t&raquo; в&nbsp;строке.</p>
<h4 id="charAt">charAt</h4>
<p>Метод &laquo;charAt&raquo; возвращает символ, стоящий на&nbsp;указанной позиции. Например, когда Вы&nbsp;вводите</p>
<pre><code class="javascript">var b = &#39;I am a student.&#39;;
document.write(b.charAt(5));</code></pre>
<p>в&nbsp;результате получается &laquo;<samp>a</samp>&raquo;, так&nbsp;как&nbsp;это&nbsp;символ на&nbsp;шестой позиции (помните,&nbsp;что&nbsp;индекс первого символа начинается&nbsp;с&nbsp;<var>0</var>).</p>
<h4 id="length">length</h4>
<p>Метод &laquo;length&raquo; возвращает длину строки.</p>
<pre><code class="javascript">var b = &#39;I am a student.&#39;;
document.write(b.length);</code></pre>
<p>возвратит&nbsp;&laquo;15&raquo;. Длина строки на&nbsp;<var>1</var> больше, чем индекс последнего символа.</p>
<h4 id="split">split</h4>
<p>&laquo;<dfn>split</dfn>&raquo;&nbsp;&mdash; это специальный метод, позволяющий разделить строку по&nbsp;определенным символам. Используется, когда&nbsp;результат необходимо заносить в&nbsp;массив, а&nbsp;не&nbsp;в&nbsp;простую переменную. Давайте разделим &laquo;<var>b</var>&raquo; по&nbsp;пробелам:</p>
<pre><code class="javascript">var b = &#39;I am a student.&#39;
var temp = new Array();
temp = b.split(&#39; &#39;);</code></pre>
<p>Теперь строка разбита на&nbsp;4&nbsp;подстроки, которые помещаются в&nbsp;массив &laquo;<var>temp</var>&raquo;. Сами пробелы исчезли.</p>
<pre><code class="javascript">temp[0] = &#39;I&#39;;
temp[1] = &#39;am&#39;;
temp[2] = &#39;a&#39;;
temp[3] = &#39;student&#39;;</code></pre>
<h4 id="substring">substring</h4>
<p>Метод &laquo;substring&raquo; используется для&nbsp;выделения части строки. Синтаксис метода: &laquo;<code>.substring(первый_индекс, последний_индекс)</code>&raquo;. Например:</p>
<pre><code class="javascript">var a = &#39;Hello world!&#39;;
document.write(a.substring(4, 8&#41;);</code></pre>
<p>возвратит &laquo;<samp>o&nbsp;wo</samp>&raquo;, от&nbsp;первой&nbsp;&laquo;o&raquo; (индекс&nbsp;4) до&nbsp;второй (индекс&nbsp;7). Заметьте,&nbsp;что&nbsp;&laquo;r&raquo; (индекс&nbsp;8&#41; не&nbsp;является частью подстроки.</p>
<p>Также можно написать:</p>
<pre><code class="javascript">var a = &#39;Hello world!&#39;;
document.write(a.substring(4));</code></pre>
<p>Это&nbsp;даст целую подстроку &laquo;<samp>o&nbsp;world!</samp>&raquo;, начиная от&nbsp;символа с&nbsp;индексом&nbsp;<var>4</var> и&nbsp;до&nbsp;конца строки.</p>
<h4 id="substr">substr</h4>
<p>Также&nbsp;есть&nbsp;метод &laquo;substr&raquo;, работающий немного по-другому. В&nbsp;качестве второго аргумента он&nbsp;использует не&nbsp;номер индекса, а&nbsp;количество символов. То&nbsp;есть</p>
<pre><code class="javascript">document.write(a.substr(4, 8&#41;);</code></pre>
<p>возвращает 8&nbsp;символов, начиная от&nbsp;символа с&nbsp;индексом&nbsp;<var>4</var>&nbsp;(&laquo;o&raquo;), то&nbsp;есть&nbsp;в&nbsp;результате получаем: &laquo;<samp>o&nbsp;world!</samp>&raquo;</p>
<h4 id="toLowerCase">toLowerCase и&nbsp;toUpperCase</h4>
<p>Наконец, 2&nbsp;метода, которые иногда могут Вам пригодиться: &laquo;toLowerCase&raquo; переводит всю строку в нижний регистр, а&nbsp;&laquo;toUpperCase&raquo;&nbsp;&mdash; в верхний.</p>
<pre><code class="javascript">var b = &#39;I am a student.&#39;;
document.write(b.toUpperCase());</code></pre>
<p>В результате получим &laquo;<samp>I&nbsp;AM&nbsp;A&nbsp;STUDENT.</samp>&raquo;.</p>
<blockquote><p><b>Спонсор поста</b>: Агентство &laquo;Web++&raquo;&nbsp;&mdash;&nbsp;создание и <a href="http://www.webpp.ru/service/seo/" title="Создание и продвижение сайтов в Волгограде">раскрутка сайтов в Волгограде</a>.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/%d0%a0%d0%b0%d0%b1%d0%be%d1%82%d0%b0-%d1%81%d0%be-%d1%81%d1%82%d1%80%d0%be%d0%ba%d0%b0%d0%bc%d0%b8-%d0%b2-javascript/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.codeisart.ru @ 2012-02-04 10:34:24 -->
