使用jQuery来滑动切换一组表格行

7

我对JavaScript和jQuery比较新,希望这是一个快速修复。我需要显示一个包含可以分组为多个类别的数据的表格,并且我想实现一个slideToggle,以隐藏/显示每个给定类别中的所有观察结果。

下面的代码应该(理想情况下)显示一个具有4列和9行的表格,其中每个3行组之前都有一个绿色的"第i节"行。我希望每个"节"标题都作为slideToggle工作,展开或折叠其下方的所有行。目前,没有任何东西正在折叠。有什么想法吗?

<head>
  <style type="text/css">
    td{padding:5px;}
  </style>

  <script type="text/javascript" src="js/jquery.js"></script>
  <script type="text/javascript"> 
      $(document).ready(function(){
      $(".flip").click(function(){
          $(this).next(".section").slideToggle();
      });
  });
  </script>

</head>

<body>
    <p>
        <table id="main_table">
        <thead>
            <tr class="firstline">
                <th>Column1</th>
                <th>Column2</th>
                <th>Column3</th>
                <th>Column4</th>
            </tr>
        </thead>
        <tbody>
            <tr style="background-color:green; color:white"> 
                <td  colspan="4" class="flip"> Section 1 </td> 
            </tr>
            <div class="section">
            <tr>
                <td>item 111</td>
                <td>item 112</td>
                <td>item 113</td>
                <td>item 114</td>
            </tr>
            <tr>
                <td>item 121</td>
                <td>item 122</td>
                <td>item 123</td>
                <td>item 124</td>
            </tr>
            <tr>
                <td>item 131</td>
                <td>item 132</td>
                <td>item 133</td>
                <td>item 134</td>
            </tr>
            </div>
            <tr style="background-color:green; color:white"> 
                <td  colspan="4" class="flip"> Section 2 </td> 
            </tr>
            <div class="section">
            <tr>
                <td>item 211</td>
                <td>item 212</td>
                <td>item 213</td>
                <td>item 214</td>
            </tr>
            <tr>
                <td>item 221</td>
                <td>item 222</td>
                <td>item 223</td>
                <td>item 224</td>
            </tr>
            <tr>
                <td>item 231</td>
                <td>item 232</td>
                <td>item 233</td>
                <td>item 234</td>
            </tr>
            </div>
            <tr style="background-color:green; color:white"> 
                <td  colspan="4" class="flip"> Section 3 </td> 
            </tr>
            <div class="section">
            <tr>
                <td>item 311</td>
                <td>item 312</td>
                <td>item 313</td>
                <td>item 314</td>
            </tr>
            <tr>
                <td>item 321</td>
                <td>item 322</td>
                <td>item 323</td>
                <td>item 324</td>
            </tr>
            <tr>
                <td>item 331</td>
                <td>item 332</td>
                <td>item 333</td>
                <td>item 334</td>
            </tr>
            </div>
        </tbody>
        </table>
    </p>
</body>

首先:您不能在tabletd之间使用div。其次:td.flip没有元素*next()*(它没有兄弟节点)。 - AndreKR
我曾尝试使用jQuery和表格来做类似的事情,但遇到了很多问题。看起来表格并不是很适合这种情况,所以我放弃了表格,改用div,效果好多了 :-) - Rob
请问您能否在这里发布最终可用的代码? - Nitin Garg
1个回答

5
您不能像这样将<div>混合到<table>中,应该使用额外的<tbody>元素。在您的回调函数中,this<td>元素,它没有兄弟姐妹,所以.next无用;您需要向上回溯,直到找到与您感兴趣的.section处于相同深度的元素,然后从那里调用.next
您的HTML应该更像这样:
<table id="main_table">
    <thead>
        <tr class="firstline">
            <th>Column1</th>
            <th>Column2</th>
            <th>Column3</th>
            <th>Column4</th>
        </tr>
    </thead>
    <tbody>
        <tr style="background-color:green; color:white">
            <td  colspan="4" class="flip"> Section 1 </td>
        </tr>
    </tbody>
    <tbody class="section">
        <tr>
            <td>item 111</td>
            <td>item 112</td>
            <td>item 113</td>
            <td>item 114</td>
        </tr>
        <!-- ... -->

你的点击事件处理程序应该像这样:

$('.flip').click(function() {
    $(this)
        .closest('tbody')
        .next('.section')
        .toggle('fast');
});

.closest方法会向上查找祖先元素直到找到一个<tbody>,然后你可以在此元素上调用.next方法。

更新的jsfiddle链接:http://jsfiddle.net/ambiguous/Udxyb/4/


1
请注意,原问题要求使用slideToggle,但是这种方法似乎不起作用。将toggle更改为slideToggle会破坏动画效果。http://jsfiddle.net/m83Pc/ - supertrue
@supertrue:这是相当久以前的事情了,所以我不确定slideToggletoggle的转换是从哪里来的。我怀疑动画问题是在<table>内部的常见显示和嵌套问题的副作用。我会稍微探索一下,看看能找出什么。 - mu is too short
@supertrue:如果您切换到slideToggle(10000)并在良好的DOM检查器中观察.section,您将看到动画只是调整了高度。您还会注意到<tbody>完全忽略height(很抱歉,我没有明确的参考资料)除非您更改其display(http://jsfiddle.net/ambiguous/m83Pc/1/),但这会引起其他奇怪的问题。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接