使用jquery添加多个过滤器

时间:2015-08-13 22:41:00

标签: javascript jquery html css3 filter

我有一个使用过滤器的html工作表,但我仍有问题:

  1. 我正在尝试让多个过滤器同时工作,我试图让它显示任务类型以及是否已经完成

  2. 我无法让已完成的任务过滤器正常工作我已经添加了一个复选框过滤器,可以根据已选中的框添加一个类,或者不添加类:已完成选中和类:未完成时未完成但现在不会过滤它们

  3. 如果你需要我的小提琴here

    这是我的jquery代码:

        // Filter Row Script Type of Quest
    // ........................................
    $('.filterMenu a').on('click', function (e) {
        e.preventDefault();
        var c = $(this).data('qtype');
    
        //get all trs from tbody
        var trs = $("#questTable").find("tbody tr");
        trs.hide();
    
        //Filter all trs from tbody
        trs.filter(function (i, v) {
            if ($(this).data("qtype") == c) {
                return true;
            }
            if (c == "all") {
                return true;
            }
            return false;
        })
        //just show the row if it fits the criteria
        .show();
    
    });
    
    // Filter Row Script Quest Completed or Not
    // ........................................
    $('.filterMenuCompleted a').on('click', function (e) {
        e.preventDefault();
        var c = $(this).attr('class');
    
        //get all trs from tbody
        var trs = $("#questTable").find("tbody tr");
        trs.hide();
    
        //Filter all trs from tbody
        trs.filter(function (i, v) {
            if ($(this).attr("class") == c) {
                return true;
            }
            if (c == "all") {
                return true;
            }
            return false;
        })
        //just show the row if it fits the criteria
        .show();
    
    });
    

    这是我的HTML:

    <body>
        <div id="content">
            <div class="filterMenuCompleted">
                    <ul>
                        <li><a href="#" class="all">All</a></li>
                        <li><a href="#" class="completed">Completed</a></li>
                        <li><a href="#" class="notCompleted">Not Completed</a></li>
                    </ul>
                </div>
            <div class="filterMenu">
                <ul>
                    <li><a href="#" data-qtype="all">All</a></li>
                    <li><a href="#" data-qtype="mcq">Main Scenario</a></li>
                    <li><a href="#" data-qtype="sq">Side Quest</a></li>
                </ul>
            </div>
            <table id="questTable" style="max-width: 800px;" class="all">
                <thead>
                    <tr>
                        <th class="table-header">#</th>
                        <th class="table-header">Type</th>
                        <th class="table-header">Icon</th>
                        <th class="table-header">LvL</th>
                        <th class="table-header">Name</th>
                        <th class="table-header">Issuing NPC</th>
                        <th class="table-header">Location</th>
                        <th class="table-header">Done It?</th>
                    </tr>
                </thead>
                <tbody>
                    <tr id="line1" class="table-row" data-qtype="mcq">
                        <td class="shortTd">MC-1</td>
                        <td class="shortTd">Main Scenario</td>
                        <td class="shortTd">
                            <img src="./images/Quests/Main_Scenario/mc.png" alt="" />
                        </td>
                        <td class="shortTd">1</td>
                        <td> <a href="#"> mcq 1</a>
    
                        </td>
                        <td>Name 1</td>
                        <td>Area 1</td>
                        <td class="shortTd">
                            <input class="completion" type="checkbox" id="checkbox1">
                        </td>
                    </tr>
                    <tr id="line2" class="table-row" data-qtype="mcq">
                        <td class="shortTd">Mc-2</td>
                        <td class="shortTd">Main Scenario</td>
                        <td class="shortTd">
                            <img src="./images/Quests/Main_Scenario/mc.png" alt="" />
                        </td>
                        <td class="shortTd">1</td>
                        <td> <a href="#">mcq 2</a>
    
                        </td>
                        <td>Name 2</td>
                        <td>Area 2</td>
                        <td class="shortTd">
                            <input class="completion" type="checkbox" id="checkbox2">
                        </td>
                    </tr>
                    <tr id="line2" class="table-row" data-qtype="sq">
                        <td class="shortTd">Sq-1</td>
                        <td class="shortTd">Side Quest</td>
                        <td class="shortTd">
                            <img src="./images/Quests/Main_Scenario/mc.png" alt="" />
                        </td>
                        <td class="shortTd">1</td>
                        <td> <a href="#">Side quest</a>
    
                        </td>
                        <td>Name 3</td>
                        <td>Area 3</td>
                        <td class="shortTd">
                            <input class="completion" type="checkbox" id="checkbox2">
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
        <div id="footer">Brought to you by Vesper Tia @ Moogle
            <br/>&copy; 2010 - 2015 SQUARE ENIX CO., LTD. All Rights Reserved.</div>
    </body>
    

    当然我的css:

    /*Global Resets*/
    
    /*....................................*/
     * {
        margin:0;
        padding:0
    }
    html {
        font-family:Arial, sans-serif;
        font-size:1em
    }
    h1, h2, h3 {
        margin:0 auto 1em;
        text-align:center
    }
    h1 {
        margin-top:1em;
        margin-bottom:0
    }
    h2 {
        color:#e8d19e
    }
    h3 {
        color:#5a9dd1
    }
    h4 {
        margin-bottom:.5em;
        padding-bottom:20px;
        text-align:center
    }
    a {
        color:#CC9900;
        text-decoration:none;
        font-weight:700
    }
    p {
        margin-bottom:1em;
        text-align:justify;
        line-height:1.3em
    }
    img {
        max-width:100%
    }
    table {
        margin:1em auto 3em;
        border-collapse:collapse
    }
    table th {
        padding:.5em 1em;
        height:2em;
        font-weight:700;
        color:#9ba3b6;
        text-shadow:0 0 5px #000;
        border-bottom:solid 1px #222;
    }
    table td {
        padding:.5em 1em;
        height:2em;
        background-color:#282828;
        border-bottom:solid 1px #666;
        line-height:1.4em;
        text-align:left
    }
    #content {
        padding:1em;
        color:#DDD
    }
    
    .filterMenuCompleted ul{height: 20px;float: left; margin-right: 50px;}
    .filterMenuCompleted ul li{
        display: block;
        float: left;
        margin-right: 5px;
    }
    
    .filterMenu ul{height: 20px;float: left; margin-right: 50px;}
    .filterMenu ul li{
        display: block;
        float: left;
        clear: right;
        margin-right: 5px;
    }
    /*Responsive Settings*/
    
    /*...............................................*/
     @media all and (max-width: 500px) {
        table {
            font-size:.8em
        }
        .npcFullCardName, .npcIcon img {
            display:none
        }
        .cardLocation {
            padding:15px;
            width:300px;
            background-size:300px;
            left:-85px;
            font-size:.8em
        }
    }
    @media all and (min-width: 501px) {
        .npcFullCardName {
            display:inline;
            color:#9c9;
            cursor:help
        }
    }
    @media all and (max-width: 1023px) {
        html {
            background:url(../images/background_low.jpg) no-repeat top center fixed #000
        }
        table {
            min-width:100%;
            width:100%
        }
    }
    @media all and (min-width: 1024px) {
        html {
            background:url(../images/background.jpg) no-repeat center center fixed #000;
            -webkit-background-size:cover;
            -moz-background-size:cover;
            -o-background-size:cover;
            background-size:cover
        }
        #content {
            margin:0 auto;
            max-width:1000px
        }
    }
    }
    /*Row Highlight*/
    
    /*................................................................*/
     .current-row td {
        background-color:#1b1b1b;
        color:#FFF
    }
    .completed td {
        opacity: 0.3
    }
    

