如上图, 图中元素都为type='checkbox'的input
input1
选中, 则下面所有input
都要选中, input2
选中, 下面的input4
和input5
也都要选中, input2
和input3
都选中, 同样input1
也要选中,
这样用js怎么做呢?
如上图, 图中元素都为type='checkbox'的input
input1
选中, 则下面所有input
都要选中, input2
选中, 下面的input4
和input5
也都要选中, input2
和input3
都选中, 同样input1
也要选中,
这样用js怎么做呢?
思路仅供参考,没有具体测试,先构建一个节点的关系树,当选中一个时,更新自身状态及下级状态,整个状态更新完成后统一渲染上去,整体应该还有优化的空间,节点层级太深也没有考虑
const nodes = {
el: 'input1',
checked: false,
children: [{
el: 'input2',
checked: false,
children: [{
el: 'input4',
checked: false
}, {
el: 'input5',
checked: false
}]
}, {
el: 'input3',
checked: false,
children: [{
el: 'input6',
checked: false
}]
}]
};
[...document.querySelector('input[type="checkbox"]')].forEach(checkbox => {
checkbox.addEventListener('click', function(e) {
e.preventDefault();
const id = checkbox.getAttribute('id');
updateNodesCheckStatus({
el: id,
checked: !checkbox.checked
})
renderNodes(nodes)
})
})
function updateNodesCheckStatus(item) {
if (nodes.el === item.el) {
nodes.checked = item.checked
nodes.children.forEach(childNode => {
childNode.checked = item.checked
childNode.children.forEach(node => node.checked = item.checked)
})
return
}
nodes.children.forEach(childNode => {
if (childNode.el === item.el) {
// 选中的是一级子节点(input2或input3),则更新自身选中状态和下级选中状态
childNode.checked === item.checked
childNode.children.forEach(node => node.checked = item.checked)
} else {
const node = childNode.children.find(node => node.el === item.el)
if (node) {
// 选中的是二级子节点(input4,input5或input6),更新自身状态和父级状态
node.checked = item.checked
childNode.checked = childNode.children.every(node => node.checked)
}
}
})
// 根据input1的直属input的选中状态来更新input1的状态
nodes.checked = nodes.children.every(c => c.checked)
}
function renderNodes(nodes) {
document.querySelector(`#${nodes.el}`).checked = nodes.checked
nodes.children.forEach(childNode => {
document.querySelector(`#${childNode.el}`).checked = childNode.checked
childNode.children.forEach(node => {
document.querySelector(`#${node.el}`).checked = node.checked
})
})
}
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
在线体验地址