<?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; Работа с DOM</title>
	<atom:link href="http://www.codeisart.ru/rubric/js-core/dom/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>&#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 09:40:20 -->
