javascript - 如何在点击时重置 .table-stripe 类

标签 javascript jquery html css twitter-bootstrap-3

我有一张 table ,我试图按动物类型进行排序。我已经完成了这一切,但由于某种原因,行上的条纹弄乱了。我可以有 2 行灰色条纹,彼此叠在一起。 Jfiddle

$(document).ready(function(){
// Get all the rows for the table
    $upcoming = $('#upcoming_production_sales .table');
    $events = $upcoming.find('tr.event');
    map = {};

    // Find the event category column push into map
    $events.each(function(idx,ele){ 
    diffText = $(ele).find('td.event-category').text();
    diffText = (diffText == undefined || diffText == "" ? "Other" : diffText).toLowerCase();
    if(!map[diffText]){
        map[diffText]=[];
    }
    map[diffText].push(ele);
    });

    // Get keys 
keys=Object.keys(map);
    var filterEvents = function filterEvents(diffText) {
      keys.forEach(function(key, idx, arr) {
        var hideRows = (key.toLowerCase() != diffText.toLowerCase()) && ("all" != diffText.toLowerCase());
        map[key].forEach(function(row, idx, arr) {
          if(hideRows) $(row).hide();
          else $(row).show();
        });
      });
    };




    $("#upcoming_production_sales .all-upcoming-events").click(function(event){
        // Remove active class
    $("#upcoming_production_sales .nav li").removeClass('active');
    // Add active class to clicked event
    $(this).parent().addClass('active');
        filterEvents('all');
        event.preventDefault();
    });

    $("#upcoming_production_sales .cattle-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
        filterEvents('cattle');
        event.preventDefault();
    });

    $("#upcoming_production_sales .deer-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    // Add active class to clicked event
    $(this).parent().addClass('active');
        filterEvents('deer');
        event.preventDefault();
    });

    $("#upcoming_production_sales .equine-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
        filterEvents('equine');
        event.preventDefault();
    });

    $("#upcoming_production_sales .goat-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
        filterEvents('goats');
        event.preventDefault();
    });

    $("#upcoming_production_sales .sheep-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
        filterEvents('sheep');
        event.preventDefault();
    });

    $("#upcoming_production_sales .swine-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
        filterEvents('swine');
        event.preventDefault();
    });

    $("#upcoming_production_sales .other-upcoming-events").click(function(event){
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
        filterEvents('other');
        event.preventDefault();
    });


});

最佳答案

您遇到的问题是因为 :nth-child CSS 选择器仍然计算隐藏元素。这意味着仍然可见的元素上的条纹不匹配。解决方法是使用 jQuery 的 :even:odd 选择器在修改过滤器时应用 strip 化。

首先,您需要从table中删除table-striped类。然后您可以添加一个函数来为您划分行。试试这个:

keys = Object.keys(map);
var filterEvents = function(diffText) {
    keys.forEach(function(key, idx, arr) {
        var hideRows = (key.toLowerCase() != diffText.toLowerCase()) && ("all" != diffText.toLowerCase());
        map[key].forEach(function(row, idx, arr) {
            if (hideRows) 
                $(row).hide();
            else 
                $(row).show();
        });
        setStripe(); //when the filter is changed
    });
};

var setStripe = function() {
    $(".table tr:visible:odd").addClass('odd').removeClass('even');
    $(".table tr:visible:even").addClass('even').removeClass('odd');
}
setStripe(); // on load

另请注意,您可以通过使用 data-* 属性来消除过滤器 a 元素上的重复点击处理程序:

<ul class="nav nav-pills">
    <li class="active"><a class="all-upcoming-events" href="#" data-filter="all">All Events <span class='badge'>216</span></a></li>
    <li><a class="cattle-upcoming-events" href="#" data-filter="cattle">Cattle <span class='badge'>177</span></a></li>
    <li><a class="deer-upcoming-events" href="#" data-filter="deer">Deer <span class='badge'>6</span></a></li>
    <li><a class="equine-upcoming-events" href="#" data-filter="equine">Equine <span class='badge'>0</span></a></li>
    <li><a class="goat-upcoming-events" href="#" data-filter="goats">Goats <span class='badge'>10</span></a></li>
    <li><a class="sheep-upcoming-events" href="#" data-filter="sheep">Sheep <span class='badge'>0</span></a></li>
    <li><a class="swine-upcoming-events" href="#" data-filter="swine">Swine <span class='badge'>0</span></a></li>
    <li><a class="other-upcoming-events" href="#" data-filter="other">Other <span class='badge'>23</span></a></li>
</ul>
$("#upcoming_production_sales a").click(function(event) {
    event.preventDefault();
    $("#upcoming_production_sales .nav li").removeClass('active');
    $(this).parent().addClass('active');
    filterEvents($(this).data('filter'));
});

Working example

关于javascript - 如何在点击时重置 .table-stripe 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34344911/

相关文章:

javascript - 为什么 getScript 不能从外部脚本运行?

php - Laravel AJAX 请求发布错误代码 : 419 after session id changed when logging in using laravel auth

jquery - 如何设置 2 个垂直 jQuery UI Slider handle 的样式?

html - CSS:是否有可能获得 100% 高度的 div,减去顶部和底部边距?

javascript - REACT,有一个滚动数字 1-10 的变量,并在 JSX 中的 return 语句中连接该变量。在屏幕上呈现之前,数字会滚动 2 倍

javascript - 如何使用 javascript/jquery 在 html 中创建用户可控制的幻灯片?

javascript - 通过 jQuery 检测关闭窗口事件

javascript - 使用 JQUERY 提交之前检查表单输入值的问题

html - Flexbox 响应性 3 列

php - 拉维尔 5 : app() helper function