Обернуть все li в ul если они дочерние

74
07 апреля 2021, 21:30

Есть меню сайта

<ul>
  <li>Меню1</li>
  <li>Меню2</li>
  <li>Меню3
    <li>ДочМеню3</li>
    <li>ДочМеню3</li>
    <li>ДочМеню3</li>
  </li>     
</ul>

Если в Меню3 будут еще дочерние элементы, то их обернуть в <ul class="sub"></ul>

 <ul>
  <li>Меню1</li>
  <li>Меню2</li>
  <li>Меню3
    <ul class="sub">
     <li>ДочМеню3</li>
     <li>ДочМеню3</li>
     <li>ДочМеню3</li>
    <ul>
  </li>    
</ul>

Как правильно написать на js? Спасибо!

Answer 1

Проблема в том, что браузер как только натыкается на новый открытый <li>, когда предыдущий еще не закрыт - автоматически закрывает его, потом только идет дальше. Поэтому изначально не может быть такой ситуации, чтобы li были внутри других... поэтому можно заранее записать их в виде div, а подменить на li только после добавления ul.

var ul = document.getElementById('ul'); 
 
var li = ul.querySelectorAll('li'); 
 
for( var i = 0; i < li.length; i++ ){ 
  var div = li[i].querySelector('div'); 
  if( div ){ //Если внутри очередного li есть div... 
 
    var x = li[i];  
    // здесь методы вставки HTML не прокатят, потому что браузер автоматически 
    // дописывает теги и мешает. Поэтому только регулярки. 
     
    x.outerHTML = x.outerHTML.replace(/<div>/, '<ul class="sub"><div>') 
                             .replace(/<\/li>/, '</ul></li>') 
                             .replace(/(<|<\/)div>/g,"$1li>");  
    // $1 указывает на то, что в скобках, внутри выражения 
     
  } 
}
<ul id="ul"> 
  <li>Меню1</li> 
  <li>Меню2</li> 
  <li>Меню3 
    <div>ДочМеню3</div> 
    <div>ДочМеню3</div> 
    <div>ДочМеню3</div> 
  </li>   
</ul>

P.s. и я всё равно не представил, где в реальной жизни можно наткнуться на такую задачу.

READ ALSO
Удаление контекстного меню окна WPF

Удаление контекстного меню окна WPF

Мне необходимо сделать с помощью WPF окошко, у которого нет заголовкаКазалось бы все просто WindowStyle=None, но есть один большой подводный камень,...

104
Определить находится ли точка в области

Определить находится ли точка в области

Точка находится внутри области, попробывал несколько методов, все определяють, что она извне

74
Метод для поиска по разным столбцам

Метод для поиска по разным столбцам

У меня есть Form с ComboBox и TextBoxПервый содержит имена столбцов, второй содержит текст для поиска

104
Где метод Table&lt;T&gt; Update?

Где метод Table<T> Update?

Использую дженерик репозиторий в проекте и и не могу понять как реализовать редактирование модели? Использую adonet и нигде не могу найти информацию...

96