JavaScript. Подробное руководство, 6-е издание, стр. 206

<b>    if (е.firstElementChild) е = е.firstElementChild;</b>

<b>    else {</b>

<b>      for(e = е.firstChild; е &amp;&amp; e.nodeType !== 1; е = е.nextSibling)</b>

<b>            /* пустой цикл */;</b>

<b>    }</b>

<b>    return sibling(e, n); // Вернуть n-го брата первого дочернего элемента</b>

<b>  }</b>

<b>  else { // n - отрицательное: двигаться назад, начиная с последнего</b>

<b>    if (е.lastElementChild) е = е.lastElementChild;</b>

<b>    else {</b>

<b>      for(e = e.lastChild; e &amp;&amp; e.nodeType !== 1; e=e.previousSibling)</b>

<b>           /* пустой цикл */;</b>

<b>    }</b>

<b>    return sibling(e, n+1); // +1, чтобы преобразовать номер -1 дочернего</b>

<b>                            // в номер 0 братского для последнего</b>

<b>  }</b>

<b>}</b>

Определение собственных методов элементов

Все текущие броузеры (включая ІE8 и выше) реализуют модель DOM таким образом, что такие типы, как

<b>Element</b>
и
<b>HTMLDocument</b>
[38], являются классами, такими же как классы
<b>String</b>
и
<b>Array</b>
. Они не имеют конструкторов (как создавать новые объекты
<b>Element</b>
, будет показано далее в этой главе), но они имеют объекты-прототипы, которые вы можете расширять своими методами:

<b>Element.prototype.next = function() {</b>

<b>      if (this.nextElementSibling) return this.nextElementSibling;</b>

<b>      var sib = this.nextSibling;</b>

<b>      while(sib &amp;&amp; sib.nodeType !== 1) sib = sib.nextSibling;</b>

<b>      return sib;</b>

<b>};</b>

Функции, представленные в примере 15.2, не были реализованы в виде методов объекта

<b>Element</b>
лишь по той причине, что такая возможность не поддерживается в ІE7.

Однако возможность расширения типов DOM может пригодиться для реализации особенностей, характерных для IE, в других броузерах. Как отмечалось выше, нестандартное свойство

<b>children</b>
объекта
<b>Element</b>
было впервые реализовано в IE и только потом - в других броузерах. Используя следующий программный код, можно реализовать это свойство в броузерах, не поддерживающих его, таких как Firefox 3.0:

<b>// Реализация свойства Element.children в броузерах,</b>

<b>// не поддерживающих его</b>

<b>// Обратите внимание, что этот метод возвращает статический</b>

<b>// массив, а не &quot;живой&quot; NodeList</b>

<b>if (!document.documentElement.children) {</b>

<b>  Element.prototype.__defineGetter__(&quot;children&quot;,</b>

<b>     function() { var kids = [];</b>

<b>       for(var c = this.firstChild; c != null; c = c.nextSibling)</b>

<b>         if (c.nodeType === 1) kids.push(c);</b>

<b>       return kids;</b>

<b>     }):</b>

<b>}</b>

Метод

<b>__defineGetter__ </b>
(о нем рассказывается в разделе 6.7.1) не является

стандартным, но его вполне можно использовать для обеспечения переносимости в таком программном коде, как этот.

15.4. Атрибуты

HTML-элементы состоят из имени тега и множества пар имя/значение, известных как атрибуты. Например, элемент

<b>&lt;а&gt;</b>
, определяющий гиперссылку, в качестве адреса назначения ссылки использует значение атрибута
<b>href</b>
. Значения атрибутов HTML-элементов доступны в виде свойств объектов
<b>HTMLElement</b>
, представляющих эти элементы. Кроме того, модель DOM определяет и другие механизмы получения и изменения значений XML-атрибутов и нестандартных HTML-атрибутов. Подробнее об этом рассказывается в следующих подразделах.

15.4.1. HTML-атрибуты как свойства объектов Element

Объекты

<b>HTMLElement</b>
, представляющие элементы HTML-документа, определяют свойства, доступные для чтения/записи, соответствующие HTML-атрибутам элементов. Объект
<b>HTMLElement</b>
определяет свойства для поддержки универсальных HTTP-атрибутов, таких как
<b>id</b>
,
<b>title</b>
,
<b>lang</b>
и
<b>dir</b>
, и даже свойства-обработчики событий, такие как
<b>onclick</b>
. Специализированные подклассы класса
<b>Element</b>
определяют атрибуты, характерные для представляемых ими элементов. Например, узнать URL-адрес изображения можно, обратившись к свойству
<b>src</b>
объекта
<b>HTMLElement</b>
, представляющего элемент
<b>&lt;img&gt;</b>
:

<b>var image = document.getElementById(&quot;myimage&quot;);</b>

<b>var imgurl = image.src; // Атрибут src определяет URL-адрес изображения </b>