Как расширить представление дерева для определенного узла при загрузке страницы

#jquery #treeview #load #expand

#jquery #представление дерева #загрузка #Развернуть

Вопрос:

У меня есть treeview, который корректно расширяется вручную. Но мне нужно, чтобы он частично расширялся при загрузке страницы. Какая часть расширяется, будет определяться идентификатором в URL. В моем jsfiddle я добавил id =»xyz» в один из вложенных разделов, чтобы имитировать это действие. Поэтому, когда страница загружается, вся часть дерева выше, включая этот элемент, должна расширяться, но этого не происходит. Кто-нибудь, пожалуйста, взгляните?

     <style>
    ul, #myUL {
      list-style-type: none;
    }

    #myUL {
      margin: 0;
      padding: 0;
    }

    .box {
      cursor: pointer;
      -webkit-user-select: none; /* Safari 3.1  */
      -moz-user-select: none; /* Firefox 2  */
      -ms-user-select: none; /* IE 10  */
      user-select: none;
    }

    .box::before {
      content: "2610";
      color: black;
      display: inline-block;
      margin-right: 6px;
    }

    .check-box::before {
      content: "2611"; 
      color: dodgerblue;
    }

    .nested {
      display: none;
    }

    .active {
      display: block;
    }
    </style>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    <li><span class="caret">Beverages</span>
      <ul class="nested">
        <li>Water</li>
        <li>Coffee</li>
        <li><span class="caret">Tea</span>
          <ul class="nested">
            <li>Black Tea</li>
            <li>White Tea</li>
            <li><span class="caret" id="xyz">Green Tea</span>
              <ul class="nested">
                <li>Sencha</li>
                <li>Gyokuro</li>
                <li>Matcha</li>
                <li>Pi Lo Chun</li>
              </ul>
            </li>
          </ul>
        </li>  
      </ul>
    </li>
    <li><span class="caret">Food</span>
      <ul class="nested">
        <li>Water</li>
        <li>Coffee</li>
        <li><span class="caret">Tea</span>
          <ul class="nested">
            <li>Black Tea</li>
            <li>White Tea</li>
            <li><span class="caret">Green Tea</span>
              <ul class="nested">
                <li>Sencha</li>
                <li>Gyokuro</li>
                <li>Matcha</li>
                <li>Pi Lo Chun</li>
              </ul>
            </li>
          </ul>
        </li>  
      </ul>
    </li>

    <script>
     let $carets = $('.caret').on('click', e => {
        let $caret = $(e.target);
        
        // display the clicked item
        $caret.toggleClass('caret-down');
        $caret.closest('li').children('.nested').toggleClass('active');
        
      });
      
      $("#xyz").addClass('caret-down');
      let $parentCarets = $("#xyx").parents('li').children('.caret'); 
      $("#xyx").not($parentCarets).addClass('caret-down').closest('li').find('.nested').addClass('active');
     </script>
  

Ответ №1:

Вы можете сначала получить li ближайший span тег near, используя .closest() затем use .find() , чтобы получить все ul , но не тот, который после тега span, а затем добавить некоторый класс к другому uls , т.е.: unselect просто чтобы помочь скрыть этот ul.

Затем вы можете получить внешний li тег и использовать :not его, чтобы выбрать все ul , у которых нет unselect класса, и добавить active класс uls только к ним.

Демонстрационный код :

 let $carets = $('.caret').on('click', e => {
  let $caret = $(e.target);

  // display the clicked item
  $caret.toggleClass('caret-down');
  $caret.closest('li').children('.nested').toggleClass('active');

});

$("#xyz").addClass('caret-down bg');
//get closest li -> not first ul add some class to other
$("#xyz").closest('li').find('ul.nested:not(:first)').addClass("unselect")
//get closest li-> find ul ->show that
$("#xyz").closest('li.outer').find("ul:not(.unselect)").toggleClass('active');  
 ul,
#myUL {
  list-style-type: none;
}

#myUL {
  margin: 0;
  padding: 0;
}

.box {
  cursor: pointer;
  -webkit-user-select: none;
  /* Safari 3.1  */
  -moz-user-select: none;
  /* Firefox 2  */
  -ms-user-select: none;
  /* IE 10  */
  user-select: none;
}

.box::before {
  content: "2610";
  color: black;
  display: inline-block;
  margin-right: 6px;
}

.check-box::before {
  content: "2611";
  color: dodgerblue;
}

.nested {
  display: none;
}

.active {
  display: block;
}

.bg {
  background: red;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <!-- added this outer class -->
  <li class="outer"><span class="caret">Beverages</span>
    <ul class="nested">
      <li>Water</li>
      <li>Coffee</li>
      <li><span class="caret">Tea</span>
        <ul class="nested">
          <li>Black Tea</li>
          <li>White Tea</li>
          <li><span class="caret" id="xyz">Green Tea</span>
            <ul class="nested">
              <li>Sencha</li>
              <li>Gyokuro</li>
              <li>Matcha</li>
              <li>Pi Lo Chun</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
  <li class="outer"><span class="caret">Food</span>
    <ul class="nested">
      <li>Water</li>
      <li>Coffee</li>
      <li><span class="caret">Tea</span>
        <ul class="nested">
          <li>Black Tea</li>
          <li>White Tea</li>
          <li><span class="caret">Green Tea</span>
            <ul class="nested">
              <li>Sencha</li>
              <li>Gyokuro</li>
              <li>Matcha</li>
              <li>Pi Lo Chun</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>  

Комментарии:

1. Спасибо. Это намного ближе, но есть две проблемы. Вот мой обновленный jsfiddle — jsfiddle.net/user3052443/u26gpv79/26 Я добавил параметр идентификатора и узел после последнего вложенного (с именем single). Ваш код находит этот узел, но он открывает вложенный узел перед ним. Есть ли способ не делать этого? Кроме того, я использую unicode для fontawesome. Это не отображается в демо, но я не упоминал об этом, поскольку это не имело значения. Но с этим последним изменением значок добавляется к выбранному элементу, когда его не должно быть. Я не знаю, как показать это в jsfiddle, но это происходит здесь локально.

2. Проверьте, что эта скрипка решила первую проблему.. я не уверен во второй проблеме, не видя кода..

3. Спасибо, что придерживаетесь этого. Я изменил jsfiddle — jsfiddle.net/user3052443/u26gpv79/39 — чтобы показать две проблемы. Теперь вы можете видеть значки / -. Когда узел открыт, значок должен быть — но он остается на . И я добавил раздел «Последняя группа» и изменил идентификатор на один из них. Если идентификатор находится на одном узле, как и ранее, ваш код работает. Но когда он находится на узле в ul, ul над ним открывается. Я надеюсь, что это облегчает понимание проблем.

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

5. Я полностью понимаю. Я действительно ценю, что вы придерживаетесь этого до тех пор, пока вы это делали. Я оставлю это на некоторое время и попробую еще раз позже, так как я тоже расстроен. 🙂