代码之家  ›  专栏  ›  技术社区  ›  Brian Boatright

如何使用jquery隐藏表的中间部分?

  •  49
  • Brian Boatright  · 技术社区  · 16 年前

    我有一张很长的三列桌子。我想

    <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的显示/隐藏功能最小化表,但仍然显示部分顶行和底行。中间行应替换为“显示完整表”之类的文本,单击时将展开以显示从开始到结束的完整表。

    在jquery中,最好的方法是什么?

    顺便说一句,我已经尝试在一些行中添加一个类“table_middle”,但它并没有完全隐藏它,因为它所占的空间仍然存在,而且我没有文本给用户一种完全扩展表的方法。

    [编辑]添加了工作示例html,灵感来自parand发布的答案

    下面的示例是一个完整的工作示例,您甚至不需要下载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>
    

    [编辑]链接我的 blog post 以及工作实例。

    6 回复  |  直到 8 年前
        1
  •  56
  •   nickf    16 年前

    类似这样的事情可能会奏效:

    <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();
    });
    
        2
  •  4
  •   Greg    16 年前

    最简单的方法是添加 <tbody> 在中对行进行分组并在 none table-row-group (捕获异常并将其设置为 block 对于IE)。不确定它是否特定于jquery,但这是做事情的“正常”方式。

        3
  •  4
  •   nickf    16 年前

    这是一个不需要任何额外标记的解决方案,它会很好地降低性能。

    <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()
                    ;
                })
            )
        ;
    }
    
        4
  •  4
  •   Elzo Valugi    15 年前

    尝试使用slice()方法:

    $("#table tr").slice(1, 4).hide();
    
        5
  •  2
  •   Dan Herbert    16 年前

    如果你把你的中间 <tr /> 标记“ Table_Middle “上课,这样做容易得多。然后只需要几行jquery。一个添加“显示完整表”行,另一个添加该行的单击侦听器。确保更改 colspan 属性的“x”值表示表中的列数。

     // 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(或者任何其他可能导致此代码不受支持的方案),则没有“显示完整表”行。

        6
  •  1
  •   SpoonMeiser    16 年前

    我可能会这样做:

    <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 document ready函数隐藏它们,并创建包含链接的行。

    另外,给行隐藏特定类的方法也应该有效。jQuery看起来像这样:

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

    但是,您仍然需要创建带有链接的行来取消隐藏它们。

    推荐文章