2016-12-07 29 views
2

我使用下面片的jQuery施加到输入字段,以缩小在一个表中显示的项目的列表(一个真实table,与trtd布局):CSS奇数&即使在动态表

$(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,当行动态发生动态变化时,我是否缺少一些重要的..?

一个的jsfiddle例如可以检查在https://jsfiddle.net/4cf8a01L/3/

+0

你必须删除** **时来自DOM的项目(使用'.detach()')。然后将它们全部从一个“池”(一个数组)的分离元素中加回来。你需要(不知何故)记住''的排序(像'data-pos'这样的属性?)。如果您不从DOM中移除,所有样式将由浏览器应用。 –

回答

3

的还挺哈克的方式做到这一点 - 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); 
    }); 
}); 
+2

请不要做'count + = 1;'等事情。你应该使用'className = count ++%2? 'odd':'even';'或者简单地将它改为'count ++;'。另外,你应该避免重复'$(this)'。而且,由于你正在向元素应用一个类,他们将首先没有一个类。您应该在最后一行添加'.keyup()'来触发事件。 –

+0

谢谢,这个工作干净整洁。至少对于Fiddle演示,现在我必须让它与http://tablesorter.com/插件一起工作:) – lapingultah

+1

@lapingultah你最好使用https://datatables.net/(在我看来)。 –

1

不幸的是: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>

注意的是,以上只是搜索对于trtbody内,而不是明确排除索引0处的行。

你也可以用你现在的CSS,但你筛选的时候,然后还必须把它们放回正确的位置的系统,既可以通过分类或明确设置自己的位置需要remove()detach()tr

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

+0

我很抱歉,但这个答案真的不会增加太多。我对它有点失望。 @ phoa的答案是优越的(更快的代码,没有在Javascript中间抛出随机的CSS),并对我的评论(我仍然同意,但他们的答案好得多)略作了一番。此外,他们的答案与旧版浏览器兼容(对于那些必须开发不赞成和不支持的陷阱的人)。 –

+0

对不起,你觉得那样。至于引入的'随机css',它可以很容易地修改为使用一个类。另外请注意,当在

+0

没有人使用IE4。 IE6-8仍然(很少)使用。我只是因为CSS和Javascript和非常慢的重复选择符“tr:visible”的混合而感觉到这种方式。 –