0

我有一个我想要一个过滤器的列表,我的复选框工作如这个问题所示。

在我的页面上,页面顶部的选项卡已经在工作,如下面的代码和this fiddle所示。

但是它们彼此冲突,因此当前如果您在单击 col 1 的复选框时单击 xtr1,它将删除所有 col 1 并显示所有 xtr1。例如,我希望它显示所有勾选了 col 1 的 xtra1。我尝试通过添加变量 addchosen 来解决这个问题,如下所示,但无法使其正常工作,如何才能最好地实现这一点?

<div id="nav">
    <a rel="all"  id="all">All</a>
    <a rel="xtr1" id="xtr1">xtr1</a>
    <a rel="xtr2" id="xtr2">xtr2</a>
    <a rel="xtr3" id="xtr3">xtr3</a>
</div>

<form id="refine-cat">
    <span><input type="checkbox" value="1" name="filtercol">cat 1</span>
    <span><input type="checkbox" value="2" name="filtercol">cat 2</span>
    <span><input type="checkbox" value="3" name="filtercol">cat 3</span>
</form>
<form id="refine-col">
    <span><input type="checkbox" value="1" name="filtercat">col 1</span>
    <span><input type="checkbox" value="2" name="filtercat">col 2</span>
    <span><input type="checkbox" value="3" name="filtercat">col 3</span>
    <span><input type="checkbox" value="4" name="filtercat">col 4</span>
</form>
<ul>
    <li class="xtr3 all item cat-3 col-1">col 1 - cat 3 - xtra 3</li>
    <li class="xtr1 all item cat-3 col-1">col 1 - cat 3 - xtra 1</li>
    <li class="xtr1 all item cat-3 col-1">col 1 - cat 3 - xtra 1</li>
</ul>

(列表中有更多项目)

JS

var chosen = "";

jQuery("#nav a").on("click", function (event) {

    jQuery("#nav a").removeClass("current");
    jQuery(this).addClass("current");

    chosen = jQuery(this).attr("rel");

    jQuery(".item").not("." + chosen).hide();
    jQuery("." + chosen).show();

});


var $items = jQuery('.item');
var $cats = jQuery('#refine-cat input[type=checkbox]');
var $cols = jQuery('#refine-col input[type=checkbox]');

$cols.add($cats).on('change', function (e) {
    var cats = $cats.filter(':checked').map(function(){
        return 'cat-' + (this.value || '')
    }).get();
    var cols = $cols.filter(':checked').map(function(){
        return 'col-' + (this.value || '')
    }).get();

    if(cats.length || cols.length){
        var $fitems = $items;
        var addchosen = "";
        if (chosen) {
            addchosen =', .' + chosen;
        }        
        if(cats.length){
            $fitems = $fitems.filter('.' + cats.join(', .') + addchosen );
        }
        if(cols.length){
            $fitems = $fitems.filter('.' + cols.join(', .'));
        }

        $fitems.show();
        $items.not($fitems).hide();
    } else {
        $items.show();
    }
});
4

2 回答 2

1

我可能不会把它弄得这么复杂。这是一种方法。

jQuery("#nav a").on("click", function (event) {
    jQuery("#nav a").removeClass("current");
    jQuery(this).addClass("current").attr("rel");
    if(this.id == 'all') $cats.add($cols).prop('checked', false);
    updateResult();
});


var $items = jQuery('.item');
var $cats = jQuery('#refine-cat input[type=checkbox]');
var $cols = jQuery('#refine-col input[type=checkbox]');

$cols.add($cats).on('change', function () {
   //Do something....
    updateResult();

});

function updateResult() {

    $('ul > li').hide();

    var consArray = [];
    consArray = consArray.concat($('#nav > a.current').map(function () {
        return this.rel;
    }).get());

    consArray = consArray.concat($cats.filter(':checked').map(function () {
        return 'cat-' + this.value;
    }).get());

    consArray = consArray.concat($cols.filter(':checked').map(function () {
        return 'col-' + this.value;
    }).get());

    if(consArray.length)
        $('.' + consArray.join('.')).show();
 }

小提琴

和一个更简单的版本:

function updateResult() {
    $('ul > li').hide();
    var consArray =  $('#nav > a.current').add(
                              $cats.filter(':checked')).add(
                              $cols.filter(':checked'))
        .map(function(){
              if(this.nodeName === 'A') return this.rel;
              return this.name.replace(/filter/,'') + '-' + this.value;

           }).get();

    if(consArray.length)
        $('.' + consArray.join('.')).show();
}

小提琴

于 2013-09-13T01:59:40.527 回答
1

我已经稍微修改了你的代码。有一种更简洁的方法,但我不想改变你的思路。

所以,我创建了一个名为的函数refine(),基本上隔离了你的这部分代码,并添加了一个过滤器来选择:

if(cats.length){
    $fitems = $fitems.filter('.' + cats.join(', .') + addchosen );
}
if(cols.length){
    $fitems = $fitems.filter('.' + cols.join(', .'));
}

所以这个函数会在nav点击和cols/cats改变时被调用,像这样:

var cats=[], cols=[], $fitems;
var $items = jQuery('.item');
var chosen = "";

function refine() {
    $items.show();
    $fitems = $items;

    if(chosen.length && chosen != 'all') {
        $fitems = $items.filter('.' + chosen);
    }
    if(cats.length){
        $fitems = $fitems.filter('.' + cats.join(', .'));
    }
    if(cols.length){
        $fitems = $fitems.filter('.' + cols.join(', .'));
    }

    $fitems.show();
    $items.not($fitems).hide();
}

jQuery("#nav a").on("click", function (event) {

    jQuery("#nav a").removeClass("current");
    jQuery(this).addClass("current");

    chosen = jQuery(this).attr("rel");

    refine();
});

var $cats = jQuery('#refine-cat input[type=checkbox]');
var $cols = jQuery('#refine-col input[type=checkbox]');

$cols.add($cats).on('change', function (e) {
    cats = $cats.filter(':checked').map(function(){
        return 'cat-' + (this.value || '')
    }).get();
    cols = $cols.filter(':checked').map(function(){
        return 'col-' + (this.value || '')
    }).get();

    refine();
});

这是你的小提琴

于 2013-09-13T02:33:50.047 回答