<?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; js-core</title>
	<atom:link href="http://www.codeisart.ru/rubric/js-core/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>Интеграция «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>«js-core» — JavaScript framework</title>
		<link>http://www.codeisart.ru/js-core-javascript-framework/</link>
		<comments>http://www.codeisart.ru/js-core-javascript-framework/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 01:35:22 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[js-core]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=627</guid>
		<description><![CDATA[Не&#160;так давно я&#160;начал заниматься разработкой JavaScript framework&#8217;а &#171;js-core&#187; для&#160;применения в&#160;небольших проектах, в&#160;которых использование таких готовых универсальных решений, как&#160;&#171;Prototype&#187;, &#171;MooTools&#187; или&#160;&#171;jQuery&#187; является не&#160;оправданным, в&#160;связи с&#160;достаточно большим объемом кода, большая часть которого не&#160;используется. Framework получился легкий (в&#160;несжатом виде версия 2.5.1&#160;занимает около&#160;15кб), но в тоже время достаточно функциональным. При&#160;разработке &#171;js-core&#187; я&#160;ориентировался на&#160;опытных программистов, поэтому постарался исключить как&#160;можно больше [...]]]></description>
			<content:encoded><![CDATA[<p>Не&nbsp;так давно я&nbsp;начал заниматься разработкой JavaScript framework&#8217;а &laquo;<a href="http://code.google.com/p/js-core/" title="«js-core» — JavaScript framework">js-core</a>&raquo; для&nbsp;применения в&nbsp;небольших проектах, в&nbsp;которых использование таких готовых универсальных решений, как&nbsp;&laquo;Prototype&raquo;, &laquo;MooTools&raquo; или&nbsp;&laquo;jQuery&raquo; является не&nbsp;оправданным, в&nbsp;связи с&nbsp;достаточно большим объемом кода, большая часть которого не&nbsp;используется. Framework получился легкий (в&nbsp;несжатом виде версия 2.5.1&nbsp;занимает около&nbsp;15кб), но в тоже время достаточно функциональным.</p>
<p><span id="more-627"></span></p>
<p>При&nbsp;разработке &laquo;js-core&raquo; я&nbsp;ориентировался на&nbsp;опытных программистов, поэтому постарался исключить как&nbsp;можно больше лишних проверок. Например, &laquo;jQuery&raquo; может автоматически подставить вместо переданного параметра &laquo;<code>class</code>&raquo; значение &laquo;<code>className</code>&raquo;, либо&nbsp;позволить ввести сразу &laquo;<code>className</code>&raquo;, в&nbsp;связи с&nbsp;чем, каждый&nbsp;раз при&nbsp;использовании метода &laquo;<code>attr</code>&raquo; идет проверка и&nbsp;подстановка соответствующего значения. Так&nbsp;же в&nbsp;&laquo;js-core&raquo; активно применяется расширение стандартных прототипов встроеных объектов, поэтому не&nbsp;забывайте делать проверку &laquo;<code>hasOwnProperty</code>&raquo; в&nbsp;конструкиции &laquo;<code>for(&hellip;in&hellip;)</code>&raquo;. Чтобы не&nbsp;делать такую проверку в&nbsp;framework&#8217;е предумотрены методы &laquo;<code>object.each(fn,&nbsp;[arg])</code>&raquo;, &laquo;<code>$.foreach(object,&nbsp;fn)</code>&raquo;, а&nbsp;также реализован метод &laquo;<code>array.forEach(fn,&nbsp;context)</code>&raquo; для&nbsp;старых браузеров, не&nbsp;поддерживающих&nbsp;его.</p>
<p>Для&nbsp;начала, рассмотрим пример, демонстрирующий упрощенный принцип работы JavaScript framework&#8217;а.</p>
<pre><code class="javascript">// Глобальный объект с набором частоиспользуемых
// функций, на основе которых построено большинство
// методов framework'а.
var core = {
  // Определение версии «Internet Explorer»
  ie: 0 /*@cc_on + @_jscript_version * 10 % 10 @*/,
  // …
  // и другие атрибуты и методы.
  // …
};

// Главная функция-конструктор.
function _$(arg) {
  // В атрибут «node» нового объекта запоминаем ссылку на DOM-узел
  this.node = typeof arg == 'string' ? document.getElementById(arg) : arg;
}

// Методы работы с DOM-узлами,
// доступные через прототип функции «_$».
_$.prototype = {
  parent: function() {
    // Возвращаем новую копию объекта «_$»
    // с сылкой на родительский узел
    // текущего элемента.
    return new _$(this.node.parentNode);
  },
  html: function(html) {
    // Если указан входной параметр «html»,
    // то заменяем «innerHTML» текущего узла
    // на переданный во входном параметре.
    if(typeof html != 'undefined') {
      this.node.innerHTML = html;
      return this;
    }
    // Иначе возвращаем «innerHTML» текущего узла.
    else return this.node.innerHTML;
  },
  // …
  // здесь же и все остальные методы.
  // …
};

// Функция, сокращающа запись создания
// новой копии объекта «_$».
function $(arg) {
	return new _$(arg);
}

// Дополнительные методы
$.n = function(tag) {
	// Возвращаем новую копию объекта «_$»
	// с сылкой на новый узел с именем тега,
	// указанным в параметре «tag».
	return new _$(document.createElement(tag));
};</code></pre>
<p>Как&nbsp;видим, каждый&nbsp;раз во&nbsp;время выполнения функции &laquo;<code>$</code>&raquo; происходит конструирование нового объекта, который содержит всего&nbsp;одну ссылку &laquo;<var>node</var>&raquo; на&nbsp;<abbr title="Document Object Model">DOM</abbr>-узел, но&nbsp;через прототип функции-конструктора &laquo;<code>_$</code>&raquo; для&nbsp;него&nbsp;доступен набор методов, работающих с текущим узлом по этой ссылке.</p>
<p>В&nbsp;&laquo;js-core&raquo; реализовано кэширование для&nbsp;ссылок на&nbsp;<abbr title="Document Object Model">DOM</abbr>-узлы, полученных по&nbsp;идентификатору. То&nbsp;есть метод &laquo;<code>document.getElementById</code>&raquo; выполняется всего один&nbsp;раз для&nbsp;каждого запрашиваемого узла с&nbsp;идентификатором. Это&nbsp;позволяет повысить производительность в&nbsp;некоторых ситуациях.</p>
<p>В&nbsp;весрии 2.5.1&nbsp;реализовано более 50-и&nbsp;методов, позволяющих JavaScript-программисту сразу приступить к&nbsp;написанию веб-приложения, не&nbsp;затрачивая время на&nbsp;подготовку основы для&nbsp;его&nbsp;работы. Рассмотрим некоторые из&nbsp;них.</p>
<h3>Функция <code>$(&hellip;)</code></h3>
<p>Для&nbsp;получения новой копии объекта &laquo;<code>_$</code>&raquo; используется функция &laquo;<code>$(&hellip;)</code>&raquo;, которая может принимать строку, содержащую идентификатор или&nbsp;ссылку на&nbsp;<abbr title="Document Object Model">DOM</abbr>-узел. Допустим, у&nbsp;нас&nbsp;есть узел <code>&lt;DIV&gt;</code> с&nbsp;идентификатором &laquo;<var>test</var>&raquo;, тогда&nbsp;мы&nbsp;можем выполнить следующее:</p>
<pre><code class="javascript">var obj = $('test');
// или
var node = document.getElementById('test');
var obj = $(node);</code></pre>
<blockquote><p>Далее, чтобы сократить запись, запомним, что&nbsp;все&nbsp;функции, возвращающие один узел, возвращают его&nbsp;в&nbsp;обертке&nbsp;&mdash; новой копии объекта &laquo;<code>_$</code>&raquo; c&nbsp;атрибутом &laquo;<var>node</var>&raquo;, содержащим ссылку на&nbsp;этот <abbr title="Document Object Model">DOM</abbr>-узел. А&nbsp;функции, возвращающие набор значений, отдают нумерованный массив или&nbsp;&laquo;<code>DOMNodeList</code>&raquo; ссылок на&nbsp;узлы. Некоторые функции (<code>css</code>, <code>attr</code>) могут&nbsp;возвращать как&nbsp;одиночные значения, так&nbsp;и&nbsp;массивы, в&nbsp;зависимости от&nbsp;количества входящих параметров.</p>
</blockquote>
<h3>Функция <code>exist(&hellip;)</code></h3>
<p>В&nbsp;отличие от&nbsp;&laquo;jQuery&raquo; в&nbsp;&laquo;js-core&raquo; не&nbsp;проверяется каждый&nbsp;раз наличие элемента, поэтому&nbsp;если, попытаться выполнить некоторые методы с&nbsp;несуществующим узлом, произойдет ошибка. Для&nbsp;случаев, когда элемент может отсутствовать, предусмотрен метод &laquo;<code>exist</code>&raquo;, который может принимать в&nbsp;качестве входных параметров 2&nbsp;функции: 1-я&nbsp;выполнится, если&nbsp;указанный элемент существует, 2-я&nbsp;выполнится, если&nbsp;такой&nbsp;элемент отсутствует.</p>
<pre><code class="javascript">$('test').exist(
  function() {
    // По ссылке &laquo;this&raquo; доступен текущий DOM-узел
    $(this)&hellip;
  },
  function() {
    alert('Элемент отсутствует');
  }
);</code></pre>
<p>Так&nbsp;же&nbsp;функцию &laquo;exist&raquo; можно&nbsp;вызывать без&nbsp;параметров. В&nbsp;этом&nbsp;случае она&nbsp;вернет логическое значение &laquo;<var>true</var>&raquo; или&nbsp;<var>false</var>&raquo;.</p>
<pre><code class="javascript">if($('test').exist()) {&hellip;}</code></pre>
<h3>Функции <code>append(&hellip;)</code> и <code>prepend(&hellip;)</code></h3>
<p>Для&nbsp;добавления нового дочернего узла или&nbsp;перемещения уже&nbsp;существующего в&nbsp;список дочерних элементов текущего узла используются функции &laquo;<code>append(&hellip;)</code>&raquo; и&nbsp;&laquo;<code>prepend(&hellip;)</code>&raquo;. Первая функция добавляет элемент в&nbsp;конец списка дочерних элементов, вторая&nbsp;&mdash; в&nbsp;начало.</p>
<pre><code class="javascript">$('test').append('h1');
// или
var node = document.createElement('h1');
$('test').append(node);
// а так же
var node = document.getElementById('some-id');
$('test').append(node);</code></pre>
<h3>Функции <code>html(&hellip;)</code> и&nbsp;<code>text(&hellip;)</code></h3>
<p>Можно продолжить предыдущую цепочку и&nbsp;сразу же&nbsp;добавить в&nbsp;новый дочерний узел какой-нибудь текст или&nbsp;<abbr title="Hypertext Markup Language">HTML</abbr>-код:</p>
<pre><code class="javascript">$('test').append('h1').text('Hello World!');
// или
$('test').append('h1').html('&lt;span&gt;Hello&lt;/span&gt; World!');</code></pre>
<p>Для&nbsp;тех, кто&nbsp;хорошо знает &laquo;jQuery&raquo; сразу&nbsp;становится видно отличие &laquo;js-core&raquo; в&nbsp;работе с&nbsp;элементами в&nbsp;пределах одной цепочки вызовов. В&nbsp;&laquo;jQuery&raquo; метод &laquo;<code>html</code>&raquo; заменил&nbsp;бы &laquo;<code>innerHTML</code>&raquo; <abbr title="Document Object Model">DOM</abbr>-элемента с&nbsp;идентификатором &laquo;<var>test</var>&raquo;, а&nbsp;в&nbsp;&laquo;js-core&raquo; работа ведется с&nbsp;последним используемым узлом, в&nbsp;данном примере это&nbsp;заголовок первого уровня <code>&lt;H1&gt;</code>.</p>
<h3>Функции <code>after(&hellip;)</code> и&nbsp;<code>before(&hellip;)</code></h3>
<p>Создают новый узел после (перед) текущим или&nbsp;переносят существующий.</p>
<pre><code class="javascript">$('test').after('p').text('example');
$('test').after(document.getElementById('some-id'));
$('test').before(document.createElement('span')).html('example');</code></pre>
<h3>Функции <code>appendTo(&hellip;)</code> и&nbsp;<code>prependTo(&hellip;)</code></h3>
<p>Переносят текущий узел в&nbsp;конец (начало) списка дочерних элементов узла, переданного в&nbsp;качестве входного параметра (ссылка на&nbsp;<abbr title="Document Object Model">DOM</abbr>-элемент или&nbsp;строка, содержащая идентификатор узла).</p>
<pre><code class="javascript">$('test').appendTo('some-id');
$('test').prependTo(document.body);</code></pre>
<h3>Функции <code>insertAfter(&hellip;)</code> и&nbsp;<code>inserBefore(&hellip;)</code></h3>
<p>Ставят текущий узел после (перед) указанного узла (ссылка на&nbsp;<abbr title="Document Object Model">DOM</abbr>-элемент или&nbsp;строка, содержащая идентификатор узла).</p>
<pre><code class="javascript">$('test').insertAfter(document.getElementsByTagName('div')[0]);
$('test').inserBefore('some-id');</code></pre>
<h3>Функции <code>next(&hellip;)</code> и&nbsp;<code>prev(&hellip;)</code></h3>
<p>Возвращают первый соседний справа или&nbsp;слева элемент. В&nbsp;качестве входного параметра может приниматься строка и&nbsp;именем тега. Если&nbsp;входной параметр не&nbsp;указан, то&nbsp;возвращается первый соседний узел с&nbsp;&laquo;<code>nodeType&nbsp;==&nbsp;1</code>&raquo;.</p>
<pre><code class="javascript">$('test').next('blockquote');
$('test').prev();</code></pre>
<p>Если соседний элемент отсутствует, функция вернет &laquo;<var>undefined</var>&raquo;.</p>
<h3>Функция <code>child(&hellip;)</code></h3>
<p>Возвращает массив дочерних элементов. Для&nbsp;фильтрации элементов в&nbsp;качестве первого параметра функции можно указать строку или&nbsp;массив строк, содержащих имена тегов. Если&nbsp;указан второй параметр &laquo;<var>true</var>&raquo;, то&nbsp;поиск элементов производится по&nbsp;всем вложенным узлам.</p>
<pre><code class="javascript">$('test').child('input select textarea', true);
$('test').child(['div', 'p']);</code></pre>
<h3>Функция <code>parent(&hellip;)</code></h3>
<p>Возвращает родительский элемент текущего узла.</p>
<pre><code class="javascript">$('test').parent();</code></pre>
<h3>Функции <code>remove(&hellip;)</code> и&nbsp;<code>empty(&hellip;)</code></h3>
<p>Удаляют и&nbsp;очищают текущий узел соответственно.</p>
<pre><code class="javascript">$('test').remove();
$('test').empty();</code></pre>
<p>Заметим, что&nbsp;функция &laquo;<code>empty</code>&raquo; возвращает текущую копию объекта &laquo;<code>_$</code>&raquo;, поэтому мы можем продолжить работу с&nbsp;узлом.</p>
<pre><code class="javascript">$('test').empty().append('h1').text('example');</code></pre>
<p>Полный перечень методов &laquo;js-core&raquo; можно посмотреть на&nbsp;<a href="http://code.google.com/p/js-core/">главной&nbsp;странице</a> проекта. Для&nbsp;каждой функции указаны все&nbsp;возможные комбинации параметров. В&nbsp;ближайшее время постараюсь сделать, что-то&nbsp;вроде &laquo;sheatsheet&raquo; по&nbsp;всем функциям.</p>
<p>Сейчас framework используется здесь и&nbsp;на&nbsp;сайте &laquo;<a href="http://www.zaoklfz.ru/">ЗАО&nbsp;КЛФЗ</a>&raquo;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-javascript-framework/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>«js-core» test drive</title>
		<link>http://www.codeisart.ru/js-core-test-drive/</link>
		<comments>http://www.codeisart.ru/js-core-test-drive/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 20:34:40 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[js-core]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=583</guid>
		<description><![CDATA[Решил провести небольшой тест производительности своего JavaScript framework&#8217;а &#171;js-core&#187;. Для&#160;сравнения, конечно&#160;же, взял&#160;&#171;jQuery&#187;, который хорошо знаю и&#160;имею отчетливое представление о&#160;его&#160;работе. Конечно, &#171;js-core&#187; не&#160;столь функционален, как&#160;&#171;jQuery&#187;, поэтому я&#160;решил провести тест, на&#160;примере, который можно записать практически одинаково и&#160;в&#160;моем&#160;framework&#8217;е и&#160;в&#160;&#171;jQuery&#187;. js-core: $.ready(function() { for(var i = 0; i &#60; 1000; i++) $.n('pre') .addClass('xxx') .text(i) .appendTo(document.body); var timeAfter = new [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.codeisart.ru/wp-content/uploads/2008/09/js-core-test-drive.png" alt="«js-core» test drive" width="93" height="91" class="left" />Решил провести небольшой тест производительности своего JavaScript framework&#8217;а &laquo;<a href="http://code.google.com/p/js-core/">js-core</a>&raquo;. Для&nbsp;сравнения, конечно&nbsp;же, взял&nbsp;&laquo;<a href="http://jquery.com/" rel="external nofollow">jQuery</a>&raquo;, который хорошо знаю и&nbsp;имею отчетливое представление о&nbsp;его&nbsp;работе.</p>
<p>Конечно, &laquo;js-core&raquo; не&nbsp;столь функционален, как&nbsp;&laquo;jQuery&raquo;, поэтому я&nbsp;решил провести тест, на&nbsp;примере, который можно записать практически одинаково и&nbsp;в&nbsp;моем&nbsp;framework&#8217;е и&nbsp;в&nbsp;&laquo;jQuery&raquo;.</p>
<p><span id="more-583"></span></p>
<p><b>js-core:</b></p>
<pre><code class="javascript">$.ready(function() {

  for(var i = 0; i &lt; 1000; i++)
    $.n('pre')
    .addClass('xxx')
    .text(i)
    .appendTo(document.body);

  var timeAfter = new Date();

  $.n('p')
  .text(timeAfter.getTime() - timeBefore.getTime())
  .prependTo(document.body);

});</code></pre>
<p><b>jQuery:</b></p>
<pre><code class="javascript">$(document).ready(function() {

  for(var i = 0; i &lt; 1000; i++)
    $('&lt;pre&gt;&lt;/pre&gt;')
    .addClass('xxx')
    .text(i)
    .appendTo(document.body);

  var timeAfter = new Date();

  $('&lt;p&gt;&lt;/p&gt;')
  .text(timeAfter.getTime() - timeBefore.getTime())
  .prependTo(document.body);

});</code></pre>
<p>В&nbsp;первую строку каждого framework&#8217;а был&nbsp;добавлен следующий код:</p>
<pre><code class="javascript">var timeBefore = new Date();</code></pre>
<p><a href="http://www.codeisart.ru/wp-content/uploads/2008/09/js-core-test-drive-1.png"><img src="http://www.codeisart.ru/wp-content/uploads/2008/09/js-core-test-drive-1.png" alt="«js-core» and «jQuery»" width="500" height="221" /></a></p>
<p>Конфигурация компьютера, на&nbsp;котором производился тест:</p>
<ul>
<li>процессор: Intel&nbsp;Pentium&nbsp;4 (3000MHz/512kb/HT);</li>
<li>метеринская плата: Epox на&nbsp;базе&nbsp;i865PE (fsb&nbsp;1000MHz);</li>
<li>память: 2&times;512Mb (DDR&nbsp;PC-3200/dual&nbsp;channel);</li>
<li>ОС: Windows&nbsp;XP Service&nbsp;Pack&nbsp;2.</li>
</ul>
<p>В&nbsp;общем, древний компьютер, приобретенный в&nbsp;далеком 2003&nbsp;году.</p>
<p>Для&nbsp;тестирования были использованы следующие имеющиеся на&nbsp;тестовом компьютере браузеры:</p>
<ul>
<li>Internet&nbsp;Explorer&nbsp;6 (из&nbsp;пакета MultipleIEs);</li>
<li>Internet&nbsp;Explorer&nbsp;8&nbsp;beta&nbsp;2;</li>
<li>Mozilla&nbsp;FireFox&nbsp;3.0.1;</li>
<li>Opera&nbsp;9.52&nbsp;сборка&nbsp;10108;</li>
<li>Safari&nbsp;3.1&nbsp;сборка&nbsp;525.13;</li>
<li>Google&nbsp;Chrome&nbsp;0.2.149.29.</li>
</ul>
<p>Страницы открывались через протокол &laquo;<code>file:</code>&raquo;, т.&nbsp;е.&nbsp;не&nbsp;использовался никакой&nbsp;веб-сервер. Для&nbsp;каждого framework&#8217;а на&nbsp;всех браузерах проводилось по&nbsp;<var>10</var>&nbsp;попыток загрузки, повторяемых нажатием клавиши &laquo;<kbd>F5</kbd>&raquo;, записывалось время, выдаваемое скриптом. Затем было&nbsp;посчитано среднее арифметическое для&nbsp;каждого браузера. <abbr title="Extensible Hypertext Markup Language">XHTML</abbr>-страницы содержали только необходимые теги, для&nbsp;подключения скриптов и&nbsp;пустое тело&nbsp;<code>&lt;body&gt;</code>.</p>
<table summary="">
<caption>
		Результаты теста<br />
		</caption>
<thead>
<tr>
<th>&nbsp;</th>
<th><abbr title="Internet Explorer 6">IE6</abbr></th>
<th><abbr title="Internet Explorer 8 beta 2">IE8b2</abbr></th>
<th>FireFox&nbsp;3.0.1</th>
<th>Opera&nbsp;9.52</th>
<th>Safari&nbsp;3.1</th>
<th>Google&nbsp;Chrome&nbsp;0.2</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="col">js-core</th>
<td>516</td>
<td>478</td>
<td>212</td>
<td>134</td>
<td>86</td>
<td>103</td>
</tr>
<tr>
<th scope="col">jQuery</th>
<td>2880</td>
<td>2314</td>
<td>1272</td>
<td>636</td>
<td>716</td>
<td>621</td>
</tr>
</tbody>
</table>
<p><a href="http://www.codeisart.ru/wp-content/uploads/2008/09/js-core-test-drive-2.png"><img src="http://www.codeisart.ru/wp-content/uploads/2008/09/js-core-test-drive-2.png" alt="Диаграмма производительности «js-core» и «jQuery»" width="500" height="256" /></a></p>
<p>Как&nbsp;видим &laquo;js-core&raquo; в&nbsp;данном тесте оказался гораздо быстрее &laquo;jQuery&raquo;, что&nbsp;меня, конечно, очень сильно порадовало <img src='http://www.codeisart.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Заметьте, какой&nbsp;отрыв &laquo;js-core&raquo; от&nbsp;&laquo;jQuery&raquo; в&nbsp;тестах&nbsp;<abbr title="Internet Explorer">IE</abbr>. &laquo;Opera&raquo;, &laquo;Safari&raquo; и&nbsp;&laquo;Google&nbsp;Chrome&raquo; оказались самыми быстрыми в&nbsp;работе с&nbsp;<abbr title="Document Object Model">DOM</abbr>, недалеко от&nbsp;них&nbsp;&laquo;FireFox&raquo;, ну&nbsp;а&nbsp;<abbr title="Internet Explorer">IE</abbr> как&nbsp;всегда&hellip;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-test-drive/feed/</wfw:commentRss>
		<slash:comments>16</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>&#171;prepend&#187;&#160;&#8212; добавление нового узла в начало списка дочерних узлов</title>
		<link>http://www.codeisart.ru/js-core-dom-prepend/</link>
		<comments>http://www.codeisart.ru/js-core-dom-prepend/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 20:27:18 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[js-core]]></category>
		<category><![CDATA[Работа с DOM]]></category>
		<category><![CDATA[prepend]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=86</guid>
		<description><![CDATA[Функция prepend добавляет новый или перемещает существующий узел в начало списка дочерних элементов текущего узла и возвращает копию объекта _$, содержащую ссылку на новый/перемещенный узел. Входные параметры В качестве входного параметра функция может принимать строку с именем тега нового узла или ссылку на уже существующий узел. prepend('div')&#160;&#8212; функция создаст новый узел с именем тега DIV [...]]]></description>
			<content:encoded><![CDATA[<p>Функция <q>prepend</q> добавляет новый или перемещает существующий узел в начало списка дочерних элементов текущего узла и возвращает копию объекта <q>_$</q>, содержащую ссылку на новый/перемещенный узел.</p>
<h3>Входные параметры</h3>
<p>В качестве входного параметра функция может принимать строку с именем тега нового узла или ссылку на уже существующий узел.</p>
<ul>
<li><code>prepend('div')</code>&nbsp;&mdash; функция создаст новый узел с именем тега <q>DIV</q> и поместит его в начало списка дочерних элементов текущего узла.</li>
<li><code>prepend(node)</code>&nbsp;&mdash; функция переместит узел, доступный по ссылке <var>node</var>, в начало списка дочерних элементов текущего узла.</li>
</ul>
<h3>Пример использования</h3>
<pre><code class="javascript">$('test').prepend('div');</code></pre>
<p>В начале списка дочерних элементов узла с идентификатором <q>test</q> будет добавлен новый узел с именем тега <q>DIV</q>.</p>
<h4>Аналог без использования фреймворка</h4>
<pre><code class="javascript">function prepend(id, tag) {
  var node = document.getElementById(id),
  first = node.firstChild,
  newNode = document.createElement(tag);
  node.insertBefore(newNode, first);
  return newNode;
}

prepend('test', 'div');
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-dom-prepend/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>&#171;append&#187;&#160;&#8212; добавление нового узла в&#160;конец списка дочерних узлов</title>
		<link>http://www.codeisart.ru/js-core-dom-append/</link>
		<comments>http://www.codeisart.ru/js-core-dom-append/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 19:55:42 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[js-core]]></category>
		<category><![CDATA[Работа с DOM]]></category>
		<category><![CDATA[append]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=82</guid>
		<description><![CDATA[Функция append добавляет новый или перемещает существующий узел в конец списка дочерних элементов текущего узла и возвращает копию объекта _$, содержащую ссылку на новый/перемещенный узел. Входные параметры В качестве входного параметра функция может принимать строку с именем тега нового узла или ссылку на уже существующий узел. append('div')&#160;&#8212; функция создаст новый узел с именем тега DIV [...]]]></description>
			<content:encoded><![CDATA[<p>Функция <q>append</q> добавляет новый или перемещает существующий узел в конец списка дочерних элементов текущего узла и возвращает копию объекта <q>_$</q>, содержащую ссылку на новый/перемещенный узел.</p>
<h3>Входные параметры</h3>
<p>В качестве входного параметра функция может принимать строку с именем тега нового узла или ссылку на уже существующий узел.</p>
<ul>
<li><code>append('div')</code>&nbsp;&mdash; функция создаст новый узел с именем тега <q>DIV</q> и поместит его в конец списка дочерних элементов текущего узла.</li>
<li><code>append(node)</code>&nbsp;&mdash; функция переместит узел, доступный по ссылке <var>node</var>, в конец списка дочерних элементов текущего узла.</li>
</ul>
<h3>Пример использования</h3>
<pre><code class="javascript">$('test').append('div');</code></pre>
<p>В конец списка дочерних элементов узла с идентификатором <q>test</q> будет добавлен новый узел с именем тега <q>DIV</q>.</p>
<h4>Аналог без использования фреймворка</h4>
<pre><code class="javascript">function append(id, tag) {
  var node = document.getElementById(id),
  newNode = document.createElement(tag);
  node.appendChild(newNode);
  return newNode;
}

append('test', 'div');
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-dom-append/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#171;parent&#187;&#160;&#8212; получение родительского узла</title>
		<link>http://www.codeisart.ru/js-core-dom-parent/</link>
		<comments>http://www.codeisart.ru/js-core-dom-parent/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 19:26:03 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[js-core]]></category>
		<category><![CDATA[Работа с DOM]]></category>
		<category><![CDATA[parent]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=76</guid>
		<description><![CDATA[Функция parent возвращает копию объекта _$, содержащую родительский узел текущего узла. Пример использования var node = $('test').parent(); В переменную node будет помещен объект с ссылкой на родительский узел текущего узла с идентификатором test. Чтобы получить сам узел, необходимо обратиться к атрибуту node возвращаемого объекта или воспользоваться функцией el. var node = $('test').parent().node; //или var node [...]]]></description>
			<content:encoded><![CDATA[<p>Функция <q>parent</q> возвращает копию объекта <q>_$</q>, содержащую родительский узел текущего узла.</p>
<h3>Пример использования</h3>
<pre><code class="javascript">var node = $('test').parent();</code></pre>
<p>В переменную <var>node</var> будет помещен объект с ссылкой на родительский узел текущего узла с идентификатором <q>test</q>. Чтобы получить сам узел, необходимо обратиться к атрибуту <q>node</q> возвращаемого объекта или воспользоваться функцией <q>el</q>.</p>
<pre><code class="javascript">var node = $('test').parent().node;
//или
var node = $('test').parent().el();</code></pre>
<h4>Аналог без использования фреймворка</h4>
<pre><code class="javascript">function parent(id) {
  return document.getElementById(id).parentNode;
}

var node = parent('test');
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-dom-parent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#171;child&#187;&#160;&#8212; получение списка дочерних узлов</title>
		<link>http://www.codeisart.ru/js-core-dom-child/</link>
		<comments>http://www.codeisart.ru/js-core-dom-child/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 15:28:36 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[js-core]]></category>
		<category><![CDATA[Работа с DOM]]></category>
		<category><![CDATA[child]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=58</guid>
		<description><![CDATA[Функция child возвращает массив дочерних элементов текущего узла. Входные параметры Первый параметр используется для выбора элементов по имени тега. Необязательный. child()&#160;&#8212; пустое значение, функция вернет массив всех дочерних узлов. child('div')&#160;&#8212; cтрока с именем тега, функция вернет массив дочерних узлов с именем тега DIV. child('div h1 p')&#160;&#8212; строка со списком имен тегов, разделенных пробелами, функция вернет [...]]]></description>
			<content:encoded><![CDATA[<p>Функция <q>child</q> возвращает массив дочерних элементов текущего узла.</p>
<h3>Входные параметры</h3>
<ol>
<li>
<p>Первый параметр используется для выбора элементов по имени тега. Необязательный.</p>
<ul>
<li><code>child()</code>&nbsp;&mdash; пустое значение, функция вернет массив всех дочерних узлов.</li>
<li><code>child('div')</code>&nbsp;&mdash; cтрока с именем тега, функция вернет массив дочерних узлов с именем тега <q>DIV</q>.</li>
<li><code>child('div h1 p')</code>&nbsp;&mdash; строка со списком имен тегов, разделенных пробелами, функция вернет массив дочерних элементов с именами тегов <q>DIV</q>, <q>H1</q> и <q>P</q>.</li>
<li><code>child(['div', 'h1', 'p'])</code>&nbsp;&mdash; массив строк с именами тегов, результат выполнения функции аналогичен предыдущему пункту.</li>
</ul>
</li>
<li>
<p>Второй параметр логического типа так же необязателен и используется для переключения режима поиска дочерних элементов. Может принимать пустое значение или <var>true</var>. Если указано значение <var>true</var>, то будут выбраны все дочерние элементы, текущего узла, соответствующие критериям поиска, указанным в первом параметре, иначе&nbsp;&mdash; только непосредственно дочерние по отношению к текущему узлу. Допускается сочетание этого параметра со всеми вариантами первого параметра:</p>
<ul>
<li><code>child(true)</code></li>
<li><code>child('div', true)</code></li>
<li><code>child('div h1 p', true)</code></li>
<li><code>child(['div', 'h1', 'p'], true)</code></li>
</ul>
</li>
</ol>
<h3>Пример использования</h3>
<pre><code class="javascript">var childArray = $('test').child('li');</code></pre>
<p>В переменную <var>childArray</var> будет помещен массив элементов, с именем тега <q>LI</q>, являющихся непосредственно потомками текущего узла с идентификатором <q>test</q>.</p>
<h4>Аналог без использования фреймворка</h4>
<pre><code class="javascript">function child(id, tag) {
  var node = document.getElementById(id),
  children = node.childNodes,
  i, length = children.length, array = [];
  tag = tag.toUpperCase();
  for(i = 0; i < length; i++) {
    if(children[i].tagName == tag) {
      array.push(children[i]);
    }
  }
  return array;
}

var childArray = child('test', 'li');
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/js-core-dom-child/feed/</wfw:commentRss>
		<slash:comments>0</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:23:50 -->
