2009-10-20 2 views
3

Могу ли я иметь какой-либо способ узнать, какая глубина ребенка основана на контейнере. Пример:глубина ребенка в DOM

<div id="dontainer"> 
    <ul> 
     <li>1</li> 
     <li>2</li> 
     <li id="xelement">3</li> 
     <li>4</li> 
     <li>5</li> 
    </ul> 
</div> 

Вы должны получить 2 для "XElement" (принимая, как, начиная с 0). Зная, что «ли» находятся на одном уровне.

Благодаря

+0

Вы спрашиваете, как найти глубину ребенка в родительском, учитывая оба? Если это так, это так же просто, как итерация через всех родителей ребенка, пока вы не нажмете желаемого родителя и не сохраните счет. –

ответ

6

Предполагая, что вы хотите найти глубину ребенка относительно какого-либо произвольного предка.

function depth(parent, descendant) { 
    var depth = 0; 
    var el = $(descendant); 
    var p = $(parent)[0]; 
    while (el[0] != p) { 
    depth++; 
    el = el.parent(); 
    } 
    return depth; 
} 

// Example call: 
depth(".mainContent", "li") 

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

В качестве альтернативы, и только если вы поддерживаете ES5 и выше, работая непосредственно с узлами DOM может устранить зависимость от JQuery:

function depth(parent, descendant) { 
    var depth = 0; 
    while (!descendant.isEqualNode(parent)) { 
     depth++; 
     descendant = descendant.parentElement; 
    } 
    return depth; 
} 

// Example call: 
depth(document.querySelector('.mainContent'), document.querySelector('li')) 
+0

Мы модифицируем пример с помощью «el [0]! = Parent [0]», потому что «.not» удаляет элементы, и нам нужно знать, являются ли они разными. –

+0

Отредактировано для добавления реализации javascript ванили –

8
$.fn.depth = function() { 
    return $(this).parents().length; 
}; 

или что-то подобное.

+0

oh wait - «на основе контейнера» вы подразумеваете глубину относительно контейнера. Ну, вы можете получить глубину обоих и вычесть или использовать выражение фильтра «#containerId *» в первом вызове. – Pointy

+0

Для абсолютной глубины в дереве мне нравится это решение для jquery. заканчивается на глубине == 1. –

0

Простая рекурсивная функция, то вдоль линий: (Хотя я рекомендуется использовать инструментарий, это хорошая маленькая обучающая игра, ошибки фиксацией с оставляется в качестве упражнения для читателей)

 
function countDepth(node, stopPredicate, count) { 
    count = count || 0 
    stopPredicate = stopPredicate || function() {} 
    if (stopPredicate(node) || !node.parentNode) { 
    return count 
    } 
    return countDepth(node.parentNode, stopPredicate, count + 1) 
} 

var depth = countDepth(document.getElementById("xelement"), function (node) { 
    return "dontainer" == node.id 
}) 

// or, with no predicate -- will count *full* depth 
// depth = countDepth(document.getElementById("xelement")) 

alert(depth) 

Edit:. Если вы используете JQuery, смотрите функцию ближайшего().