2 个答案:

答案 0 :(得分:2)

在这里你已经弄清楚我刚刚添加了这一个 botaoA.setTitle("\(myAnswers[myQuestions.indexOfObject("\(myQuestions.new)")][0])", forState: UIControlState.Normal) 而不是if ($(this).hasClass(c))

参考摘录

if ($(this).attr("class") == c)
$(function(){// Filter Row Script Type of Quest
// ........................................
$('.filterMenu a').on('click', function (e) {
    e.preventDefault();
    var c = $(this).data('qtype');

    //get all trs from tbody
    var trs = $("#questTable").find("tbody tr");
    trs.hide();

    //Filter all trs from tbody
    trs.filter(function (i, v) {
        if ($(this).data("qtype") == c) {
            return true;
        }
        if (c == "all") {
            return true;
        }
        return false;
    })
    //just show the row if it fits the criteria
    .show();

});

// Filter Row Script Quest Completed or Not
// ........................................
$('.filterMenuCompleted a').on('click', function (e) {
    e.preventDefault();
    var c = $(this).attr('class');

    //get all trs from tbody
    var trs = $("#questTable").find("tbody tr");
    trs.hide();

    //Filter all trs from tbody
    trs.filter(function (i, v) {
        if ($(this).hasClass( c)) {
            return true;
        }
        if (c == "all") {
            return true;
        }
        return false;
    })
    //just show the row if it fits the criteria
    .show();

});

// Row Hover Script
// ........................................
$(document).ready(function () {
    $('.table-row').hover(function () {
        $(this).addClass('current-row');
    }, function () {
        $(this).removeClass('current-row');
    });
});

// Row hide Script
// ........................................
$(document).ready(function () {
    $('tr')
        .filter(':has(:checkbox:checked)')
        .addClass('completed')
        .end()
        .click(function (event) {
        if (event.target.type !== 'checkbox') {
            $(':checkbox', this).trigger('click');
        }

    })
        .find(':checkbox')
        .click(function (event) {
        $(this).parents('tr:first').toggleClass('completed');
    });
});

$(document).ready(function () {
    $('tr')
        .filter(':has(:checkbox:not(:checked))')
        .addClass('notCompleted')
        .end()
        .click(function (event) {
        if (event.target.type !== 'checkbox') {
            $(':checkbox', this).trigger('click');
        }

    })
        .find(':checkbox')
        .click(function (event) {
        $(this).parents('tr:first').toggleClass('notCompleted');
    });
});

});
/*....................................*/
 * {
    margin:0;
    padding:0
}
html {
    font-family:Arial, sans-serif;
    font-size:1em
}
h1, h2, h3 {
    margin:0 auto 1em;
    text-align:center
}
h1 {
    margin-top:1em;
    margin-bottom:0
}
h2 {
    color:#e8d19e
}
h3 {
    color:#5a9dd1
}
h4 {
    margin-bottom:.5em;
    padding-bottom:20px;
    text-align:center
}
a {
    color:#CC9900;
    text-decoration:none;
    font-weight:700
}
p {
    margin-bottom:1em;
    text-align:justify;
    line-height:1.3em
}
img {
    max-width:100%
}
table {
    margin:1em auto 3em;
    border-collapse:collapse
}
table th {
    padding:.5em 1em;
    height:2em;
    font-weight:700;
    color:#9ba3b6;
    text-shadow:0 0 5px #000;
    border-bottom:solid 1px #222;
}
table td {
    padding:.5em 1em;
    height:2em;
    background-color:#282828;
    border-bottom:solid 1px #666;
    line-height:1.4em;
    text-align:left
}
#content {
    padding:1em;
    color:#DDD
}

