gpt4 book ai didi

javascript - 嵌套的父/子复选框 - 工作解决方案需要 Bootstrap 的调整帮助

转载 作者:数据小太阳 更新时间:2023-10-29 03:53:04 25 4
gpt4 key购买 nike

我一直在寻找一种“完整”的解决方案来嵌套基于层次结构正确更改状态的父子复选框。

大多数“解决方案”都不起作用或只能在一个层面上起作用。他们还要求您以特定方式命名复选框。

This Stack Overflow 讨论涵盖了要点,但也提供了 Rory 发现的一个很好的解决方案 here .

我已经在我的开发项目中对其进行了测试,它可以完美地独立运行。但是,我使用的是 Bootstrap 2.x 和复选框

我有一个 JSFiddle它显示了工作示例代码,然后是我的带有禁用父复选框的版本,然后是无效的 Bootstrap 代码版本。

<!DOCTYPE html>
<body>
<!-- Raw working example from site http://css-tricks.com/indeterminate-checkboxes/ -->

<b>Raw working example</b>
<p>
<ul>
<li>
<input type="checkbox" name="tall" id="tall">
<label for="tall">Tall Things</label>
<ul>
<li>
<input type="checkbox" name="tall-1" id="tall-1">
<label for="tall-1">Buildings</label>
</li>
<li>
<input type="checkbox" name="tall-2" id="tall-2">
<label for="tall-2">Giants</label>
<ul>
<li>
<input type="checkbox" name="tall-2-1" id="tall-2-1">
<label for="tall-2-1">Andre</label>
</li>
<li>
<input type="checkbox" name="tall-2-2" id="tall-2-2">
<label for="tall-2-2">Paul Bunyan</label>
<ul>
<li>
<input type="checkbox" name="tall-2-2-1" id="tall-2-2-1">
<label for="tall-2-2-1">Son</label>
</li>
<li>
<input type="checkbox" name="tall-2-2-2" id="tall-2-2-2">
<label for="tall-2-2-2">Daughter</label>
</li>
</ul>
</li>
</ul>
</li>
<li>
<input type="checkbox" name="tall-3" id="tall-3">
<label for="tall-3">Two sandwiches</label>
</li>
</ul>
</li>
<li>
<input type="checkbox" name="short" id="short">
<label for="short">Short Things</label>
<ul>
<li>
<input type="checkbox" name="short-1" id="short-1">
<label for="short-1">Smurfs</label>
</li>
<li>
<input type="checkbox" name="short-2" id="short-2">
<label for="short-2">Mushrooms</label>
</li>
<li>
<input type="checkbox" name="short-3" id="short-3">
<label for="short-3">One Sandwich</label>
</li>
</ul>
</li>
</ul>

<hr>

<!-- Non Bootstrap Example -->
<b>My initial code example - Is Working</b>
<p>
<ul>
<li>

<input type="checkbox" name="" value="" disabled><strong>Ford</strong>

<ul>
<li>

<input type="checkbox" name="" value="">Fiesta</label>
</li>
<li>

<input type="checkbox" name="" value="">Focus</label>
</li>
<li>

<input type="checkbox" name="" value="">Mondeo</label>
</li>
</ul>
</li>
<li>

<input type="checkbox" name="" value="" disabled><strong>Vauxhall</strong>


<ul>
<li>

<input type="checkbox" name="" value="">Corsa</label>
</li>
<li>

<input type="checkbox" name="" value="">Astra</label>
</li>
<li>

<input type="checkbox" name="" value="">Vectra</label>
</li>
</ul>
</li>
</ul>

<hr>

<!-- Bootstrap Example -->

<b>Bootstrap based code example - Not Working</b>
<p>

<ul>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="" disabled><strong>Ford</strong>

</label>
<ul>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="">Fiesta</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="">Focus</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="">Mondeo</label>
</li>
</ul>
</li>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="" disabled><strong>Vauxhall</strong>

</label>
<ul>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="">Corsa</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="">Astra</label>
</li>
<li>
<label class="checkbox">
<input type="checkbox" name="" value="">Vectra</label>
</li>
</ul>
</li>
</ul>
$(function () {
// Apparently click is better chan change? Cuz IE?
$('input[type="checkbox"]').change(function (e) {
var checked = $(this).prop("checked"),
container = $(this).parent(),
siblings = container.siblings();

container.find('input[type="checkbox"]').prop({
indeterminate: false,
checked: checked
});

function checkSiblings(el) {
var parent = el.parent().parent(),
all = true;

el.siblings().each(function () {
return all = ($(this).children('input[type="checkbox"]').prop("checked") === checked);
});

if (all && checked) {
parent.children('input[type="checkbox"]').prop({
indeterminate: false,
checked: checked
});
checkSiblings(parent);
} else if (all && !checked) {
parent.children('input[type="checkbox"]').prop("checked", checked);
parent.children('input[type="checkbox"]').prop("indeterminate", (parent.find('input[type="checkbox"]:checked').length > 0));
checkSiblings(parent);
} else {
el.parents("li").children('input[type="checkbox"]').prop({
indeterminate: true,
checked: false
});
}
}

checkSiblings(container);
});
});

我的理解是需要在某处更改代码以使用parentsclosest。代码更好的人能否帮助确定需要进行更改以使 Bootstrap 版本正常工作的位置。

最佳答案

看看免费的JSTree用户控制。它是基于 JavaScript 的,开源的,并允许配置多种样式的 TreeView ,例如:

enter image description here

由于此处显示的复选框只是图像,您可以轻松地将它们替换为单选按钮,并且通过事件处理,您可以禁止多项选择,因此它们在需要时表现得像单选按钮。

这是通过如下指定 “checkbox” 插件来实现的(请参阅下面我提供的完整工作代码片段):

$(function () {
$("#demo1")
.jstree({
"themes": {
"theme": "apple","dots": false,"icons": false
},
"plugins": ["themes", "html_data", "checkbox", "sort", "ui"]
});
});

相应的 HTML 结构如下所示,只需将其包含在您的页面正文中即可:

<div id="demo1" class="demo" style="height:100px;">
<ul>
<li id="phtml_1"> <a href="#">Root node 1</a>
<ul>
<li id="phtml_2"> <a href="#">Child node 1</a>
</li>
<li id="phtml_3"> <a href="#">Child node 2</a>
</li>
</ul>
</li>
<li id="phtml_4"> <a href="#">Root node 2</a>
</li>
</ul>
</div>

要获取选中的值,请使用此函数(假设您已经像我在 JSFiddle 示例中那样使用 id="listForDisplay" 创建了一个 div):

var $listForDisplay = $("#listForDisplay");
function displayList(data) { // see: https://www.jstree.com/docs/events/
var i, j, r = [];
for (i = 0, j = data.selected.length; i < j; i++) {
r.push(data.instance.get_node(data.selected[i]).text);
}
$listForDisplay.html('Selected: ' + r.join(', '));
}

此代码可以在单击事件中触发,也可以像我一样绑定(bind) JSTree 事件。将以下内容附加到前面的 JavaScript 代码段即可:

    $("#demo1")
.on('loaded.jstree', function (e, data) {
displayList(data);
})
.on('change_state.jstree', function (e, data) {
displayList(data);
});

注意:选择父节点时,父节点名称会与子节点一起列出。如果只选择 child ,则不会列出相关的 parent 。

您可以找到有关指定此插件行为的选项的更多信息 here .


可运行代码片段(完整代码)

$(function() {

var $demo1 = $("#demo1");

var $listForDisplay = $("#listForDisplay");
function displayList(data) { // see: https://www.jstree.com/docs/events/
var i, j, r = [];
for (i = 0, j = data.selected.length; i < j; i++) {
r.push(data.instance.get_node(data.selected[i]).text);
}
$listForDisplay.html('Selected: ' + r.join(', '));
}

$demo1.jstree({
"themes": {
"theme": "apple",
"dots": false,
"icons": false
},
"plugins": ["themes", "html_data", "checkbox", "sort", "ui"]
});
$demo1.on('loaded.jstree', function(e, data) {
displayList(data);
});
$demo1.on('changed.jstree', function(e, data) {
displayList(data);
});
});
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<link href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" rel="stylesheet" />

<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>
</head>

<body>
<div id="demo1" class="demo" style="height:100px;">
<ul>
<li id="phtml_1"> <a href="#">Root node 1</a>
<ul>
<li id="phtml_2"> <a href="#">Child node 1</a>
</li>
<li id="phtml_3"> <a href="#">Child node 2</a>
</li>
</ul>
</li>
<li id="phtml_4"> <a href="#">Root node 2</a>
</li>
</ul>
</div>
<br/>
<div id="listForDisplay" />
</body>

关于javascript - 嵌套的父/子复选框 - 工作解决方案需要 Bootstrap 的调整帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355375/

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