Ẩn / Hiển thị Cột trong Bảng HTML


146

Tôi có một bảng HTML với một số cột và tôi cần triển khai trình chọn cột bằng jquery. Khi người dùng nhấp vào hộp kiểm tôi muốn ẩn / hiển thị cột tương ứng trong bảng. Tôi muốn làm điều này mà không cần đính kèm một lớp cho mỗi td trong bảng, có cách nào để chọn toàn bộ một cột bằng jquery không? Dưới đây là một ví dụ về HTML.

<table>
    <thead>
        <tr><th class="col1">Header 1</th><th class="col2">Header 2</th><th class="col3">Header 3</th></tr>
    </thead>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

<form>
    <input type="checkbox" name="col1" checked="checked" /> Hide/Show Column 1 <br />
    <input type="checkbox" name="col2" checked="checked" /> Hide/Show Column 2 <br />
    <input type="checkbox" name="col3" checked="checked" /> Hide/Show Column 3 <br />
</form>

2
Tôi hy vọng trang web folowing sẽ giúp ích: fiendish.demon.co.uk/html/javascript/hidetablecols.html

Tôi đã triển khai giải pháp này bằng jQuery và nó hoạt động hoàn hảo với tôi: http://www.devcurry.com/2009/07/
leather-table-column-with-single-line-of.html

1
Mỗi bình luận của người dùng344059, đây là kho lưu trữ web cho liên kết bị hỏng http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html
KyleMit

Câu trả lời:


84

Tôi muốn làm điều này mà không cần gắn một lớp cho mỗi td

Cá nhân, tôi sẽ đi theo cách tiếp cận class-on-every-td / th / col. Sau đó, bạn có thể bật và tắt các cột bằng cách sử dụng một lần ghi vào className trên vùng chứa, giả sử các quy tắc kiểu như:

table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
...

Điều này sẽ nhanh hơn bất kỳ cách tiếp cận vòng lặp JS nào; đối với các bảng thực sự dài, nó có thể tạo ra sự khác biệt đáng kể cho khả năng đáp ứng.

Nếu bạn có thể thoát khỏi việc không hỗ trợ IE6, bạn có thể sử dụng các bộ chọn kề để tránh phải thêm các thuộc tính lớp vào tds. Hoặc cách khác, nếu mối quan tâm của bạn là làm cho đánh dấu sạch hơn, bạn có thể tự động thêm chúng từ JavaScript trong bước khởi tạo.


7
Cảm ơn lời khuyên, tôi đã muốn giữ trình dọn dẹp HTML, nhưng hiệu suất chắc chắn đã trở thành một vấn đề khi kích thước bảng tiếp cận 100 hàng. Giải pháp này, cung cấp một cải tiến hiệu suất 2-5x.
Brian Fisher

2
Cách tiếp cận này làm việc kỳ diệu đối với tôi, hiệu suất-khôn ngoan. Cảm ơn!
axelarge

4
Tôi bổ sung này để css của tôi .hidden {display:none;}và đã qua sử dụng .addClass('hidden').removeClass('hidden')mà là một chút nhanh hơn .hide().show().
styfle

247

Một dòng mã sử dụng jQuery ẩn cột thứ 2:

$('td:nth-child(2)').hide();

Nếu bảng của bạn có tiêu đề (th), hãy sử dụng:

$('td:nth-child(2),th:nth-child(2)').hide();

Nguồn: Ẩn một cột bảng với một dòng mã jQuery

jsFiddle để kiểm tra mã: http://jsfiddle.net/mgMem/1/


Nếu bạn muốn xem một trường hợp sử dụng tốt, hãy xem bài viết trên blog của tôi:

Ẩn một cột bảng và tô màu các hàng dựa trên giá trị với jQuery .


1
Như một bên như họ không có trong ví dụ, không có vấn đề gì mà điều này bỏ qua colspans? Tốt nếu bạn không sử dụng chúng mặc dù. Có một câu hỏi khác liên quan: stackoverflow.com/questions/1166452/ Mạnh
Kim R

2
Tôi đã phải thêm tbody vào bộ chọn để tránh ẩn chân trang với máy nhắn tin: $ ('. Webgrid tbody td: nth-child (1), .webgrid th: nth-child (1)'). Hide ();
Alex

@KimR Điều này có thể giúp cho các vấn đề colspan stackoverflow.com/questions/9623601/iêu
yunzen

Tôi không biết chính xác tại sao, nhưng tôi phải sử dụng 'loại thứ n' thay vào đó, để làm cho nó hoạt động. Ví dụ: $ ('bảng td: nth-of-type (2)'). Hide ();
Leopoldo Sanchot

