рекурсивный обход меню
Доброго времени суток.
Требуется обойти древовидное меню, подскажите как исправить, а то в ступор зашёл. Функция доходит до самых младших потомков (узлов), обрабатывает их, некоторых почему-то дважды, и помирает. Как исправить не знаю :cray: <div id="first"> <ul id="editor"> <li>1 <ul> <li>11</li> <li>12</li> <li>13 <ul> <li>131</li> <li>132</li> <li>133</li> </ul> </li> <li>14</li> </ul> </li> <li>2 <ul> <li>21</li> <li>22</li> <li>23</li> </ul> </li> <li>3</li> <li>4</li> </ul> </div> function Next(n) { if(n.getElementsByTagName('li').length > 0) return n; } function rec(ul) { if(ul.getElementsByTagName('ul').length > 0) { el=ul.getElementsByTagName('ul')[0].childNodes; if( el.length > 0 ) { for(var i=0; i < el.length; i++) { if(el[i].nodeType != 3) { alert( el[i].innerHTML ); if(Next(el[i])) rec( el[i] ); } } } } } rec(document.getElementById('first')); P.S. желательно без библиотек |
Могу предложить такой вариант
<script type = "text/javascript"> window.onload = function(){ function hasSubs(li){ var subs = []; for(var i = 0, il = li.childNodes.length; i < il; i ++){ if(li.childNodes[i].nodeName == "UL"){ subs[subs.length] = li.childNodes[i]; } } return subs; } function isLI(node){ return node.nodeName == "LI"; } function count(ul){ var childs = ul.childNodes; for(var i = 0, il = childs.length; i < il; i ++){ if(isLI(childs[i])){ var subs = hasSubs(childs[i]); if(subs.length){ for(var j = 0, jl = subs.length; j < jl; j ++){ count(subs[j]); } }else{ alert("item" + childs[i].innerHTML); } } } } var outer = document.getElementById("menu"); count(outer); } </script> <ul id = "menu"> <li>1</li> <li>2</li> <li>3</li> <li> <ul> <li>4.1</li> <li>4.2</li> <li>4.3</li> <li> <ul> <li>4.4.1</li> <li>4.4.2</li> <li>4.4.3</li> <li>4.4.4</li> </ul> </li> </ul> </li> <li>5</li> </ul> |
на первый взгляд работает, но пункты "4" и "4.4" (которые ты специально не вписал :p ) не обрабатывает))
кое что интересное подчеркнул для себя |
Все работает ровно так как я хотел) совокупность вложенныx 4.x пунктов и образуют пункт 4, мoй вариант обрабоатывет li без дочерних ul, если нужно отображать таки корневой пункт 4, то я бы перед списком ul с дочерними меню вставил div скажем
Цитата:
<ul id = "menu"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li> <ul> <li>4.1</li> <li>4.2</li> <li>4.3</li> <li>4.4</li> <li> <ul> <li>4.4.1</li> <li>4.4.2</li> <li>4.4.3</li> <li>4.4.4</li> </ul> </li> </ul> </li> <li>5</li> </ul> И тогда все будет работать ок |
poorking,
спасибо что отозвались, вопрос решён, указали на мою ошибку. http://forum.vingrad.ru/forum/topic-...2342178/0.html |
Цитата:
|
Цитата:
<li> <div>пункт 4</div> <ul> <li>Пункт 4.1</li> <li>Пункт 4.2</li> <li>Пункт 4.3</li> </ul> </li> Или что, валидатор разрешает в li только ul из блочных помещать? |
точно. вы правы. глупость сказал
|
Часовой пояс GMT +3, время: 11:49. |