如何使我的复选框过滤器工作

How to make my checkbox filter work?

本文关键字:过滤器 工作 复选框 我的 何使      更新时间:2023-09-26

我有一个由jquery生成的功能正常的产品列表。现在我需要通过数组属性:颜色、大小和价格来过滤它。我从一个问题中复制了一个代码,该代码按其类过滤列表项,并且它工作得很好,但对我来说,我就是不知道如何将其更改为按属性过滤。我认为需要修改的是最后一个函数re.test($this.attr("class"))

<!--HTML-->
<!DOCTYPE HTML>
 <html lang="pt-br">
<head>
    <meta charset="utf-8"/>
    <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
    <title>Teste Vaga Front End</title>
    <link href="css/style.css" rel="stylesheet"/>
    <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
    <script src="js/js.js"></script>
</head>
<body onLoad="loadList()">
     <header class="menu">
        <div class="container">
            <nav>
                <ul class="menu-lt">
                    <li class="menu-it"><a class="menu-lk logo" href="#">Profite</a></li>
                    <li class="menu-it lst"><a class="menu-lk cart" href="#">Carrinho</a></li>
                </ul>
            </nav>
        </div>
    </header>

    <h2 class="page-title container">Vestidos</h2>
    <div class="content container">
        <aside class="sidebar">
            <h3 class="mobile-btn filter">Filtrar</h3>
            <div id="filters" class="filters-wrapper">
                <div class="fltrs-wppr">
                <section id="colors">
                    <h4>Cores</h4>
                    <ul>
                        <li><input type="checkbox" name="colors" value="Amarelo"> Amarelo</li>
                        <li><input type="checkbox" name="colors" value="Azul"> Azul</li>
                        <li><input type="checkbox" name="colors" value="Branco"> Branco</li>
                        <li><input type="checkbox" name="colors" value="Cinza"> Cinza</li>
                        <li><input type="checkbox" name="colors" value="Laranja"> Laranja</li>
                    </ul>
                </section>
                <section id="sizes">
                    <h4>Tamanhos</h4>
                    <ul class="fltr-szs-lt">
                        <li class="fltr-szs-it"><span class="fltr-szs">P</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">M</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">G</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">GG</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">U</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">36</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">38</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">40</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">42</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">44</span></li>
                        <li class="fltr-szs-it"><span class="fltr-szs">46</span></li>
                    </ul>
                </section>
                <section id="prices">
                    <h4>Faixa de Preço</h4>
                    <ul>
                        <li><input type="checkbox" name="prices" value="prc0-50"> de R$0 até R$50</li>
                        <li><input type="checkbox" name="prices" value="prc-51-150"> de R$51 até R$150</li>
                        <li><input type="checkbox" name="prices" value="prc-151-300"> de R$151 até R$300</li>
                        <li><input type="checkbox" name="prices" value="prc301-500"> de R$301 até R$500</li>
                        <li><input type="checkbox" name="prices" value="prc-501-fim"> a partir de R$501</li>
                    </ul>
                </section>
                </div>
            </div>
        </aside>
        <section id="products" class="products">
            <header class="products-hdr">
                <h3 class="mobile-btn order">Ordenar</h3>
                <select class="prd-order">
                  <option value="MaisRecentes">Mais Recentes</option>
                  <option value="MaiorPreco">Maior Preço</option>
                  <option value="MenorPreco">Menor Preço</option>
                </select>
            </header>
            <ul id="ProductList" class="product-lt">
            </ul>
        </section>
    </div>
</body>
</html>
var productList = {"products": [
    {"image": "img/vestido1.jpg", "description": "Bata Bordada", "color": "amarelo", "size":"P", "price": "390.00"},
    {"image": "img/vestido2.jpg", "description": "Chapéu de Praia com Fivela", "color": "cinza", "size":"M", "price": "520.00"},
    {"image": "img/vestido3.jpg", "description": "Vestido Texturizado", "color": "branco", "size":"G", "price": "42.90"},
    {"image": "img/vestido4.jpg", "description": "Bata Bordada", "color": "branco", "size":"GG", "price": "130.00"},
    {"image": "img/vestido5.jpg", "description": "Chapéu de Praia com Fivela", "color": "amarelo", "size":"36", "price": "380.00"},
    {"image": "img/vestido6.jpg", "description": "Vestido Texturizado", "color": "azul", "size":"38", "price": "44.00"},
    {"image": "img/vestido7.jpg", "description": "Bata Bordada", "color": "cinza", "size":"40", "price": "180.90"},
    {"image": "img/vestido8.jpg", "description": "Chapéu de Praia com Fivela", "color": "branco", "size":"42", "price": "560.00"},
    {"image": "img/vestido2.jpg", "description": "Vestido Texturizado", "color": "cinza", "size":"44", "price": "122.90"}
]
};
//carrega lista sem filtros
function loadList() {
    var list = $("#ProductList");
    var _createELement="";
   $(productList.products).each(function(index){
    _createELement+=
        '<li class="product-it"> <article class="product"> <span class="prd-img-wrapper"> <img class="prd-img" src="' + this.image + '"></span> <h2 class="prd-tit">' + this.description + '</h2> <span class="prd-wrap"><span class="prd-price"><span class="prd-prc"> R$' +  this.price + '</span></br> <span class="prd-par">até 5x de R$' +  parseFloat($(this.price).val()) /5.0 + '</span></span><a class="prd-cart" href="#">Adicionar ao carrinho.</a></span></article></li>'
   });
   $(list).append(_createELement);
}
//filtro
$("#filters :checkbox").click(function() {
   var re = new RegExp($("#filters :checkbox:checked").map(function() {
                          return this.value;
                       }).get().join("|") );
   $("li").each(function() {
      var $this = $(this);
      $this[re.source!="" && re.test($this.attr("class")) ? "show" : "hide"]();
   });
});

