Использование jQuery для slideToggle группы строк таблицы - PullRequest
7 голосов
/ 25 февраля 2011

Я довольно новичок в javaScript и jQuery, так что, надеюсь, это будет быстрое решение. Мне нужно отобразить таблицу, содержащую данные, которые можно сгруппировать по нескольким категориям, и я хотел бы реализовать slideToggle, который скрывает / показывает все наблюдения в каждой данной категории.

Приведенный ниже код должен (в идеале) отображать таблицу с 4 столбцами и 9 строками, причем каждой группе из 3 строк предшествует зеленая строка «Раздел i». Мне бы хотелось, чтобы каждый заголовок раздела работал как слайд-тоггл, который разворачивает или сворачивает все строки под ним. Прямо сейчас ничего не рушится. Есть мысли?

<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>

1 Ответ

5 голосов
/ 25 февраля 2011

Вы не можете смешивать <div> s в <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/

...