【问题标题】:Hide and show divs on basis of price and category checkboxes in javascript根据javascript中的价格和类别复选框隐藏和显示div
【发布时间】:2014-03-27 08:13:00
【问题描述】:

我有一个div 安排,我在其中定义数据属性。就像我在带有数据属性的div 中显示产品列表一样,即data-categorydata-price。我想根据类别和价格复选框的选择隐藏和显示divs。 html结构如下:

<div class="content" data-category="shoes" data-price="1000">shoe1</div><br />
<div class="content" data-category="shirts" data-price="1200">shirt1</div><br />

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

<input type="checkbox" class="category" category="shoes" id="shoes">shoes
<input type="checkbox" class="category" category="shirts" id="shirts">shirts

对于类别,我保留了复选框,但对于价格,我猜我需要使用范围 jquery 滑块,但我无法使用该过滤器。基本上,如果您从复选框中选择一个类别,比如说鞋子,那么应该只显示带有鞋子的 divs;然后,如果您使用价格一些开始和结束限制过滤结果,它应该显示鞋子类别divs 落在该特定范围内。没有超出范围。

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

【问题讨论】:

    标签: javascript jquery html css checkbox


    【解决方案1】:

    由于“类别”在 html 中不是有效的属性名称,因此您应该使用其他名称。在这种情况下,直接使用 id 是很自然的,因为这是您无论如何都需要的值:

    <input type="checkbox" class="category" id="shoes">shoes
    <input type="checkbox" class="category" 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
    

    然后在javascript中:

    $("input.category").prop("checked", true).change(function (e) {
        //Trigger change event on active price range item where the filter is applied
        $("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]);
        // If all category checkboxes are off we will ignore category filter
        var allOff = ($("input[type=checkbox]:checked").length === 0);
        $(".content[data-price]").each(function(){
            var $this = $(this);
            // Check if category is active
            var active = allOff || $("#" + $this.data("category")).prop("checked");
            // Get price as number
            var price = parseFloat($this.data('price'));
            // Toggle visibility based on category and price range
            $this.toggle(price >= rangeFrom && price <= rangeTo && active );
        });
    });
    

    【讨论】:

    • 看起来不错,但我会在其中添加 $(".category").prop("checked", true);。因为默认情况下不选中它们看起来很奇怪。
    • ya.thats 完全没问题。一些来自你方@awe 和@Deja Vu 的建议。如果我们有一个新的数据属性,比如 Brand。那么如果我们想过滤掉它。就像你检查类别一样衬衫,然后你也选择一些品牌,然后你选择价格。然后如何进行过滤。其次,代替价格的复选框。如何使用价格范围滑块来做......?谢谢
    • 在单独的函数中移出过滤器代码,然后从所有不同类型的过滤器选择中调用相同的过滤器函数可能是一个想法。这样,您可以确保在所有情况下都应用正确的过滤器。您使用相同的方法过滤其他值。重要的是使用$(".content[data-price]").each 扫描所有项目并读取您需要使用的所有过滤器控件的当前状态。 $this 代表每个循环中的一个内容项。
    • 非常感谢@awe 提供的宝贵信息。您能否给我一个带有价格范围滑块功能的类别复选框示例。只要您有空,否则我会尝试使用这个。跨度>
    • 您可以自己尝试弄清楚。我对滑块控件不熟悉,但方法应该类似。只需将滑块值读入rangeFromrangeTo,然后使用相同的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多