#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. Я полностью понимаю. Я действительно ценю, что вы придерживаетесь этого до тех пор, пока вы это делали. Я оставлю это на некоторое время и попробую еще раз позже, так как я тоже расстроен. 🙂