Чтение онлайн

ЖАНРЫ

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

* Если в аргументе п передать положительное число, функция вернет следующий

* n-й братский элемент.

* Если в аргументе п передать отрицательное число, функция вернет предыдущий

* n-й братский элемент.

* Если в аргументе п передать ноль, функция вернет сам элемент е.

*/

function sibling(e.n) {

while(e && n !== 0) { //
Если e не определен, просто вернуть его

if (n > 0) { // Отыскать следующий братский элемент

if (е.nextElementSibling) е = е.nextElementSibling;

else {

for(e=e.nextSibling; e && e.nodeType !== 1; e=e.nextSibling)

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

}

n--;

}

else { // Отыскать предыдущий братский элемент

if (e.previousElementSibing) e = e.previousElementSibling;

else {

for(e=e.previousSibling;e&&e.nodeType!==1;e=e.previousSibling)

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

}

n++;

}

}

return e;

}

/**

* Возвращает n-й дочерний элемент элемента е или null, если нет такого

* дочернего элемента.

* Если в аргументе n передать отрицательное число, поиск дочернего элемента

* будет выполняться с конца. 0 соответствует первому дочернему элементу,

* но -1 - последнему, -2 - второму с конца и т. д.

*/

function child(e, n) {

if (e.children) { // Если массив children существует

if (n < 0) n += e.children.length; // Преобразовать отрицательное

// число в индекс массива

if (п < 0) return null; // Если получилось отрицательное число,

// значит, нет такого дочернего элемента

return е.children[n3; // Вернуть заданный дочерний элемент

}

// Если элемент е не имеет массива children, начать поиск с первого

// дочернего элемента, двигаясь вперед, или начать поиск с последнего

//
дочернего элемента, двигаясь назад.

if (n >= 0) { // n - положительное: двигаться вперед, начиная с первого

// Найти первый дочерний элемент элемента е

if (е.firstElementChild) е = е.firstElementChild;

else {

for(e = е.firstChild; е && e.nodeType !== 1; е = е.nextSibling)

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

}

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

}

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

if (е.lastElementChild) е = е.lastElementChild;

else {

for(e = e.lastChild; e && e.nodeType !== 1; e=e.previousSibling)

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

}

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

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

}

}

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

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

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

38

IE поддерживает возможность расширения прототипов объектов Element, HTMLDocument и Text, но не поддерживает для объектов Node, Document, HTMLElement и всех подтипов типа HTMLElement

Element.prototype.next = function {

if (this.nextElementSibling) return this.nextElementSibling;

var sib = this.nextSibling;

while(sib && sib.nodeType !== 1) sib = sib.nextSibling;

return sib;

};

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

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

Поделиться с друзьями: