我将尽力描述我的问题。这个社区以前曾为我提供过帮助,所以我希望有人能够再次向我提供帮助。我对JQuery不太了解。
我们正在使用Easy Digital Downloads设置一个wordpress网站,因此存在一些限制,例如无法更改HTML ,但是我们可以在页面上添加添加JQuery元素。
这是用于类别选择系统的,用户应该只能选择1个父类别和该父项下的多个子类别。
我正在寻找以下情况的JQuery解决方案。
我们有5个,可能是6个“类别”。 这些类别具有以UL表示的子类别。默认情况下,子类别应隐藏。 当您单击父类别时,它应该在下面显示子类别。 如果您随时单击相同的父类别,它将取消选择所有子类别并再次将其隐藏。
我也只希望在任何给定点选择1个父类别。
让我给你一个场景。 单击Cat A,它会展开并显示4个子类别。 您单击这些子类别中的2。 您改变主意,而是单击CatB。 然后,应隐藏Cat A的子类别,并取消选择Cat A的子代和父代。
如果我还不够清楚的话,重要的是您永远都不能选择没有父类别的子类别。
我已经在另一个线程中找到了一些东西作为基本提琴。 Just仅用于显示和隐藏(尽管我尚未添加用于隐藏的类)这具有我们正在使用的html结构。
另一个问题是,所有父类别对子(.children)使用相同的类
$('#in-download_category-156').click(function() {
$(".children").toggle(this.checked);
});
我知道这是一个很大的问题,因此,我感谢您为我提供的任何帮助! 谢谢
答案 0 :(得分:0)
尝试一下(我在下面添加了一些注释):
$('.fes-category-checklist > li > input[name^="download_category"]').change(function() {
$(this)
.closest('ul')
.find('input[name^="download_category"]')
.not(this)
.prop('checked', false);
});
ul {
list-style: none;
padding-left: 20px;
}
ul.fes-category-checklist > li > input[name^="download_category"]:not(:checked) ~ ul.children {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="fes-category-checklist">
<li id="download_category-156">
<input value="156" type="checkbox" name="download_category[]" id="in-download_category-156" />
<label for="in-download_category-156" class="selectit">cat a</label>
<ul class="children">
<li id="download_category-161"><label class="selectit"><input value="161" type="checkbox" name="download_category[]" id="in-download_category-161"> cat a-1</label></li>
<li id="download_category-162"><label class="selectit"><input value="162" type="checkbox" name="download_category[]" id="in-download_category-162"> cat a-2</label></li>
<li id="download_category-163"><label class="selectit"><input value="163" type="checkbox" name="download_category[]" id="in-download_category-163"> cat a-3</label></li>
<li id="download_category-183"><label class="selectit"><input value="183" type="checkbox" name="download_category[]" id="in-download_category-183"> cat a-4</label></li>
</ul>
</li>
<li id="download_category-160">
<input value="160" type="checkbox" name="download_category[]" id="in-download_category-160" />
<label for="in-download_category-160" class="selectit">cat b</label>
<ul class="children">
<li id="download_category-198"><label class="selectit"><input value="198" type="checkbox" name="download_category[]" id="in-download_category-198"> cat b-1</label></li>
<li id="download_category-199"><label class="selectit"><input value="199" type="checkbox" name="download_category[]" id="in-download_category-199"> cat b-2</label></li>
<li id="download_category-200"><label class="selectit"><input value="200" type="checkbox" name="download_category[]" id="in-download_category-200"> cat b-3</label></li>
<li id="download_category-201"><label class="selectit"><input value="201" type="checkbox" name="download_category[]" id="in-download_category-201"> cat b-4</label></li>
</ul>
</li>
<li id="download_category-155">
<input value="155" type="checkbox" name="download_category[]" id="in-download_category-155" />
<label for="in-download_category-155" class="selectit">cat c</label>
<ul class="children">
<li id="download_category-164"><label class="selectit"><input value="164" type="checkbox" name="download_category[]" id="in-download_category-164"> cat c-1</label></li>
<li id="download_category-165"><label class="selectit"><input value="165" type="checkbox" name="download_category[]" id="in-download_category-165"> cat c-2</label></li>
<li id="download_category-166"><label class="selectit"><input value="166" type="checkbox" name="download_category[]" id="in-download_category-166"> cat c-3</label></li>
<li id="download_category-169"><label class="selectit"><input value="169" type="checkbox" name="download_category[]" id="in-download_category-169"> cat c-4</label></li>
<li id="download_category-171"><label class="selectit"><input value="171" type="checkbox" name="download_category[]" id="in-download_category-171"> cat c-5</label></li>
<li id="download_category-168"><label class="selectit"><input value="168" type="checkbox" name="download_category[]" id="in-download_category-168"> cat c-6</label></li>
<li id="download_category-170"><label class="selectit"><input value="170" type="checkbox" name="download_category[]" id="in-download_category-170"> cat c-7</label></li>
<li id="download_category-202"><label class="selectit"><input value="202" type="checkbox" name="download_category[]" id="in-download_category-202"> cat c-8</label></li>
</ul>
</li>
<li id="download_category-157">
<input value="157" type="checkbox" name="download_category[]" id="in-download_category-157" />
<label class="selectit" for="in-download_category-157">cat d</label>
</li>
</ul>
请注意,我正在将第一个复选框组从它们上的label
and assigning a for
attribute中移出。
要以上面示例中所示的方式将
<label>
与<input>
元素相关联,您需要给<input>
一个id
属性。<label>
然后需要一个for
属性,其值与输入的id
相同。
还使用一些CSS技巧,使您可以根据元素的pseudo-class为所有相邻的兄弟姐妹设置样式,在我们的示例中:带有:checked
的复选框元素州。由于我们的ul.children
不是复选框的直接同级项,因此我们需要使用child combinator来将其定位为样式,而不是general sibling combinator。这有助于您不需要任何Java脚本来切换子类别UL的可见性状态。
好的,因此,由于HTML结构必须保持完整,并且父元素和子元素共享相同的类,因此我们可能没有太多选择,只能使用 chained 子组合器,因为我们不希望任何子代获得与父代相同的样式。 除非,否则您可以为父母分配一些特殊的班级或属性(例如<li id="download_category-156" class="parent-category">
),以将其与孩子分开。
这看起来很难看(选择器更长),但它应该可以解决问题:
$('.fes-category-checklist > li > label.selectit > input[name^="download_category"]').change(function() {
var categoryId = this.value;
var $checkbox = $(this);
$('.fes-category-checklist')
.find('li[id^="download_category"]')
.attr('data-open', function(index, value) {
return this.id.endsWith(categoryId) && value === 'false';
});
$checkbox
.closest('ul')
.find('input[name^="download_category"]')
.not(this)
.prop('checked', false);
});
$(document).ready(function() {
$('ul.fes-category-checklist')
.find('> li[id^="download_category"]')
.attr('data-open', false)
.fadeIn();
});
ul {
list-style: none;
padding-left: 20px;
}
ul.fes-category-checklist > li {
display: none;
}
li[data-open="false"] > ul.children {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<ul class="fes-category-checklist">
<li id="download_category-156">
<label class="selectit">
<input value="156" type="checkbox" name="download_category[]" id="in-download_category-156"> cat a
</label>
<ul class="children">
<li id="download_category-161"><label class="selectit"><input value="161" type="checkbox" name="download_category[]" id="in-download_category-161"> cat a-1</label></li>
<li id="download_category-162"><label class="selectit"><input value="162" type="checkbox" name="download_category[]" id="in-download_category-162"> cat a-2</label></li>
<li id="download_category-163"><label class="selectit"><input value="163" type="checkbox" name="download_category[]" id="in-download_category-163"> cat a-3</label></li>
<li id="download_category-183"><label class="selectit"><input value="183" type="checkbox" name="download_category[]" id="in-download_category-183"> cat a-4</label></li>
</ul>
</li>
<li id="download_category-160">
<label class="selectit">
<input value="160" type="checkbox" name="download_category[]" id="in-download_category-160"> cat b
</label>
<ul class="children">
<li id="download_category-198"><label class="selectit"><input value="198" type="checkbox" name="download_category[]" id="in-download_category-198"> cat b-1</label></li>
<li id="download_category-199"><label class="selectit"><input value="199" type="checkbox" name="download_category[]" id="in-download_category-199"> cat b-2</label></li>
<li id="download_category-200"><label class="selectit"><input value="200" type="checkbox" name="download_category[]" id="in-download_category-200"> cat b-3</label></li>
<li id="download_category-201"><label class="selectit"><input value="201" type="checkbox" name="download_category[]" id="in-download_category-201"> cat b-4</label></li>
</ul>
</li>
<li id="download_category-155">
<label class="selectit">
<input value="155" type="checkbox" name="download_category[]" id="in-download_category-155"> cat c
</label>
<ul class="children">
<li id="download_category-164"><label class="selectit"><input value="164" type="checkbox" name="download_category[]" id="in-download_category-164"> cat c-1</label></li>
<li id="download_category-165"><label class="selectit"><input value="165" type="checkbox" name="download_category[]" id="in-download_category-165"> cat c-2</label></li>
<li id="download_category-166"><label class="selectit"><input value="166" type="checkbox" name="download_category[]" id="in-download_category-166"> cat c-3</label></li>
<li id="download_category-169"><label class="selectit"><input value="169" type="checkbox" name="download_category[]" id="in-download_category-169"> cat c-4</label></li>
<li id="download_category-171"><label class="selectit"><input value="171" type="checkbox" name="download_category[]" id="in-download_category-171"> cat c-5</label></li>
<li id="download_category-168"><label class="selectit"><input value="168" type="checkbox" name="download_category[]" id="in-download_category-168"> cat c-6</label></li>
<li id="download_category-170"><label class="selectit"><input value="170" type="checkbox" name="download_category[]" id="in-download_category-170"> cat c-7</label></li>
<li id="download_category-202"><label class="selectit"><input value="202" type="checkbox" name="download_category[]" id="in-download_category-202"> cat c-8</label></li>
</ul>
</li>
<li id="download_category-157">
<label class="selectit"><input value="157" type="checkbox" name="download_category[]" id="in-download_category-157"> cat d</label>
</li>
</ul>
以下几行最初会将它们设置为hidden
。如果您要单独调整状态,也可以通过function in the second argument。
$(document).ready(function() {
$('ul.fes-category-checklist')
.find('> li[id^="download_category"]')
.attr('data-open', false)
.fadeIn();
});
此外,如果您希望在切换孩子UL时给他们一些幻想效果,请查看my other post,了解如何使用jQuery slideToggle
。
希望有帮助!