这对我来说很有效。这里很少有值被改变,比如-prc0-50 => prc-0-50。这些值正在被JS中的priceRange对象使用

    <h4>Faixa de Preço</h4>
    <ul>
        <li><input type="checkbox" name="prices" value="prc-0-50"> de R$0 até R$50</li>
        <li><input type="checkbox" name="prices" value="prc-51-150"> de R$51 até R$150</li>
        <li><input type="checkbox" name="prices" value="prc-151-300"> de R$151 até R$300</li>
        <li><input type="checkbox" name="prices" value="prc-301-500"> de R$301 até R$500</li>
        <li><input type="checkbox" name="prices" value="prc-501-fim"> a partir de R$501</li>
    </ul>

Please try this JS

var productList = {"products": [
{"image": "img/vestido1.jpg", "description": "Bata Bordada", "color": "amarelo", "size":"P", "price": "390.00"},
{"image": "img/vestido2.jpg", "description": "Chapéu de Praia com Fivela", "color": "cinza", "size":"M", "price": "520.00"},
{"image": "img/vestido3.jpg", "description": "Vestido Texturizado", "color": "branco", "size":"G", "price": "42.90"},
{"image": "img/vestido4.jpg", "description": "Bata Bordada", "color": "branco", "size":"GG", "price": "130.00"},
{"image": "img/vestido5.jpg", "description": "Chapéu de Praia com Fivela", "color": "amarelo", "size":"36", "price": "380.00"},
{"image": "img/vestido6.jpg", "description": "Vestido Texturizado", "color": "azul", "size":"38", "price": "44.00"},
{"image": "img/vestido7.jpg", "description": "Bata Bordada", "color": "cinza", "size":"40", "price": "180.90"},
{"image": "img/vestido8.jpg", "description": "Chapéu de Praia com Fivela", "color": "branco", "size":"42", "price": "560.00"},
{"image": "img/vestido2.jpg", "description": "Vestido Texturizado", "color": "cinza", "size":"44", "price": "122.90"}
]
};
var priceRange = {
50: 'prc-0-50',
150: 'prc-51-150',
300: 'prc-151-300',
500: 'prc-301-500',
10000000000: 'prc-501-fim'
}
//carrega lista sem filtros
function loadList() {
var list = $("#ProductList");
var _createELement = "";
$(productList.products).each(function(index) {
    var $this = this;
    var priceRangeClass = '';
    var productColor = (this.color).toLowerCase();
    for (index in priceRange) {
        if (parseFloat($this.price) <= parseFloat(index)) {
            priceRangeClass = priceRange[index];
            break;
        }
    }
    _createELement +=
        '<li class="product-it ' + priceRangeClass + ' ' + productColor + '"> <article class="product"> <span class="prd-img-wrapper"> <img class="prd-img" src="' + this.image + '"></span> <h2 class="prd-tit">' + this.description + '</h2> <span class="prd-wrap"><span class="prd-price"><span class="prd-prc"> R$' + this.price + '</span></br> <span class="prd-par">até 5x de R$' + parseFloat(this.price) / 5.0 + '</span></span><a class="prd-cart" href="#">Adicionar ao carrinho.</a></span></article></li>'
});
$(list).append(_createELement);
//filtro
$("#filters :checkbox").click(function() {
    var list = $("#ProductList");
    var re = new RegExp($("#filters :checkbox:checked").map(function() {
        return (this.value).toLowerCase();
    }).get().join("|"));
    list.children("li").show();
    list.children("li").each(function() {
        var $this = $(this);
        $this[re.source != "" && re.test($this.attr("class")) ? "show" : "hide"]();
    });
});
}

我相信你可以实现基于大小的过滤

首先,你必须修改你的渲染函数,添加颜色attr:

$(productList.products).each(function(index){
    _createELement+=
        '<li class="product-it" color="'+ this.color +'"> <article class="product"> <span class="prd-img-wrapper"> <img class="prd-img" src="' + this.image + '"></span> <h2 class="prd-tit">' + this.description + '</h2> <span class="prd-wrap"><span class="prd-price"><span class="prd-prc"> R$' +  this.price + '</span></br> <span class="prd-par">até 5x de R$' +  parseFloat($(this.price).val()) /5.0 + '</span></span><a class="prd-cart" href="#">Adicionar ao carrinho.</a></span></article></li>'
   });

然后你可以过滤你的列表:

function filterBYColor(color) {
  $('.product-it').each(function(){
     var $this = $(this); //your li
     if ($(this).attr('color') == color) {
        $this.show(); //show it if it has the right color
     } else {
        $this.hide(); //hid id it's not
     }
  })
};

试一试:

filterByColor('azul');

编辑另一个按多种颜色进行筛选的函数:

filterByColors(colors) {
    $('.product-it').each(function(){
         var $this = $(this); //your li
         var color = $this.attr('color'); //it's color
         if (color && colors.indexOf(color) != -1) {
            $this.show(); //show it if it has the right color
         } else {
            $this.hide(); //hid id it's not
         }
      })
}

$(document).on('change', '[name="prices"]', function(){
    var $this = $(this);
    var color = $this.val();
    var colors = [];
    $('[name="prices"]').each(function(){
       if ($(this).prop('checked')) {
           colors.push($(this).attr('color'));
       }
    })
    filterByColors(colors);
})

只需将此代码添加到页面,它将工作。