Как скрыть середину таблицы с помощью jQuery?

У меня действительно длинная таблица с 3 столбцами. я бы хотел

<table>
    <tr><td>Column1</td><td>Column2</td></tr>
    <tr><td>Column1</td><td>Column2</td></tr>
    <tr><td>Start</td><td>Hiding</td></tr>
    <tr><td>Column1</td><td>Column2</td></tr>
    <tr><td>Column1</td><td>Column2</td></tr>
    <tr><td>Column1</td><td>Column2</td></tr>
    <tr><td>End</td><td>Hiding</td></tr>
    <tr><td>Column1</td><td>Column2</td></tr>
    <tr><td>Column1</td><td>Column2</td></tr>
</table>

Это результат, который я пытаюсь получить с помощью jQuery.

Column1  Column2
Column1  Column2
...Show Full Table...
Column1  Column2
Column1  Column2

Я хотел бы использовать функцию jQuery show / hide, чтобы минимизировать таблицу, но при этом отображать часть верхней и нижней строк. Средние строки следует заменить текстом типа «Показать полную таблицу», и при нажатии они будут расширяться, чтобы показать всю таблицу от начала до конца.

Как лучше всего это сделать в jQuery?

Кстати, я уже пробовал добавить класс «Table_Middle» к некоторым строкам, но он не скрывает его полностью, занимаемое пространство все еще там, и у меня нет текста, чтобы дать пользователю возможность расширить таблицу полностью.

[EDIT] Добавлен рабочий пример HTML, вдохновленный опубликованным ответом Паранда.

Пример ниже представляет собой полный рабочий пример, вам даже не нужно загружать jquery. Просто вставьте в пустой HTML-файл.

При выключенном Javascript отображается только полная таблица. Если Javascript включен, он скрывает средние строки таблицы и добавляет ссылки «показать / скрыть».

<html>
    <head>
        <meta http-equiv = "Content-Type" content = "text/html; charset=windows-1252">
        <title>Example Show/Hide Middle rows of a table using jQuery</title>
        <script src = "http://code.jquery.com/jquery-latest.js"></script>
        <script type = "text/javascript">
            $(document).ready(function() {
                $("#HiddenRowsNotice").html("<tr><td colspan='2'> <a href='#'>>> some rows hidden <<</a></td></tr>");
                $("#ShowHide").html("<tr><td colspan='2'><a href='#'>show/hide middle rows</a></td></tr>");
                $("#HiddenRows").hide();

                $('#ShowHide,#HiddenRowsNotice').click( function() {
                    $('#HiddenRows').toggle();  
                    $('#HiddenRowsNotice').toggle();
                });
            });
        </script>
    </head>
    <body>
        <table>
            <tbody id = "ShowHide"></tbody>
                <tr><th>Month Name</th><th>Month</th></tr>
            <tbody>
                <tr><td>Jan</td><td>1</td></tr>    
            </tbody>
            <tbody id = "HiddenRowsNotice"></tbody>
            <tbody id = "HiddenRows">
                <tr><td>Feb</td><td>2</td></tr>
                <tr><td>Mar</td><td>3</td></tr>
                <tr><td>Apr</td><td>4</td></tr>    
            </tbody>
            <tbody>
                <tr><td>May</td><td>5</td></tr>            
            </tbody>
        </table>
    </body>
</html>

[EDIT] Свяжите мой Сообщение блога и рабочий пример.

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
49
0
66 526
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Самый простой способ - добавить <tbody>, чтобы сгруппировать строки и переключить его между none и table-row-group (перехватить исключения и установить для него значение block для IE). Не уверен, что нужно делать это специально для jquery, но это «нормальный» способ делать что-то.

Ответ принят как подходящий

Что-то вроде этого могло сработать:

<table>
    <tbody>
      <tr><td>Column1</td><td>Column2</td></tr>
      <tr><td>Column1</td><td>Column2</td></tr>
      <tr class = "Show_Rows"><td>Start</td><td>Hiding</td></tr>
    </tbody>
    <tbody class = "Table_Middle" style = "display:none">
      <tr><td>Column1</td><td>Column2</td></tr>
      <tr><td>Column1</td><td>Column2</td></tr>
      <tr><td>Column1</td><td>Column2</td></tr>
    </tbody>
    <tbody>
      <tr class = "Show_Rows"><td>End</td><td>Hiding</td></tr>
      <tr><td>Column1</td><td>Column2</td></tr>
      <tr><td>Column1</td><td>Column2</td></tr>
    </tbody>
</table>


