【问题标题】:Jquery filtering through a multiple range of numbersJquery通过多个数字范围过滤
【发布时间】:2011-10-21 03:42:17
【问题描述】:

认为我被卡住了...我正在尝试获取项目列表并根据对象的属性创建过滤器。我将其简化为一个更简单的带有成本和年份的书籍示例。我目前在页面上有一个书籍列表和过滤器(复选框),可以选择仅显示一定成本和/或年份的书籍。这是我到目前为止的代码:

<div id="filters">
<h1>FILTERS</h1>
<div class="filter filter_cost">
    <input class="target" type="checkbox" min="0" max="9" />Under $10.00<br/>
    <input class="target" type="checkbox" min="10" max="19" />$10-$19<br/>
    <input class="target" type="checkbox" min="20" max="29" />$20-$29<br/>
    <input class="target" type="checkbox" min="30" max="39" />$30-$39<br/>
    <input class="target" type="checkbox" min="40" max="1000" />$40 and Over<br/>
</div>
<div class="filter filter_year">
    <input class="target" type="checkbox" min="1700" max="1799" />18th Century<br/>
    <input class="target" type="checkbox" min="1800" max="1899" />19th Century<br/>
    <input class="target" type="checkbox" min="1900" max="1999" />20th Century<br/>
    <input class="target" type="checkbox" min="2000" max="2999" />21st Centruy<br/>
</div>
</div>
<div id="books">
<h1>BOOKS</h1>
<div class="book">
    <h1>Book 1</h1>
    <input type="hidden" name="cost" value="13" />
    <input type="hidden" name="year" value="1997" />
</div>
<div class="book">
    <h1>Book 2</h1>
    <input type="hidden" name="cost" value="22" />
     <input type="hidden" name="year" value="1872" />
</div>
</div>

还有我的 jQuery(使用 1.6.2):

$(document).ready(function () {
$("input.target").change(function () {
    filterResults();
});
});

function filterResults(){
$(".book").each(function () {
    var cost = $(this).find("input[name='cost']").val();
    var year = $(this).find("input[name='year']").val();
    var cover = $(this).find("input[name='cover']").val();
    var isHidden = false;
    //console.log("Cost in Range: "+filterRange(cost, ".filter_cost"));
    //console.log("Year in Range: "+filterRange(year, ".filter_year"));

    var filterCost = filterRange(cost, ".filter_cost")?showBook($(this)):hideBook($(this));
    var filterYear = filterRange(year, ".filter_year")?showBook($(this)):hideBook($(this));
    isHidden?"":filterCost;
    isHidden?"":filterYear;

    function showBook(obj) {
        obj.show();
    }

    function hideBook(obj) {
        isHidden = true;
        obj.hide();
    }

})
}

function filterRange(amount, elem) {
var checkedInputs = $(elem).find("input:checked").length;
var totalInputs = $(elem).find("input").length;
var inRange = function(){
    $(elem).find("input:checked").each(function () {
        var min = $(this).attr('min');
        var max = $(this).attr('max');
        if(amount >= min && amount <= max){
            return true;
        } else {
            return false;
        }
    });
};
if(checkedInputs == 0 || totalInputs == checkedInputs ){
    return true;
} 
if(inRange()){
    return true;
} else {
    return false;
}
}

我的问题是,在filterRange 函数中,我不确定如何根据检查的每个输入创建一系列条件。因此价格范围可能是 10-19 和 30-39。我的尝试 (var inRange) 是检查每个检查的输入,检查成本是否在范围内,然后返回 true,否则返回 false。我想我只是从根本上偏离了轨道,不确定这种方法是否可行。任何意见将不胜感激。

【问题讨论】:

    标签: javascript jquery filter filtering range


    【解决方案1】:

    在 jquery 中,每个关于 dom 元素返回语句的循环都会跳出循环。所以你的实现是错误的。试试这个。

    function filterRange(amount, elem) {
        var checkedInputs = $(elem).find("input:checked").length;
        var totalInputs = $(elem).find("input").length;
        var returnValue = false;
    
        $(elem).find("input:checked").each(function () {
            var min = $(this).attr('min');
            var max = $(this).attr('max');
            if(amount >= min && amount <= max){
                returnValue = true;
                return true;
            } 
         });
    
       return (checkedInputs == 0 || totalInputs == checkedInputs || returnValue );
    }
    

    【讨论】:

    • 是的,谢谢... 效果很好。觉得我脑子进水了。
    【解决方案2】:

    试试:

    function filterRange(amount, elem) {
        var checkedInputs = $(elem).find("input:checked").length;
        var totalInputs = $(elem).find("input").length;
        var inRange = false;
        $(elem).find("input:checked").each(function () {
            var min = $(this).attr('min');
            var max = $(this).attr('max');
            if (amount >= min && amount <= max) {
                inRange = true;
                return false;
            }
        });
    
        if (checkedInputs == 0 || totalInputs == checkedInputs) {
            return true;
        }
        if (inRange) {
            return true;
        } else {
            return false;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2015-09-13
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多