.filterMenuCompleted ul{height: 20px;float: left; margin-right: 50px;}
.filterMenuCompleted ul li{
	display: block;
	float: left;
	margin-right: 5px;
}

.filterMenu ul{height: 20px;float: left; margin-right: 50px;}
.filterMenu ul li{
	display: block;
	float: left;
	clear: right;
	margin-right: 5px;
}
/*Responsive Settings*/

/*...............................................*/
 @media all and (max-width: 500px) {
    table {
        font-size:.8em
    }
    .npcFullCardName, .npcIcon img {
        display:none
    }
    .cardLocation {
        padding:15px;
        width:300px;
        background-size:300px;
        left:-85px;
        font-size:.8em
    }
}
@media all and (min-width: 501px) {
    .npcFullCardName {
        display:inline;
        color:#9c9;
        cursor:help
    }
}
@media all and (max-width: 1023px) {
    html {
        background:url(../images/background_low.jpg) no-repeat top center fixed #000
    }
    table {
        min-width:100%;
        width:100%
    }
}
@media all and (min-width: 1024px) {
    html {
        background:url(../images/background.jpg) no-repeat center center fixed #000;
        -webkit-background-size:cover;
        -moz-background-size:cover;
        -o-background-size:cover;
        background-size:cover
    }
    #content {
        margin:0 auto;
        max-width:1000px
    }
}
}
/*Row Highlight*/

/*................................................................*/
 .current-row td {
    background-color:#1b1b1b;
    color:#FFF
}
.completed td {
    opacity: 0.3
}

答案 1 :(得分:1)

我知道你已经接受了,但我对你的代码进行了一些修改,并提出了一种组合使用两种过滤器的工作方法。这是我改变的HTML(我实际上只修改了两个过滤器中的列表锚点,因此它们具有filterVal而不是class的属性):

<div class="filterMenuCompleted">
    <ul>
        <li><a href="#" filterVal="all">All</a></li>
        <li><a href="#" filterVal="completed">Completed</a></li>
        <li><a href="#" filterVal="notCompleted">Not Completed</a></li>
    </ul>
</div>
<div class="filterMenu">
    <ul>
        <li><a href="#" filterVal="all">All</a></li>
        <li><a href="#" filterVal="mcq">Main Scenario</a></li>
        <li><a href="#" filterVal="sq">Side Quest</a></li>
    </ul>
</div>

JavaScript(我刚刚抹去了你所拥有的东西并开始新鲜,所以,抱歉 - 但随意挑出你想留下的东西并把剩下的东西扔掉):

var filterMenuCompSel = false;
var filterMenuSel = false;

$('.filterMenu ul li a').on('click', function(){
    $(this).closest('ul').find('li').removeClass('selected');
    $(this).closest('li').addClass('selected');
    filterMenuSel = $(this).attr('filterVal');
    ApplyFilter();
});
$('.filterMenuCompleted ul li a').on('click', function(){
    $(this).closest('ul').find('li').removeClass('selected');
    $(this).closest('li').addClass('selected');
    filterMenuCompSel = $(this).attr('filterVal');
    ApplyFilter();
});

function ApplyFilter(){
    $('#questTable tbody tr').each(function(){
        hide = false;
        switch(filterMenuCompSel){
            case 'completed':
                if(!$(this).find('.completion').is(':checked')){
                    hide = true;   
                }
                break;
            case 'notCompleted':
                if($(this).find('.completion').is(':checked')){
                    hide = true;
                }
                break;
        }
        if(!hide){
            switch(filterMenuSel){
                case 'mcq':
                    if($(this).find('td:nth-child(2)').text() != 'Main Scenario'){
                        hide = true;
                    }
                    break;
                case 'sq':
                    if($(this).find('td:nth-child(2)').text() != 'Side Quest'){
                        hide = true;
                    }
                    break;
            }
        }
        if(!hide){
            $(this).show();
        }
        if(hide){
            $(this).hide();
        }
    });
}

这是一个工作小提琴:https://jsfiddle.net/62qL9hed/