2011-11-15 29 views
6

Tôi muốn lấy toàn bộ cột của tiêu đề bảng.Làm cách nào để có được cột bảng tương ứng (td) từ tiêu đề bảng (th)?

Ví dụ: tôi muốn chọn tiêu đề bảng "Địa chỉ" để ẩn cột địa chỉ và chọn tiêu đề "Điện thoại" để hiển thị cột tương ứng.

<table> 
<thead> 
    <tr> 
     <th id="name">Name</th> 
     <th id="address">Address</th> 
     <th id="address" class='hidden'>Address</th> 
    </tr> 
</thead> 
<tbody> 
    <tr> 
     <td>Freddy</td> 
     <td>Nightmare Street</td> 
     <td class='hidden'>123</td> 
    </tr> 
    <tr> 
     <td>Luis</td> 
     <td>Lost Street</td> 
     <td class='hidden'>3456</td> 
    </tr> 
</tbody> 

tôi muốn làm một cái gì đó giống như http://www.google.com/finance?q=apl (xem bảng các công ty liên quan) (nhấp vào liên kết "thêm hoặc xoá cột")

+2

không phải là chủ đề này: http://stackoverflow.com/questions/2132034/jquery-select-column về cùng một vấn đề? – JMax

+0

Tôi lấy cột thứ 3 là cột "Điện thoại"? – Patricia

+0

Để tô màu/tô bóng cho một cột thay vì thêm/xóa nó: http://stackoverflow.com/questions/15651408/how-can-apply-some-jquery-stuff-only-based-on-header-row –

Trả lời

0

Cách đơn giản nhất để làm điều này sẽ để thêm một lớp vào từng td phù hợp với lớp của tiêu đề. Khi bạn nhấp vào, nó sẽ kiểm tra lớp, sau đó ẩn mọi td với lớp đó. Vì chỉ có s trong cột đó sẽ ẩn lớp đó, nó sẽ ẩn cột một cách hiệu quả.

<table> 
    <thead> 
    <th>Name</th> 
    <th>Address</th> 
    </thead> 
    <tbody> 
    <tr> 
     <td class="Name">Joe</td> 
     <td class="Address">123 Main St. 
    </tbody> 
</table> 

Và kịch bản gì đó như:

$('th').click(function() { 
    var col = $(this).html(); // Get the content of the <th> 
    $('.'+col).hide(); // Hide everything with a class that matches the col value. 
}); 

Something như thế, dù sao. Đó có lẽ là tiết tấu hơn là cần thiết, nhưng nó phải chứng minh nguyên tắc.

Một cách khác sẽ chỉ đơn giản là đếm số lượng cột vượt quá câu hỏi được đề cập, sau đó lặp qua từng hàng và ẩn td cũng có nhiều cột hơn. Ví dụ, nếu bạn muốn ẩn cột Address và nó là cột # 3 (chỉ số 2), thì bạn sẽ lặp qua từng hàng và ẩn thứ ba (chỉ số 2).

Chúc may mắn ..

+0

Uh, làm thế nào bạn sẽ đi về toggling tầm nhìn của cột 'n' lần thay vì chỉ ẩn nó? .. –

+0

jQuery có một .toggle() chức năng, có thể được sử dụng thay vì hide(). Tôi đã chứng minh làm thế nào để ẩn một cột. Đưa nó trở lại không phải là khó khăn hơn nhiều và theo cùng một nguyên tắc cơ bản. – Jemaclus

+0

Ah .. Bạn biết không? Tôi đã giải thích sai mã của bạn (nghĩ rằng bạn cũng đang ẩn tiêu đề cột, điều này làm cho * không * ý nghĩa;)). Downvote loại bỏ :) –

-1
jQuery('thead td').click(function() { 

    var th_index = jQuery(this).index(); 

    jQuery('#my_table tbody tr').each(
     function(index) { 
      jQuery(this).children('td:eq(' + th_index + ');').each(
       function(index) { 
        // do stuff here 
       } 
      ); 
     } 
    ); 
}); 
2

Something như thế này sẽ làm việc -

$('th').click(function() { 
    var index = $(this).index()+1; 
    $('table td:nth-child(' + index + '),table th:nth-child(' + index + ')').hide() 
}); 

Đoạn mã trên sẽ ẩn cột liên quan nếu bạn nhấp vào tiêu đề, logic có thể được thay đổi cho phù hợp với yêu cầu của bạn mặc dù.

Demo - http://jsfiddle.net/LUDWQ/

-1

đây là một fiddle làm việc của hành vi này:

http://jsfiddle.net/tycRW/

tất nhiên, ẩn cột với ra ẩn tiêu đề cho nó sẽ có một số kết quả kỳ lạ.

1

