gpt4 book ai didi

javascript - 使用纯 JavaScript 折叠树表

转载 作者:行者123 更新时间:2023-12-02 22:17:10 25 4
gpt4 key购买 nike

我正在尝试创建一个折叠树表结构。当我单击 tr child tr 打开时,依此类推。这是在 UI 中以树形式表示的文件夹结构。我使用了 How to create a collapsing tree table in html/css/js? 中显示的示例

它工作得很好,但我不能使用 jquery,因为它是一个遗留应用程序并且仅是严格的纯 JS。有人可以帮忙将此 jquery 转换为纯 JS 吗?

<table id="mytable">
<tr data-depth="0" class="collapse level0">
<td><span class="toggle collapse"></span>Item 1</td>
<td>123</td>
</tr>
<tr data-depth="1" class="collapse level1">
<td><span class="toggle"></span>Item 2</td>
<td>123</td>
</tr>
<tr data-depth="2" class="collapse level2">
<td>Item 3</td>
<td>123</td>
</tr>
<tr data-depth="1" class="collapse level1">
<td>Item 4</td>
<td>123</td>
</tr>
<tr data-depth="0" class="collapse collapsable level0">
<td><span class="toggle collapse"></span>Item 5</td>
<td>123</td>
</tr>
<tr data-depth="1" class="collapse collapsable level1">
<td>Item 6</td>
<td>123</td>
</tr>
</table>

jquery

$(function() {
$('#mytable').on('click', '.toggle', function () {
//Gets all <tr>'s of greater depth below element in the table
var findChildren = function (tr) {
var depth = tr.data('depth');
return tr.nextUntil($('tr').filter(function () {
return $(this).data('depth') <= depth;
}));
};

var el = $(this);
var tr = el.closest('tr'); //Get <tr> parent of toggle button
var children = findChildren(tr);

//Remove already collapsed nodes from children so that we don't
//make them visible.
//(Confused? Remove this code and close Item 2, close Item 1
//then open Item 1 again, then you will understand)
var subnodes = children.filter('.expand');
subnodes.each(function () {
var subnode = $(this);
var subnodeChildren = findChildren(subnode);
children = children.not(subnodeChildren);
});

//Change icon and hide/show children
if (tr.hasClass('collapse')) {
tr.removeClass('collapse').addClass('expand');
children.hide();
} else {
tr.removeClass('expand').addClass('collapse');
children.show();
}
return children;
});
});

CSS

table td {
border: 1px solid #eee;
}
.level1 td:first-child {
padding-left: 15px;
}
.level2 td:first-child {
padding-left: 30px;
}

.collapse .toggle {
background: url("http://mleibman.github.com/SlickGrid/images/collapse.gif");
}
.expand .toggle {
background: url("http://mleibman.github.com/SlickGrid/images/expand.gif");
}
.toggle {
height: 9px;
width: 9px;
display: inline-block;
}

最佳答案

已转换。试试这个看看是否有效:

https://jsfiddle.net/sirhvd/u2ypsanj/

[].forEach.call(document.querySelectorAll('#mytable .toggle'), function(el) {
el.addEventListener('click', function() {
var el = this;
var tr = el.closest('tr');
var children = findChildren(tr);
var subnodes = children.filter(function(element) {
return element.matches('.expand');
});
subnodes.forEach(function(subnode) {
var subnodeChildren = findChildren(subnode);
children = children.filter(function(element) {
return !subnodeChildren.includes(element);
});
});
if (tr.classList.contains('collapse')) {
tr.classList.remove('collapse');
tr.classList.add('expand');
children.forEach(function(child) {
child.style.display = 'none';
});
} else {
tr.classList.remove('expand');
tr.classList.add('collapse');
children.forEach(function(child) {
child.style.display = '';
});
}
})
})

var findChildren = function(tr) {
var depth = tr.dataset.depth;
var elements = [...document.querySelectorAll('#mytable tr')].filter(function(element) {
return element.dataset.depth <= depth;
});
var next = nextUntil(tr, elements);
return next;
};

var nextUntil = function(elem, elements, filter) {
var siblings = [];
elem = elem.nextElementSibling;
while (elem) {
if (elements.includes(elem)) break;
if (filter && !elem.matches(filter)) {
elem = elem.nextElementSibling;
continue;
}
siblings.push(elem);
elem = elem.nextElementSibling;
}
return siblings;
};
table td {
border: 1px solid #eee;
}

.level1 td:first-child {
padding-left: 15px;
}

.level2 td:first-child {
padding-left: 30px;
}

.collapse .toggle {
background: url("http://mleibman.github.com/SlickGrid/images/collapse.gif");
}

.expand .toggle {
background: url("http://mleibman.github.com/SlickGrid/images/expand.gif");
}

.toggle {
height: 9px;
width: 9px;
display: inline-block;
}
<table id="mytable">
<tr data-depth="0" class="collapse level0">
<td><span class="toggle collapse"></span>Item 1</td>
<td>123</td>
</tr>
<tr data-depth="1" class="collapse level1">
<td><span class="toggle"></span>Item 2</td>
<td>123</td>
</tr>
<tr data-depth="2" class="collapse level2">
<td>Item 3a</td>
<td>123</td>
</tr>
<tr data-depth="2" class="collapse level2">
<td>Item 3b</td>
<td>123</td>
</tr>
<tr data-depth="2" class="collapse level2">
<td>Item 3c</td>
<td>123</td>
</tr>
<tr data-depth="1" class="collapse level1">
<td>Item 4</td>
<td>123</td>
</tr>
<tr data-depth="0" class="collapse collapsable level0">
<td><span class="toggle collapse"></span>Item 5</td>
<td>123</td>
</tr>
<tr data-depth="1" class="collapse collapsable level1">
<td>Item 6</td>
<td>123</td>
</tr>
</table>

关于javascript - 使用纯 JavaScript 折叠树表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59350142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com