【问题标题】:CSS odd & even on dynamic table动态表上的 CSS 奇偶数
【发布时间】:2016-12-07 18:22:14
【问题描述】:

我正在使用以下 jQuery 应用到输入字段来缩小表格中显示的项目列表(真正的 table,具有 trtd 布局):

$(function(){
    $("#search").keyup(function() {
        var value = this.value.toLowerCase();

        $(".table").find("tr").each(function(index) {
            if (index === 0) return;
            var id = $(this).find("td").text().toLowerCase();
            $(this).toggle(id.indexOf(value) !== -1);
        });
    });
});

否则它工作得很好,但是由于.table 具有.table tr:nth-child(odd)(even) 的初始布局目标样式,因此当应用列表缩小搜索过滤器时,奇数行和偶数行会变得混乱。

到目前为止,当行动态变化时,我一直对 removeClass 和 addClass 不走运,我是否遗漏了一些重要的东西..?

可以在https://jsfiddle.net/4cf8a01L/3/查看 JSFiddle 示例

【问题讨论】:

  • 您必须从 DOM 中删除项目(使用 .detach())。然后,从分离元素的“池”(数组)中将它们全部添加回来。您需要(以某种方式)记住<tr> 的顺序(类似data-pos 的属性?)。如果您不从 DOM 中删除,所有样式都将由浏览器应用。

标签: javascript jquery html css


【解决方案1】:

有点老套的方法 - https://jsfiddle.net/6rk09jb0/1/

添加奇偶类

.table tr:nth-child(odd),
.table tr.odd.odd {
  background-color: #fff;
}
.table tr:nth-child(even),
.table tr.even.even {
  background-color: #c0c0c0;
}

过滤时应用奇数和偶数

$("#search").keyup(function() {
  var value = this.value.toLowerCase();

  var count = 0;

  $(".table").find("tr").each(function(index) {
    if (index === 0) return;
    var id = $(this).find("td").text().toLowerCase();
    var test = id.indexOf(value) !== -1;
    var className = '';
    if (test) {
      count += 1;
      className = count % 2 ? 'odd' : 'even';
    }
    $(this).toggle(test).attr('class', className);
  });
});

【讨论】:

  • 请不要做count += 1;之类的事情。您应该使用className = count++ % 2 ? 'odd' : 'even'; 或简单地将其更改为count++;。此外,您应该避免重复$(this)。而且由于您正在将类应用于元素,因此它们将从没有类开始。您应该通过在最后一行添加.keyup() 来触发事件。
  • 谢谢,这很好地完成了这项工作。至少对于 Fiddle 演示,现在我必须让它与 tablesorter.com 插件一起工作:)
  • @lapingultah 你最好使用datatables.net(在我看来)。
【解决方案2】:

不幸的是,:nth-child 考虑了所有子元素,无论它们的可见性如何。要解决此问题,您可以使用 jQuery 在页面加载时以及在更改过滤器时将行条纹应用于可见行,如下所示:

$("#search").keyup(function() {
  var value = this.value.toLowerCase();
  var $table = $('table');

  $table.find("tbody tr").each(function(index) {
    var id = $(this).find("td").text().toLowerCase().trim();
    $(this).toggle(id.indexOf(value) !== -1);
  });

  stripeRows($table);
});

function stripeRows($table) {
  $table.find('tr:visible:odd').css('background', '#FFFFFF');
  $table.find('tr:visible:even').css('background', '#C0C0C0');
}
stripeRows($('table'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="search" autofocus>
<table class="table">
  <thead>
    <tr>
      <th>title 1</th>
      <th>title 2</th>
      <th>title 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>data</td>
      <td>goes</td>
      <td>here</td>
    </tr>
    <tr>
      <td>and</td>
      <td>then</td>
      <td>here</td>
    </tr>
    <tr>
      <td>rows</td>
      <td>repeat</td>
      <td>this way</td>
    </tr>
    <tr>
      <td>consisting</td>
      <td>of hundres</td>
      <td>of rows</td>
    </tr>
    <tr>
      <td>cell</td>
      <td>cell</td>
      <td>cell</td>
    </tr>
    <tr>
      <td>content</td>
      <td>content</td>
      <td>content</td>
    </tr>
  </tbody>
</table>

请注意,以上仅在tbody 中搜索tr,而不是显式排除索引0 处的行。

或者你可以使用你现在的CSS,但是你需要在过滤时remove()detach()tr,然后还有一个系统将它们放回正确的位置,通过排序或明确设置他们的位置。

虽然此解决方案的 CSS 会更简单,但所需的逻辑会复杂得多。

【讨论】:

  • 我很抱歉,但这个答案真的没有增加太多。我对此有点失望。 @phoa 的答案更好(更快的代码,在 Javascript 中间没有随机的 CSS)并且对我的评论有点意见(我仍然同意,但他们的答案要好得多)。此外,他们的答案与旧版浏览器兼容(对于那些必须针对已弃用和不受支持的陷阱进行开发的人)。
  • 很抱歉你有这种感觉。至于抛出的“随机css”,可以很容易地修改为使用一个类。另请注意,当 :nth-child 时,您说其他答案适用于旧版浏览器,而上述答案适用于 IE4 以下的任何浏览器。
  • 没有人使用 IE4。 IE6-8 仍然(很少)使用。我只是有这种感觉,因为 CSS 和 Javascript 的混合以及 terribly 缓慢的重复选择器tr:visible.
  • 那么为什么要使用与旧浏览器的浏览器兼容性作为另一个答案的积极点呢?请随时提供替代答案。就性能而言,我敢打赌两者非常相似,因为它们都在循环遍历表格的行。
  • @lapingultah 我不同意。这个答案实际上更短。它只是在水平方向上有更多的文字。
猜你喜欢
  • 2018-08-14
  • 2015-06-16
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2016-04-21
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多