我有几个divs
,我尝试根据一些下拉列表过滤器来过滤它们,我使用data-product_cost=true
属性来列出它们,所以如果我在下拉列表中选择product_cost
,所有具有product_cost=true
属性的产品div都会显示在列表中,而其他的不会。
从"Kontogebühren"下拉列表中,如果选择"Kostenlose Kontoführung",则当前显示所有卡。对于"Kostenlose Kontoführung"选项选择,应仅显示N26、Comdirect和DKB卡。
//选择标签
jQuery(document).ready(function($) {
jQuery("#products-filter").change(function() {
filtering_vergleiche();
});
filtering_vergleiche();
function filtering_vergleiche() {
var choosen_filter = [];
jQuery('.product-item').removeClass('filter_hidden');
jQuery('.filter_no_results').remove();
jQuery('.products-filter select option:selected').each(function(index) {
var current_filter_name = jQuery(this).attr('name');
var current_filter_value = jQuery(this).attr('value');
//Create object with all necessary info
choosen_filter.push({
"name": current_filter_name,
"value": current_filter_value
});
});
count_item = 0;
count_hidden = 0;
jQuery('.product-item').each(function(index) {
for (var i = 0; i < choosen_filter.length; ++i) {
choosen_filter_item = choosen_filter[i];
choosen_filter_name = choosen_filter_item.name;
choosen_filter_value = choosen_filter_item.value;
filter_value_on_product = jQuery(this).attr('data-' + choosen_filter_name);
if (choosen_filter_value != 'alle') {
if (filter_value_on_product.indexOf(',') > -1) {
let segments = filter_value_on_product.split(',').map(element => element.trim());;
if (!segments.includes(choosen_filter_value)) {
jQuery(this).addClass('filter_hidden');
}
} else if (filter_value_on_product != choosen_filter_value) {
jQuery(this).addClass('filter_hidden');
}
}
}
count_item++;
});
jQuery('.product-item.filter_hidden').each(function(index) {
count_hidden++;
});
//Nachricht anzeigen wenn keine Produkte gefunden wurden
if (count_hidden == count_item) {
jQuery("<p class='filter_no_results'>Zu dieser Auswahl wurden leider keine Ergebnisse gefunden.<br>Bitte andere Kriterien auswählen.<p>").appendTo('.product-item-listing');
}
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<html>
<body>
<select id="filter_checkboxes" class="vergleich_select" size="1" name="term">
<option id="filter_all" name="filter_alle" value="alle">
Alle
</option>
<option id="product_cost" name="product_cost" value="true">
Kostenlose Kontoführung
</option>
<option id="incentive" name="incentive" value="true">
Mit Startguthaben
</option>
</select>
<div class="product-item" data-incentive="false" data-partnercard="false" data-atm_euro_fee="false" data-atm_international_fee="false" data- incoming_pm_min="true" data-product_cost="true">
N26
</div>
<div class="product-item " data-incentive="false" data-partnercard="true" data-atm_euro_fee="true" data-atm_international_fee="true" data- incoming_pm_min="false" data-product_cost="true">
ComDirect
</div>
<div class="product-item" data-incentive="false" data-partnercard="true" data-atm_euro_fee="true" data-atm_international_fee="true" data- incoming_pm_min="false" data-product_cost="true">
DKB
</div>
<div class="product-item" data-incentive="true" data-partnercard="true" data-atm_euro_fee="true" data-atm_international_fee="false" data-incoming_pm_min="false" data-product_cost="true">
Revolut
</div>
</div>
</body>
</html>
我似乎找不到filtering_vergleiche()
函数中的错误,因为我是jQuery的新手。
2条答案
按热度按时间2mbi3lxu1#
问题出在你的选择器上。
.change()
处理程序应该在'jQuery("#filter_checkboxes")上。获取选项值的循环应使用
jQuery("#filter_checkboxes option:selected")
。您需要
.filter_hidden
的CSS来隐藏元素。krugob8w2#
我想我明白你的意思了。我修复了很多语法问题A-把HTML放在HTML验证器中就可以看到了。
这里我添加了几个选项,以便在选择时更加直观(我将其更改为
multiple
,以便您可以选择多个选项)我使用颜色和数据属性来显示所选择的内容。