【问题标题】:Hide and show product list on basis of multiple categories in javascript在javascript中基于多个类别隐藏和显示产品列表
【发布时间】:2014-05-08 07:22:36
【问题描述】:
<div class="content" data-category="shoes" data-price="1000" data-brand="Andrew">shoe1</div><br />
<div class="content" data-category="shirts" data-price="1200" data-brand="Sunbaby">shirt1</div><br />

<div class="content" data-category="shoes" data-price="2000" data-brand="Andrew">shoe2</div><br />
<div class="content" data-category="shoes" data-price="800" data-brand="Andrew">shoe3</div><br />
<div class="content" data-category="shirts" data-price="1300" data-brand="Sunbaby">shirt2</div><br />
<div class="content" data-category="shirts" data-price="800" data-brand="Sunbaby">shirt3</div><br />

<input type="checkbox" class="category" category="shoes" id="shoes">shoes
<input type="checkbox" class="category" category="shirts" id="shirts">shirts
<input type="radio" name="range" value="0-9000" checked>All
<input type="radio" name="range" value="0-999">0-1000
<input type="radio" name="range" value="1000-2000">1000-2000

基本上,如果您从复选框中选择一个类别,比如说鞋子,那么应该只显示带有鞋子的 div。然后,如果您使用价格、一些开始和结束限制过滤结果,它应该显示鞋子类别 div 落在该特定范围内,而不是超出该范围。 在这两者之间,如果您还选择品牌复选框。那么它应该匹配来自类别、品牌和价格范围的所有三个复选框

例如:- 我们选择了鞋子复选框,它应该显示鞋子 div;那么如果我们选择范围为 1000-2000,那么它应该显示 shoe1 和 shoe2 而不是 shoe3。

如果你选择了鞋子类别,然后如果你也选择了品牌复选框。它应该在两个复选框的基础上过滤掉,然后它应该寻找价格范围并匹配结果,过滤div。

请帮忙。

<script type="text/javascript">
$("input.category").prop("checked", true).change(function (e) {
    $("input[name=range]:checked").trigger("change");
});
$("input.brand").prop("checked", true).change(function (e1) {
    $("input[name=range]:checked").trigger("change");
});

$("input[name=range]").change(function (e) {
    var toggle = this.checked;
    var range = this.value.split('-');
    var rangeFrom = parseInt(range[0]);
    var rangeTo = parseInt(range[1]);
    $(".content[data-price]").each(function(){
        var $this = $(this);
        var categoryActive = $("#" + $this.data("category")).prop("checked");
        var brandActive = $("#" + $this.data("brand")).prop("checked");
        var price = parseFloat($this.data('price'));
        $this.toggle(price >= rangeFrom && price <= rangeTo && categoryActive);
      $this.toggle(price >= rangeFrom && price <= rangeTo && $("#" + $this.data("brand")).prop("checked"));
    });
});

</script>

我在一个好友的帮助下尝试了这个脚本。 感谢和谷歌,如果你能在这方面提供帮助

【问题讨论】:

  • 那么,您尝试过什么?据我所知,SO 不是人们按需为您编码的地方。基本上,您想要的是某种在线购物网站的整个排序逻辑。google.com 可能会帮助您入门。
  • 请看一下脚本,请帮忙
  • 这是一种非常脆弱的方法,不应该在客户端 JavaScript 中实现。
  • 我也写了javascript代码。请更正我的代码....
  • @Two-Bit Alchemist 在实现这个服务器端是完全错误的。这可以完美地在客户端完成,并且有几个库可以做到这一点。

标签: javascript jquery html checkbox


【解决方案1】:

Solution

HTML
<form id="filter">
  <div>
    <input type="checkbox" 
           name="brand" 
           value="Andrew" 
           checked>Andrew
    </input>
    <input type="checkbox" 
           name="brand" 
           value="Sunbaby" 
           checked>Sunbaby
    </input>
    <input type="checkbox" 
           name="brand" 
           value="Nike" 
           checked>Nike
    </input>
  </div>
  <div>
    <input type="checkbox" 
           name="category" 
           value="shoes" 
           checked>Shoes
    </input>
    <input type="checkbox" 
           name="category" 
           value="shirts" 
           checked>
      Shirts
    </input>
  </div>
  <div>
    <input type="radio" 
           name="price" 
           value="0-9000"         
           checked>All
    </input>
    <input type="radio" 
           name="price" 
           value="0-999">0-1000
    </input>
    <input type="radio" 
           name="price" 
           value="1000-2000">1000-2000
    </input>
  <div> 
