javascript - Jquery过滤多个数字范围

标签 javascript jquery filter filtering range

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

<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。我想我只是从根本上偏离了轨道,不确定这种方法是否有效。任何输入将不胜感激。

最佳答案

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

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 );
}

关于javascript - Jquery过滤多个数字范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6961594/

相关文章:

javascript - 我可以向 $(this) 添加一个变量吗?

sql-server - 用于 sql 更新的 openxml where 子句

jsf - 如何在数据表过滤器中显示水印?

javascript - 数组在随机化时添加维度

javascript - React,未生成Webpack : bundle. js

javascript - append 和appendChild 是否被覆盖?

javascript - 替换fabricjs Canvas 上的函数(文本)?

javascript - 单击标签时如何删除事件类?

JavaScript:动态创建的类似 html 的字符串不会转换为 html

php - 基于逻辑表达式在 PHP 中过滤数组