Jquery过滤多个数字范围

时间:2011-08-05 19:25:38

标签: 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。我想我只是从根本上偏离轨道并且不确定这种方法是否会起作用。任何意见都会非常感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

尝试:

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