</form>
CSS
.hidden {display: none;}
JS/JQUERY
var filterContentForm = function(content, form){  
  var filter = function() {  
    var checkBoxGroups = {},
        radioGroups = {};
    var addRadioGroup = function(name){
      radioGroups[name] = {      
        el: $('input[name='+name+']:checked')
      };
      var n = radioGroups[name];
      n.el
      .each(function(){
        n.range = $(this).val().split('-');
        n.from = Number(n.range[0]);
        n.to = Number(n.range[1]);      
      });
    };      
    $('#filter input[type=radio]')
    .each(function(){
      addRadioGroup($(this).attr('name'));
    });      
    var addCheckBoxGroup = function(name){
      checkBoxGroups[name] = {
        el: $('input[name='+name+']:checked'),      
        ch: []
      };
      var n = checkBoxGroups[name];
      n.el.each(function(){
        n.ch.push($(this).val());
      });
    };
    $('#filter input[type=checkbox]')
    .each(function(){
      addCheckBoxGroup($(this).attr('name'));
    });
    var contents = $(content), all = 0;
    contents.removeClass('hidden')
    .each(function(){
      var $this = $(this),
          price = $this.data('price');
      for(var c in radioGroups){ 
        var n = radioGroups[c],
            d = Number($this.data(c));
        if(d < n.from || d > n.to){
          $this.addClass('hidden');
          all++;
          return;
        }
      }    
      var show = 0, i;
      for(var c in checkBoxGroups){   
        var n = checkBoxGroups[c], 
            d = $this.data(c);      
        for(i = 0; i < n.ch.length; i++){        
          if(d === n.ch[i]) {
            show++; break;
          }
        } 
      }
      var l = Object.keys(checkBoxGroups).length;
      if(show < l) {
        $this.addClass('hidden');
        all++;
      }
    });
    if(all > contents.length - 1) 
      contents.removeClass('hidden');
  };
  $(form+' input').change(filter);
  filter();
};
filterContentForm('.content', '#filter'); 

【讨论】:

  • @rafaelcastrocouto-对不起,但我看不到它的工作,我们需要过滤三个数据属性,即品牌、类别和价格,但我只能看到类别和价格,而不是品牌。可以你请更新,谢谢....
  • 做到了!如果您需要更多复选框或收音机,只需添加具有适当功能的 addCheckBoxGroupaddRadioGroup
  • addCheckBoxGroupaddRadioGroup 不再需要...只需在表单中添加复选框或无线电输入元素,它们就会像魔术一样工作!
  • @rafaelcastrocouto-谢谢伙计,它工作得很好。我尝试在开始时保持所有复选框未选中,但无法使其与未选中的框一起使用,如果您一个接一个地选中一个复选框。就像最初它显示所有未选中的复选框一样。然后我们检查了andre,它显示了andrew的结果。然后我们检查了sunbaby,我们应该得到andrew和sunbaby等的结果..请指导先生..
  • 如果所有复选框都未选中,则不会显示任何内容...这真的是您想要的吗?无论如何......我更新了,所以它甚至可以这样工作!
【解决方案2】:

你可以这样做:

$("#shoes").click(function (e) {
 $('.content[data-category=shoes]').toggle();
});

【讨论】:

  • 不,这不会解决我的目的,因为我正在寻找三个组合过滤器,而不是一个 @user3473274。谢谢
  • 你很懒!你只想要完整的代码。学习编码或聘请真正的开发人员!
  • 谢谢@user3473274,你需要编码能力,你告诉我几年前实现的东西。所以甚至不要试图给别人建议,因为你的建议像你的编码一样无用.....跨度>
猜你喜欢
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
相关资源
最近更新 更多