Với một vài thay đổi đơn giản để HTML của bạn, tôi muốn làm một cái gì đó như sau (JS framework-less):

HTML:

<input class="chk" type="checkbox" checked="checked" data-index="0">Name</input> 
<input class="chk" type="checkbox" checked="checked" data-index="1">Address</input> 
<input class="chk" type="checkbox" checked="checked" data-index="2">Phone</input> 

<table id="tbl"> 
<thead> 
    <tr> 
     <th>Name</th> 
     <th>Address</th> 
     <th>Phone</th> 
    </tr> 
</thead> 
<tbody> 
    <tr> 
     <td>Freddy</td> 
     <td>Nightmare Street</td> 
     <td>123</td> 
    </tr> 
    <tr> 
     <td>Luis</td> 
     <td>Lost Street</td> 
     <td>3456</td> 
    </tr> 
</tbody> 

Javascript:

var cb = document.getElementsByClassName("chk"); 
var cbsz = cb.length; 

for(var n = 0; n < cbsz ; ++n) { 
    cb[n].onclick = function(e) { 
     var idx = e.target.getAttribute("data-index"); 
     toggleColumn(idx); 
    } 
} 

function toggleColumn(idx) { 
    var tbl = document.getElementById("tbl"); 
    var rows = tbl.getElementsByTagName("tr"); 
    var sz = rows.length; 

    for(var n = 0; n < sz; ++n) { 
     var el = n == 0 ? rows[n].getElementsByTagName("th")[idx] : rows[n].getElementsByTagName("td")[idx]; 
     el.style.display = el.style.display === "none" ? "table-cell" : "none"; 
    } 
} 

http://jsfiddle.net/dbrecht/YqUNz/1/

Tôi đã thêm các hộp kiểm vì nó không có ý nghĩa để ràng buộc nhấp chuột vào tiêu đề cột vì bạn sẽ không thể chuyển đổi chế độ hiển thị, chỉ ẩn chúng.

+0

Sẽ * yêu * để nghe giải thích cho downvote ... –

+1

Tôi đã không downvote bạn nhưng tôi đoán đó là vì câu trả lời của bạn là nặng, và bởi vì câu hỏi này được gắn thẻ jquery nhưng bạn trả lời với nặng hơn nhiều JS đơn giản. Ví dụ, vấn đề kinh tế 'bảng tế bào' được đóng gói độc đáo bởi $(). Hide(). Tuy nhiên câu trả lời của bạn là hoàn chỉnh nhất. –

0

Bạn có thể làm điều gì đó với CSS, như:

<html> 
<head> 
    <style> 
     .c1 .c1, .c2 .c2, .c3 .c3{ 
      display:none; 
     } 
    </style> 
</head> 
<body> 
<table class="c2 c3"> 
    <thead> 
     <tr> 
      <th id="name" class="c1">Name</th> 
      <th id="address" class="c2">Address</th> 
      <th id="phone" class="c3">Phone</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td class="c1">Freddy</td> 
      <td class="c2">Nightmare Street</td> 
      <td class="c3">123</td> 
     </tr> 
     <tr> 
      <td class="c1">Luis</td> 
      <td class="c2">Lost Street</td> 
      <td class="c3">3456</td> 
     </tr> 
    </tbody> 
</table> 
</body> 
</html> 

Để ẩn một cột, bạn thêm với Javascript lớp tương ứng vào bảng. Ở đây c2 và c3 bị ẩn.

Bạn có thể thêm động .c1, .c2, ... vào thẻ kiểu hoặc xác định số lượng tối đa.

0

Mô phỏng Google Finance cột show/hide chức năng:

http://jsfiddle.net/b9chris/HvA4s/

$('#edit').click(function() { 
    var headers = $('#table th').map(function() { 
     var th = $(this); 
     return { 
      text: th.text(), 
      shown: th.css('display') != 'none' 
     }; 
    }); 

    var h = ['<div id=tableEditor><button id=done>Done</button><table><thead><tr>']; 
    $.each(headers, function() { 
     h.push('<th><input type=checkbox', 
       (this.shown ? ' checked ' : ' '), 
       '/> ', 
       this.text, 
       '</th>'); 
    }); 
    h.push('</tr></thead></table></div>'); 
    $('body').append(h.join('')); 

    $('#done').click(function() { 
     var showHeaders = $('#tableEditor input').map(function() { return this.checked; }); 
     $.each(showHeaders, function(i, show) { 
      var cssIndex = i + 1; 
      var tags = $('#table th:nth-child(' + cssIndex + '), #table td:nth-child(' + cssIndex + ')'); 
      if (show) 
       tags.show(); 
      else 
       tags.hide(); 
     }); 

     $('#tableEditor').remove(); 
     return false; 
    }); 

    return false; 
}); 
Các vấn đề liên quan