@LeopoldoSanc Hot bạn đã sử dụng Safari? Có vẻ như nó cần loại thứ n
ykay nói Phục hồi lại

12

bạn có thể sử dụng colgroups:

<table>
    <colgroup>
       <col class="visible_class"/>
       <col class="visible_class"/>
       <col class="invisible_class"/>  
    </colgroup>
    <thead>
        <tr><th class="col1">Header 1</th><th class="col2">Header 2</th><th class="col3">Header 3</th></tr>
    </thead>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

kịch bản của bạn sau đó có thể thay đổi chỉ là <col>lớp mong muốn .


Tôi dường như nhớ colgroup không có hỗ trợ trình duyệt chéo là điều đó không còn đúng nữa?
Brian Fisher

Có lẽ. Tôi đang sử dụng phương pháp này cho các cột hilight, (firefox, safari, chrome hoạt động tốt) chưa bao giờ thử nó trong IE.
Luis Melgratti

@Brian - IE8 không hoạt động và IE8 với IE7 được bật dường như đang hoạt động.
Nordes

4
Điều này dường như không hoạt động nữa trong trình duyệt hiện đại (Chrome và Firefox)
JBE

@JBE: chính xác là, hoạt động trong các trình duyệt hiện đại ở một mức độ nào đó . Sử dụng $('table > colgroup > col.yourClassHere')bộ chọn jQuery, bạn vẫn có thể đặt smth như màu nền của toàn bộ cột, nhưng bạn không còn có thể chuyển đổi mức độ hiển thị của cột. Các trình duyệt được thử nghiệm là MSIE 11 , Safari 5 , Chromium 44 , Opera 12 , Mozilla SeaMonkey 2.40 , Mozilla Firefox 43 . "Hầu hết các thuộc tính trong HTML 4.01 không được hỗ trợ trong HTML5" - xem tại đây .
Bass

11

Sau đây nên làm điều đó:

$("input[type='checkbox']").click(function() {
    var index = $(this).attr('name').substr(2);
    $('table tr').each(function() { 
        $('td:eq(' + index + ')',this).toggle();
    });
});

Đây là mã chưa được kiểm tra, nhưng nguyên tắc là bạn chọn ô bảng trong mỗi hàng tương ứng với chỉ mục đã chọn được trích xuất từ ​​tên hộp kiểm. Tất nhiên bạn có thể giới hạn các bộ chọn với một lớp hoặc ID.


11

Đây là một câu trả lời đầy đủ tính năng hơn cung cấp một số tương tác người dùng trên cơ sở mỗi cột. Nếu đây sẽ là một trải nghiệm động, cần phải có một nút chuyển đổi có thể nhấp trên mỗi cột cho biết khả năng ẩn cột và sau đó là cách khôi phục các cột bị ẩn trước đó.

Điều đó sẽ trông giống như thế này trong JavaScript:

$('.hide-column').click(function(e){
  var $btn = $(this);
  var $cell = $btn.closest('th,td')
  var $table = $btn.closest('table')

  // get cell location - https://stackoverflow.com/a/4999018/1366033
  var cellIndex = $cell[0].cellIndex + 1;

  $table.find(".show-column-footer").show()
  $table.find("tbody tr, thead tr")
        .children(":nth-child("+cellIndex+")")
        .hide()
})

$(".show-column-footer").click(function(e) {
    var $table = $(this).closest('table')
    $table.find(".show-column-footer").hide()
    $table.find("th, td").show()

})

Để hỗ trợ điều này, chúng tôi sẽ thêm một số đánh dấu vào bảng. Trong mỗi tiêu đề cột, chúng ta có thể thêm một cái gì đó như thế này để cung cấp một chỉ báo trực quan về thứ gì đó có thể nhấp

<button class="pull-right btn btn-default btn-condensed hide-column" 
            data-toggle="tooltip" data-placement="bottom" title="Hide Column">
    <i class="fa fa-eye-slash"></i>  
</button>

Chúng tôi sẽ cho phép người dùng khôi phục các cột thông qua một liên kết trong phần chân trang. Nếu nó không liên tục theo mặc định, thì việc bật nó một cách linh hoạt trong tiêu đề có thể chen lấn quanh bàn, nhưng bạn thực sự có thể đặt nó ở bất cứ đâu bạn muốn:

<tfoot class="show-column-footer">
   <tr>
    <th colspan="4"><a class="show-column" href="#">Some columns hidden - click to show all</a></th>
  </tr>
</tfoot>

