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

wkftcu5l  于 2023-10-17  发布在  jQuery
关注(0)|答案(1)|浏览(120)

我在一个页面上有多个div,每个div都有以下数据属性:数据一,数据二,数据三,数据四和数据五。下面的代码创建一个filterList数组如下:['one-value', 'two-value', 'three-value', 'four-value', 'five-value']取决于在五个下拉列表中选择的值。filterList阵列的构建正在工作。
然而,有些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();
    }

  });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div> Now if we just had some HTML here...</div>
3yhwsihp

3yhwsihp1#

由于您的数据属性值包含字符串值,这些值表示由逗号分隔的产品列表,因此您需要将这些值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.every(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>

相关问题