$('#something').click( function() {
    $('.Table_Middle').hide();
    $('.Show_Rows').show();
});

$('.Show_Rows').click( function() { 
    $('.Show_Rows').hide();
    $('.Table_Middle').show();
});

Я бы сделал это, наверное, так:

<table>
    <thead>
        <tr>
            <th>Col1</th>
            <th>Col2</th>
            <th>Col3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>data1</td>
            <td>data1</td>
            <td>data1</td>
        </tr>
        ...
    </tbody>
    <tbody id = "hidden-rows">
        <tr>
            <td colspan = "3">
                <a href = "#" onclick = "$('#hidden-rows').hide();$('#extra-rows').show();">
                    Show hidden rows
                </a>
            </td>
        </tr>
    </tbody>
    <tbody id = "extra-rows" style = "display: none;">
        <tr>
            <td>data1</td>
            <td>data1</td>
            <td>data1</td>
        </tr>
        ...
    </tbody>
    <tbody>
        <tr>
            <td>data1</td>
            <td>data1</td>
            <td>data1</td>
        </tr>
        ...
    </tbody>
</table>

Это не лучший метод, потому что он плохо деградирует.

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

Кроме того, ваш метод предоставления строк для скрытия определенного класса также должен работать. JQuery будет выглядеть примерно так:

$(document).ready(function() {
    $('tr.Table_Middle').hide();
});

Тем не менее, вам все равно нужно создать строку со ссылкой, чтобы отобразить их.

Если вы дадите своим средним тегам <tr /> класс «Table_Middle», это значительно упростит задачу. Тогда потребуется всего несколько строк jQuery. Один для добавления строки «Показать полную таблицу», а другой - для добавления прослушивателя кликов для этой строки. Не забудьте изменить значение «X» атрибута colspan на количество столбцов в вашей таблице.

 // jQuery chaining is useful here
 $(".Table_Middle").hide()
                   .eq(0)
                   .before('<tr colspan = "X" class = "showFull">Show Full Table<tr/>');

$(".showFull").click(function() {
    $(this).toggle();
    $(".Table_Middle").toggle();
});

Это полезно, потому что оно хорошо деградирует и доступно во многих браузерах / устройствах. Если JavaScript отключен или CSS отключен (или любой другой сценарий, который может привести к тому, что этот код не будет поддерживаться), строки «показать полную таблицу» не будет.

Вы это проверяли? Я думаю, что метод get возвращает объект DOM, а не объект jquery, и я думаю, что вы скрываете только эту первую строку Table_Middle, потому что hide вызывается после get. Я тоже не тестировал, но если я прав, то его нужно немного переделать, чтобы заработало.

SpoonMeiser 18.10.2008 20:59

Ты прав. Не могу поверить, что пропустил это. "get ()" возвращает объект DOM. Я обновил свой образец кода, чтобы подтвердить это.

Dan Herbert 18.10.2008 21:10

Вы можете просто использовать .eq (0) вместо .get (0), чтобы вернуть jQuery вместо элемента DOM. Но это лучший ответ здесь.

SpoonMeiser 19.10.2008 16:37

Вот решение, которое не требует дополнительной разметки и хорошо деградирует.

<table id = "myTable">
    <tbody>
        <tr><td>Cell</td><td>Cell</td></tr>
        <tr><td>Cell</td><td>Cell</td></tr>
        <tr><td>Cell</td><td>Cell</td></tr>
        <tr><td>Cell</td><td>Cell</td></tr>
        <tr><td>Cell</td><td>Cell</td></tr>
    </tbody>
</table>

и jQuery ... Я жестко запрограммировал здесь несколько вещей (например, идентификатор таблицы, количество отображаемых строк и т. д.). Их можно поместить в атрибут class в таблице, если вы хотите, чтобы его можно было использовать повторно. ( например: <table class = "hidey_2">)

var showTopAndBottom = 2,
    minRows = 4,
    $rows = $('#myTable tr').length),
    length = $rows.length
;
if (length > minRows) {
    $rows
        .slice(showTopAndBottom, length - showTopAndBottom)
        .hide()
    ;
    $rows
        .eq(showTopAndBottom - 1)
        .after(
            // this colspan could be worked out by counting the cells in another row
            $("<tr><td colspan=\"2\">Show</td></tr>").click(function() {
                $(this)
                    .remove()
                    .nextAll()
                    .show()
                ;
            })
        )
    ;
}

Попробуйте использовать метод slice ():

$("#table tr").slice(1, 4).hide();

Другие вопросы по теме