Đó là chức năng cơ bản. Đây là một bản demo dưới đây với một vài điều nữa. Bạn cũng có thể thêm một chú giải công cụ vào nút để giúp làm rõ mục đích của nó, định kiểu nút một cách hữu cơ hơn với tiêu đề bảng và thu gọn chiều rộng cột để thêm một số hình ảnh động css (hơi khó hiểu) để làm cho quá trình chuyển đổi ít hơn một chút tăng vọt.

Bản thử nghiệm giới thiệu

Trình diễn hoạt động trong đoạn trích jsFiddle & Stack:


Bạn đang ẩn 1 cột gần nhất, làm thế nào để ẩn 3 cột gần nhất?
Nirmal Goswami

kiểm tra bảng của tôi - i.stack.imgur.com/AA8iZ.png và câu hỏi có chứa bảng html - stackoverflow.com/questions/50838119/ Nút sẽ đến sau A, B và C
Nirmal Goswami

xin lỗi để làm sống lại một câu trả lời cũ như vậy, nhưng có một cách dễ dàng để đặt các cột nhất định thành ẩn theo mặc định? Tôi đang cố gắng làm điều đó $(document).readynhưng không có may mắn
RobotJohnny 22/11/18

1
@RobotJohnny, câu hỏi hay. Điều này đang sử dụng lớp .hide-colđể loại bỏ các cột, nhưng nó cũng có thể được sử dụng để biểu thị trạng thái, vì vậy bạn có thể - thêm .hide-colvào từng cột tdtrkhi kết xuất html và được thực hiện. Hoặc nếu bạn muốn thêm nó ở ít nơi hơn, hãy đặt nó vào tiêu đề (trạng thái đó sẽ phải đi đâu đó) và trên init, hãy sử dụng nó để ẩn chỉ mục cột đó trên trẻ em. Hiện tại, mã chỉ lắng nghe vị trí nhấp chuột, nhưng nó có thể được sửa đổi để tìm vị trí lớp. Ngoài ra, ngày gà tây hạnh phúc
KyleMit

1
@RobotJohnny, tôi cũng đã cập nhật mẫu mã để bao gồm cả xử lý khởi tạo. Chỉ cần thả class='hide-col'bất cứ nơi nào bạn muốn vào html của bạn (có thể thead > tr > ththeo nghĩa hợp lý nhất và nó sẽ chọn để đảm bảo nó ẩn tất cả các ô trong cột đó và tự động hiển thị chân trang khôi phục
KyleMit 23/11/18

4

Và tất nhiên, cách duy nhất CSS cho các trình duyệt hỗ trợ nth-child :

table td:nth-child(2) { display: none; }

Đây là cho IE9 và mới hơn.

Đối với usecase của bạn, bạn cần một vài lớp để ẩn các cột:

.hideCol1 td:nth-child(1) { display: none;}
.hideCol2 td:nth-child(2) { display: none;}

Vân vân...


2

Sau đây là xây dựng mã của Eran, với một vài thay đổi nhỏ. Đã thử nghiệm và nó dường như hoạt động tốt trên Firefox 3, IE7.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<script>
$(document).ready(function() {
    $('input[type="checkbox"]').click(function() {
        var index = $(this).attr('name').substr(3);
        index--;
        $('table tr').each(function() { 
            $('td:eq(' + index + ')',this).toggle();
        });
        $('th.' + $(this).attr('name')).toggle();
    });
});
</script>
<body>
<table>
<thead>
    <tr>
        <th class="col1">Header 1</th>
        <th class="col2">Header 2</th>
        <th class="col3">Header 3</th>
    </tr>
</thead>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

<form>
    <input type="checkbox" name="col1" checked="checked" /> Hide/Show Column 1 <br />
    <input type="checkbox" name="col2" checked="checked" /> Hide/Show Column 2 <br />
    <input type="checkbox" name="col3" checked="checked" /> Hide/Show Column 3 <br />
</form>
</body>
</html>

1
<p><input type="checkbox" name="ch1" checked="checked" /> First Name</p>
.... 
<td class="ch1">...</td>

 <script>
       $(document).ready(function() {
            $('#demo').multiselect();
        });


        $("input:checkbox:not(:checked)").each(function() {
    var column = "table ." + $(this).attr("name");
    $(column).hide();
});

$("input:checkbox").click(function(){
    var column = "table ." + $(this).attr("name");
    $(column).toggle();
});
 </script>

0

Không có lớp học? Bạn có thể sử dụng Thẻ sau đó:

var tds = document.getElementsByTagName('TD'),i;
for (i in tds) {
  tds[i].style.display = 'none';
}

Và để hiển thị chúng sử dụng:

...style.display = 'table-cell';            
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.