jQuery基于多个数据属性过滤div

问题描述 投票:0回答:1

我在一个页面上有多个具有以下数据属性的 div:数据一、数据二、数据三、数据四和数据五。以下代码创建一个数组,如下所示: ['一值', '二值', '三值', '四值', '五值'] 取决于在五个值中选择哪些值下拉菜单。构建数组已全部排序并正常工作。

但是有些 div 有多个数据属性值,即 data-one="one-value,one-value-2,one-value-3"

如果 div 只包含一个数据属性值 - 似乎工作正常 - 但当存在多个用逗号分隔的值时,它不起作用。

任何帮助将不胜感激!

            var filterList = [];

            jQuery("#jsonFilters ul#one ul li a.active").each(function () {
                var dataOne = jQuery(this).attr("data-one");
                filterList.push(dataType);
            });

            jQuery("#jsonFilters ul#two ul li a.active").each(function () {
                var dataTwo = jQuery(this).attr("data-two");
                filterList.push(dataTwo);
            });

            jQuery("#jsonFilters ul#three ul li a.active").each(function () {
                var dataThree = jQuery(this).attr("data-three");
                filterList.push(dataThree);
            });

            jQuery("#jsonFilters ul#four ul li a.active").each(function () {
                var dataFour = jQuery(this).attr("data-four");
                filterList.push(dataFour);
            });

            jQuery("#jsonFilters ul#five ul li a.active").each(function () {
                var dataFive = jQuery(this).attr("data-five");
                filterList.push(dataFive);
            });

            if (filterList.length == 0) {
                jQuery('.div').removeClass('hidden');
                jQuery('.div').fadeIn();
                console.log('No Filters');
            } else {
                jQuery('.div').each(function () {
                    offeringOne = jQuery(this).attr('data-one');
                    offeringTwo = jQuery(this).attr('data-two');
                    offeringThree = jQuery(this).attr('data-three');
                    offeringFour = jQuery(this).attr('data-four');
                    offeringFive = jQuery(this).attr('data-five');

                    if (jQuery.inArray(offeringOne, filterList) != -1 && jQuery.inArray(offeringTwo, filterList) != -1 && jQuery.inArray(offeringThree, filterList) != -1 && jQuery.inArray(offeringFour, filterList) != -1 && jQuery.inArray(offeringFive, filterList) != -1) {
                        jQuery(this).fadeIn('slow');
                    } else {
                        jQuery(this).hide();
                    }

                });
            }
jquery filter custom-data-attribute
1个回答
0
投票

由于您的数据属性值包含表示以逗号分隔的产品列表的字符串值,因此您需要

split
将这些值放入数组中,以便可以将 each 产品值与
filterList
进行比较。

您可以将您的

jQuery('.div').each
处理程序重写为如下所示:

var filterList = [
  'one-value',
  // 'one-value-2'
];

if (filterList.length == 0) {
  jQuery('.div').removeClass('hidden');
  jQuery('.div').fadeIn();
  console.log('No Filters');
} else {
  jQuery('.div').each(function() {
    const isVisible = ['data-one', 'data-two', 'data-three', 'data-four', 'data-five'].some(attr => {
      const attrValue = jQuery(this).attr(attr);
      if (!attrValue) { return; }

      const offerings = attrValue.split(',');
      
      return filterList.some(offering => offerings.indexOf(offering) > -1);
    });
    
    if (isVisible) {
      jQuery(this).fadeIn('slow');
    } else {
      jQuery(this).hide();
    }
  });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="div" data-one="one-value,one-value-2,one-value-3">
  Div One
</div>
<div class="div">
  Div Two
</div>
<div class="div" data-one="one-value">
  Div Three
</div>
<div class="div">
  Div Four
</div>
<div class="div" data-one="one-value-2">
  Div Five
</div>

© www.soinside.com 2019 - 2024. All rights reserved.