Вывод порядкового номера li в списке
Здавствуйте.
Учу javascript и задался вопросом получения порядкового номера li при клике. Есть код. <div id="main"> <div class="holder"> <ul class="list" id="list"> <li>text text text</li> <li> text text text <ul> <li>text text text</li> <li>text text text</li> <li>text text text</li> </ul> </li> <li>text text text</li> <li> text text text <ul> <li>text text text</li> <li>text text text</li> <li>text text text</li> </ul> </li> <li>text text text</li> </ul> <ul class="list"> <li>text text text</li> <li>text text text</li> <li> text text text <ul> <li>text text text</li> <li>text text text</li> <li>text text text</li> </ul> </li> </ul> </div> </div> И начальный javascript(писал я)
<script type="text/javascript">
var holder = document.getElementById('main');
var massUl = holder.getElementsByTagName('ul');
for(var i = 0;i < massUl.length;i++) //Массив Ul.
{
var massLi2 = massUl[i].getElementsByTagName('li');
for(var k = 0;k < massLi2.length;k++)
{
massLi2[k].onclick = function(e)
{
return function()
{
alert(e);
}
}(k)
}
}
</script>
Задача - получить порядковый номер li от 0 до N по порядку в основном родтельском ul и так же в дочерних ul. Тоесть чтобы при клике на li основного родителя,который идет после li с вложенным ul, выводилось не 6(с учетом ul>ul>li) а его порядковый номер в его родителе. Надеюсь я понятно написал ) Долго думал над решением,но по нехватке опыта не могу покаместь ничего толкового придумать. Выкладывать изыски свои не стал :) Прошу хотя бы натолкнуть на правильную мысль,в каком направлении копать. Спасибо. |
Можно использовать свойство .children:
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
document.getElementsByTagName('ul')[0].onclick = function(event){
event = event || window.event;
var target = event.target || event.srcElement;
for(var i = 0, l = this.children.length; i < l; i++)
if( this.children[i] === target ){
alert(i);
break;
};
};
</script>
А с опытом научишься делать нормально:) |
Sweet, кстати это свойство не поддерживается в FF<=3 :)
Но его можно реализовать в виде метода child():
var child = children ? function(node) {
return node.children;
} : function(node) {
var list = node.childNodes,
length = list.length, i = -1,
array = [];
while(++i < length) {
if(list[i].nodeType == 1) {
array[i] = list[i];
}
}
return array;
};
|
profxhtml,
Вариант
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div id="main">
<div class="holder">
<ul class="list" id="list">
<li>text text text</li>
<li>
text text text
<ul>
<li>text text text</li>
<li>text text text</li>
<li>text text text</li>
</ul>
</li>
<li>text text text</li>
<li>
text text text
<ul>
<li>text text text</li>
<li>text text text</li>
<li>text text text</li>
</ul>
</li>
<li>text text text</li>
</ul>
<ul class="list">
<li>text text text</li>
<li>text text text</li>
<li>
text text text
<ul>
<li>text text text</li>
<li>text text text</li>
<li>text text text</li>
</ul>
</li>
</ul>
</div>
</div>
<script>
document.getElementById("main").onclick = function (a) {
var a = a || window.event,
a = a.target || a.srcElement,
b = a.parentNode;
if (a.nodeName.toLowerCase() == "li" && b.nodeName.toLowerCase() == "ul") {
for (var c = 0, a = a.previousSibling; a && a != b;)
a.nodeName.toLowerCase() == "li" && c++, a = a.previousSibling;
alert(c)
}
};
</script>
</body>
</html>
|
Всем большое спасибо! Буду разбираться в принципе работы,я думал что через делегирование - лучший вариант,но не догадался как реализовать. Еще раз спасибо.
|
| Часовой пояс GMT +3, время: 11:01. |