优化 jQuery 选择器

Refining jQuery selector

我正在构建一个简单的产品过滤器,并将规格分为不同的类型。

我希望我的逻辑是这样的:

如果 select 有 2 种规格,每一种都来自不同的类型,产品应该与两种 select 离子相匹配。

如果 select 有 3 个规格,2 个来自同一类型,1 个来自另一种类型,则产品应匹配来自单一类型的 selection,以及 [=44= 中的任何一个]离子,其中有 2 个相同类型。

示例:

类型可以是尺码和颜色。

I select "Large" 来自尺寸,"Red" 来自颜色。 显示的产品为大号和红色。

I select "Large" 来自尺寸,"Red" 和 "Blue" 来自颜色。 显示的产品为大号和(红色或蓝色)。

我用我现有的函数创建了一个片段:

jQuery('.Spec').click(function () {

jQuery('.Product').fadeOut(200);

sClasses = '';
jQuery('.Spec:checked').each(function () {
    sClasses += '.SP_' + jQuery(this).attr('TypeID') + '_' + jQuery(this).attr('ValueID');
});

if (sClasses === '') {
    sClasses = '.Product'
}

console.log(sClasses)

jQuery(sClasses).fadeIn(200);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="checkbox" id="SP_1" class="Spec" TypeID="1" ValueID="1" /> <label for="SP_42">Large</label>
<input type="checkbox" id="SP_2" class="Spec" TypeID="1" ValueID="2" /> <label for="SP_2">Small</label>

<input type="checkbox" id="SP_3" class="Spec" TypeID="2" ValueID="3" /> <label for="SP_3">Red</label>
<input type="checkbox" id="SP_4" class="Spec" TypeID="2" ValueID="4" /> <label for="SP_4">Blue</label>

<table>
<tr class="Product SP_1_1 SP_2_3"><td>Large red product</td></tr>
<tr class="Product SP_1_1 SP_2_4"><td>Large blue product</td></tr>
<tr class="Product SP_1_2 SP_2_3"><td>Small red product</td></tr>
<tr class="Product SP_1_2 SP_2_4"><td>Small blue product</td></tr>
</table>

目前您会看到,如果您 select 红色和蓝色,则没有匹配的记录,因为它会尝试查找具有这两个 类 的产品。

您需要添加一个,

jQuery('.Spec').click(function () {

jQuery('.Product').fadeOut(200);

sClasses = '';
jQuery('.Spec:checked').each(function (i) {
    sClasses += '.SP_' + jQuery(this).attr('TypeID') + '_' + jQuery(this).attr('ValueID');
    sClasses += jQuery('.Spec:checked').length-1 === i ? "":", "; // you need to add this line
});

if (sClasses === '') {
    sClasses = '.Product'
}

console.log(sClasses)

jQuery(sClasses).fadeIn(200);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="checkbox" id="SP_1" class="Spec" TypeID="1" ValueID="1" /> <label for="SP_42">Large</label>
<input type="checkbox" id="SP_2" class="Spec" TypeID="1" ValueID="2" /> <label for="SP_2">Small</label>

<input type="checkbox" id="SP_3" class="Spec" TypeID="2" ValueID="3" /> <label for="SP_3">Red</label>
<input type="checkbox" id="SP_4" class="Spec" TypeID="2" ValueID="4" /> <label for="SP_4">Blue</label>

<table>
<tr class="Product SP_1_1 SP_2_3"><td>Large red product</td></tr>
<tr class="Product SP_1_1 SP_2_4"><td>Large blue product</td></tr>
<tr class="Product SP_1_2 SP_2_3"><td>Small red product</td></tr>
<tr class="Product SP_1_2 SP_2_4"><td>Small blue product</td></tr>
</table>

您可以像这样创建一个选择器

jQuery(function($) {
  var $specs = $('.Spec');

  var types = [];
  $specs.each(function() {
    var type = $(this).attr('TypeID');
    if ($.inArray(type, types) == -1) {
      types.push(type);
    }
  });
  var $products = $('.Product');

  $specs.click(function() {

    var $selected = $products;
    $.each(types, function(i, type) {
      var $checked = $specs.filter('[TypeID="' + type + '"]:checked');
      if ($checked.length) {
        var selector = $checked.map(function(el) {
          return '.SP_' + type + '_' + $(this).attr('ValueID');
        }).get();
        $selected = $selected.filter(selector.join());
      }
    });

    $selected.show();
    $products.not($selected).hide();
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input type="checkbox" id="SP_1" class="Spec" TypeID="1" ValueID="1" />
<label for="SP_42">Large</label>
<input type="checkbox" id="SP_2" class="Spec" TypeID="1" ValueID="2" />
<label for="SP_2">Small</label>

<input type="checkbox" id="SP_3" class="Spec" TypeID="2" ValueID="3" />
<label for="SP_3">Red</label>
<input type="checkbox" id="SP_4" class="Spec" TypeID="2" ValueID="4" />
<label for="SP_4">Blue</label>

<table>
  <tr class="Product SP_1_1 SP_2_3">
    <td>Large red product</td>
  </tr>
  <tr class="Product SP_1_1 SP_2_4">
    <td>Large blue product</td>
  </tr>
  <tr class="Product SP_1_2 SP_2_3">
    <td>Small red product</td>
  </tr>
  <tr class="Product SP_1_2 SP_2_4">
    <td>Small blue product</td>
  </tr>
</table>