JavaScript. Подробное руководство, 6-е издание
Шрифт:
* дочернего элемента.
* Если в аргументе 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. Однако возможность расширения типов DOM может пригодиться для реализации особенностей, характерных для IE, в других броузерах. Как отмечалось выше, нестандартное свойство
children
объекта Element
было впервые реализовано в IE и только потом - в других броузерах. Используя следующий программный код, можно реализовать это свойство в броузерах, не поддерживающих его, таких как Firefox 3.0:
// Реализация свойства Element.children в броузерах,
// не поддерживающих его
// Обратите внимание, что этот метод возвращает статический
// массив, а не "живой" NodeList
if (!document.documentElement.children) {
Element.prototype.__defineGetter__("children",
function { var kids = [];
for(var c = this.firstChild; c != null; c = c.nextSibling)
if (c.nodeType === 1) kids.push(c);
return kids;
}):
}
Метод
__defineGetter__
(о нем рассказывается в разделе 6.7.1) не является стандартным, но его вполне можно использовать для обеспечения переносимости в таком программном коде, как этот.
15.4. Атрибуты
Поделиться:
Популярные книги
Слово мастера
11. Гибрид
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 30
30. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности. Книга третья
3. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
По осколкам твоего сердца
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
Сердце Дракона. Том 11
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Барон нарушает правила
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Валькирия
Фантастика:
фэнтези
9.49
рейтинг книги
Газлайтер. Том 1
1. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Черный Маг Императора 17
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Князь Андер Арес 2
2. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Паразиты
Проза:
современная проза
6.20
рейтинг книги
Запасная дочь
Фантастика:
фэнтези
6.40
рейтинг книги
Справочник логопеда
Научно-образовательная:
медицина
6.25
рейтинг книги
Оружейникъ
2. Александр Агренев
Фантастика:
альтернативная история
9.17