Шрифт:
* Если в аргументе п передать положительное число, функция вернет следующий
* 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-го брата первого дочернего элемента
}