развернуть/свернуть строки таблицы с помощью jQuery
Я хочу развернуть и свернуть строки таблицы при нажатии на столбцы заголовка. Я только хочу развернуть / свернуть строки, которые находятся под определенным заголовком (щелкнуто).
вот моя структура таблицы:
<table border="0">
<tr>
<td colspan="2">Header</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td colspan="2">Header</td>
</tr>
<tr>
<td>date</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
</tr>
</table>любые мысли о том, как я могу выполнить эту задачу. Используя див эта задача кажется довольно простой, но у меня есть табличные данные, которые я хочу манипулировать.
одна идея, которую я могу придумать, это использовать класс css в каждой строке, которая различает строки в под каждым заголовком и использовать JQuery, чтобы развернуть / свернуть эти строки только при нажатии на заголовок. Но если моя таблица имеет 10-15 заголовков, то, кажется, трудно отслеживать классы css.
пожалуйста, предложите подходящий способ для достижения этой цели.
7 ответов:
вы можете попробовать этот способ:-
дайте класс сказать
headerдля строк заголовка используйте nextUntil, чтобы получить все строки под нажатым заголовком до следующего заголовка.JS
$('.header').click(function(){ $(this).nextUntil('tr.header').slideToggle(1000); });Html
<table border="0"> <tr class="header"> <td colspan="2">Header</td> </tr> <tr> <td>data</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> </tr>демо
Еще Пример:
$('.header').click(function(){ $(this).find('span').text(function(_, value){return value=='-'?'+':'-'}); $(this).nextUntil('tr.header').slideToggle(100); // or just use "toggle()" });демо
вы также можете использовать promise для переключения значка/текста span после завершения переключения в случае анимации тумблер.
$('.header').click(function () { var $this = $(this); $(this).nextUntil('tr.header').slideToggle(100).promise().done(function () { $this.find('span').text(function (_, value) { return value == '-' ? '+' : '-' }); }); });или просто с псевдо-элементом css для представления знака расширения / коллапса и просто переключите класс в заголовке.
CSS: -
.header .sign:after{ content:"+"; display:inline-block; } .header.expand .sign:after{ content:"-"; }JS: -
$(this).toggleClass('expand').nextUntil('tr.header').slideToggle(100);демо
самый простой способ добиться этого, не меняя HTML
table-основанная структура, должна использовать имя класса наtrэлементы, содержащие заголовок, например.header, чтобы дать:<table border="0"> <tr class="header"> <td colspan="2">Header</td> </tr> <tr> <td>data</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> </tr> <tr class="header"> <td colspan="2">Header</td> </tr> <tr> <td>date</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> </tr> </table>и jQuery:
// bind a click-handler to the 'tr' elements with the 'header' class-name: $('tr.header').click(function(){ /* get all the subsequent 'tr' elements until the next 'tr.header', set the 'display' property to 'none' (if they're visible), to 'table-row' if they're not: */ $(this).nextUntil('tr.header').css('display', function(i,v){ return this.style.display === 'table-row' ? 'none' : 'table-row'; }); });в связанной демо я использовал CSS, чтобы скрыть
trэлементов не естьheaderclass-name; на практике, хотя (несмотря на относительную редкость пользователей с отключенным JavaScript) я бы предложил использовать JavaScript для добавления соответствующих имен классов, скрывая и показывая по мере необходимости:// hide all 'tr' elements, then filter them to find... $('tr').hide().filter(function () { // only those 'tr' elements that have 'td' elements with a 'colspan' attribute: return $(this).find('td[colspan]').length; // add the 'header' class to those found 'tr' elements }).addClass('header') // set the display of those elements to 'table-row': .css('display', 'table-row') // bind the click-handler (as above) .click(function () { $(this).nextUntil('tr.header').css('display', function (i, v) { return this.style.display === 'table-row' ? 'none' : 'table-row'; }); });ссылки:
Я бы сказал с помощью
data-атрибут для сопоставления заголовков с элементами внутри него. Скрипка : http://jsfiddle.net/GbRAZ/1/предварительный просмотр изменения HTML:
<tr class="header" id="header1"> <td colspan="2">Header</td> </tr> <tr data-for="header1" style="display:none"> <td>data</td> <td>data</td> </tr> <tr data-for="header1" style="display:none"> <td>data</td> <td>data</td> </tr>JS код :
$(".header").click(function () { $("[data-for="+this.id+"]").slideToggle("slow"); });EDIT: Но, это включает в себя некоторые изменения HTML. так что я не знаю, если это то, что вы хотели. Лучший способ структурировать это было бы использование
<th>или путем изменения всего html для использованияul, ol, etcили дажеdiv > spanустановка.
мне понравился самый простой ответ. Однако, мне не нравится исключительно из разваливающегося. Поэтому я объединил решение из этого вопроса:как использовать функцию slideDown (или show) в строке таблицы? чтобы сделать его более плавной анимацией, когда строки скользят вверх или вниз. Это включает в себя необходимость обернуть содержимое каждого td в div. Это позволяет ему плавно анимировать сворачивание. Когда строки будут расширены, он заменит div, только с содержимым.
Так вот html:
<table> <tr class="header"> <td>CARS</td> </tr> <tr class="thing"> <td>car</td> </tr> <tr class="thing"> <td>truck</td> </tr> <tr class="header"> <td>HOUSES</td> </tr> <tr class="thing"> <td>split level</td> </tr> <tr class="thing"> <td>trailer</td> </tr>а вот и js
$('.header').click(function(){ if($(this).hasClass("collapsed")){ $(this).nextUntil('tr.header') .find('td') .parent() .find('td > div') .slideDown("fast", function(){ var $set = $(this); $set.replaceWith($set.contents()); }); $(this).removeClass("collapsed"); } else { $(this).nextUntil('tr.header') .find('td') .wrapInner('<div style="display: block;" />') .parent() .find('td > div') .slideUp("fast"); $(this).addClass("collapsed"); } });проверьте эту скрипку для примера https://jsfiddle.net/p9mtqhm7/52/
я расширил один из ответов, однако мои функции немного разные. В моей версии разные строки образуют разные группы. И строка "header" запускает сворачивание/расширение этой конкретной группы. Кроме того, каждая отдельная подгруппа запоминает состояние, в котором она находится. Это может показаться немного запутанным, вы можете протестировать мою версию, используя jsfiddle. Надеюсь, что эти фрагменты кода будут полезны кому-то там!
HTML
<table border="0"> <tr> <th>Header 1</th> <th>Header 2</th> </tr> <tr> <td class='group1'>Group 1</td> <td>data 2</td> </tr> <tr class='group1'> <td>data 3</td> <td>data 4</td> </tr> <tr> <td class='group2'>Group 2</td> <td>data 2</td> </tr> <tr class='group2'> <td>data 3</td> <td>data 4</td> </tr> <tr class='group2'> <td class='sub_group1'>Sub Group 1</td> <td>data 6</td> </tr> <tr class='group2 sub_group1'> <td>data 7</td> <td>data 8</td> </tr> <tr class='group2 sub_group1'> <td>data 9</td> <td>data 10</td> </tr> <tr class='group2 sub_group1'> <td class='sub_sub_group1'>Sub Sub Group 1</td> <td>data 11</td> </tr> <tr class='group2 sub_group1 sub_sub_group1'> <td>data 12</td> <td>data 13</td> </tr> <tr class='group2 sub_group1 sub_sub_group1'> <td>data 14</td> <td>data 15</td> </tr> <tr class='group2'> <td class='sub_group2'>Sub Group 2</td> <td>data 11</td> </tr> <tr class='group2 sub_group2'> <td>data 12</td> <td>data 13</td> </tr> <tr class='group2 sub_group2'> <td>data 14</td> <td>data 15</td> </tr> </table>CSS
table, tr, td, th { border: 1px solid black; border-collapse:collapse; } img.button_open{ content:url('http://code.stephenmorley.org/javascript/collapsible-lists/button-open.png'); cursor:pointer; } img.button_closed{ content: url('http://code.stephenmorley.org/javascript/collapsible-lists/button-closed.png'); cursor:pointer; }JS
function CreateGroup(group_name) { // Create Button(Image) $('td.' + group_name).prepend("<img class='" + group_name + " button_closed'> "); // Add Padding to Data $('tr.' + group_name).each(function () { var first_td = $(this).children('td').first(); var padding_left = parseInt($(first_td).css('padding-left')); $(first_td).css('padding-left', String(padding_left + 25) + 'px'); }); RestoreGroup(group_name); // Tie toggle function to the button $('img.' + group_name).click(function(){ ToggleGroup(group_name); }); } function ToggleGroup(group_name) { ToggleButton($('img.' + group_name)); RestoreGroup(group_name); } function RestoreGroup(group_name) { if ($('img.' + group_name).hasClass('button_open')) { // Open everything $('tr.' + group_name).show(); // Close subgroups that been closed $('tr.' + group_name).find('img.button_closed').each(function () { sub_group_name = $(this).attr('class').split(/\s+/)[0]; //console.log(sub_group_name); RestoreGroup(sub_group_name); }); } if ($('img.' + group_name).hasClass('button_closed')) { // Close everything $('tr.' + group_name).hide(); } } function ToggleButton(button) { $(button).toggleClass('button_open'); $(button).toggleClass('button_closed'); } CreateGroup('group1'); CreateGroup('group2'); CreateGroup('sub_group1'); CreateGroup('sub_group2'); CreateGroup('sub_sub_group1');
аккордеон JavaScript делает трюк.
эта скрипка от W3Schools делает простую задачу еще более простой, используя только javascript, который я частично воспроизвожу ниже.
<head> <style> button.accordion { background-color: #eee; color: #444; font-size: 15px; cursor: pointer; } button.accordion.active, button.accordion:hover { background-color: #ddd; } div.panel { padding: 0 18px; display: none; background-color: white; } div.panel.show { display: block; } </style> </head><body> <script> var acc = document.getElementsByClassName("accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].onclick = function(){ this.classList.toggle("active"); this.nextElementSibling.classList.toggle("show"); } } </script> ... <button class="accordion">Section 1</button> <div class="panel"> <p>Lorem ipsum dolor sit amet</p> </div> ... <button class="accordion">Table</button> <div class="panel"> <p><table name="detail_table">...</table></p> </div> ... <button class="accordion"><table name="button_table">...</table></button> <div class="panel"> <p>Lorem ipsum dolor sit amet</p> <table name="detail_table">...</table> <img src=...></img> </div> ... </body></html>Если вы используете php, не забудьте конвертировать
"to'. Вы также можете использовать таблицы данных внутри кнопки и он все равно будет работать.
Comments