Hide/show Column
Solution 1:
Alright so first of all, since table is constructed as rows with cells, in order to select the whole column you need to use :nth-of-type
selector on all of the rows together to select their cells individually.
$('table td:nth-of-type(1),table th:nth-of-type(1)');
note that we select both <td>
and <th>
to select the header as well.
now, if you only need a hide functionality, you can indeed add a button to every column for hiding purpose:
$(function () {
$('table th').each(function () {
$('<button>Hide</button>').appendTo($(this)).click(function () {
var column_index = $(this).parent().index()+1;
$('table td:nth-of-type('+column_index+'),table th:nth-of-type('+column_index+')').hide();
});
});
});
if however, ou need the ability to show the columns again, you need to place the buttons separately or they will disappear together with the columns.
you can for example, put a text box where you would specify the index of the column to hide/show as follows:
add to html:
<input id="col_hide" placeholder="insert col index 1+"></input>
<input type="submit"id="bt_hide" value="hide/show" />
js:
$(function () {
$('#bt_hide').click(function () {
var column_index = $('#col_hide').val();
$('table td:nth-of-type(' + column_index + '),table th:nth-of-type(' + column_index + ')').toggle();
});
});
or if you want your table to be more user-friendly, you can create a button per column outside of the table:
js:
$(function () {
$('table th').each(function (_id, _value) {
$('<button>Toggle ' + parseInt(_id + 1) + '</button>').appendTo($("#togglers")).click(function (e) {
$('table td:nth-of-type(' + parseInt(_id + 1) + '),table th:nth-of-type(' + parseInt(_id + 1) + ')').toggle();
e.preventDefault();
});
});
});
Solution 2:
You can achieve this using Data table,
http://datatables.net/examples/api/show_hide.html
Here is a javacript code
$(document).ready(function() {
var table = $('#example').DataTable( {
"scrollY": "200px",
"paging": false
} );
$('a.toggle-vis').on( 'click', function (e) {
e.preventDefault();
// Get the column API objectvar column = table.column( $(this).attr('data-column') );
// Toggle the visibility
column.visible( ! column.visible() );
} );
} );
Solution 3:
Thanks to @Banana!
This is the code I use:
<scriptsrc="http://code.jquery.com/jquery.min.js"></script><scripttype="text/javascript">
$(function () {
$('table th').each(function (_id, _value) {
if(_id > 2){
$('<span>'+$(this).find("a").text()+'</span>').appendTo ($("#togglers")).click(function (e) {
$('table td:nth-of-type(' + parseInt(_id + 1) + '),table th:nth-of-type(' + parseInt(_id + 1) + ')').toggle();
e.preventDefault();
});
}
});
});
</script><divid="togglers"></div>
I use _id > 2 because I don't need to filter on first three columns.
Solution 4:
Good question. Handling table columns is pretty hard with jQuery.
If you can't use classes, you'll need to use CSS3 advanced selectors or jQuery selectors.
Like this :
$(document).ready(function(){
$('table td, table th').addClass('visible'); // visible as default
$('table').append('<tr class="last-row" />').each(function(){ // add the last row with switch buttons
$('table tr:first-child th').each(function(){
$('.last-row').append('<td class="stay-visible"><button class="show-hide-btn">Hide</button></td>');
});
});
// Then manage the buttons
$(document).on('click', '.show-hide-btn', function(){
var parentIndex = $(this).parent().index()+1;
var $currentColumn = $('table td:nth-child('+parentIndex+'), table th:nth-child('+parentIndex+')');
if($currentColumn.hasClass('visible')){
$(this).text('Show');
}
else {
$(this).text('Hide');
}
$currentColumn.each(function(){
$(this).toggleClass('visible')
});
});
});
UPDATED :
Working example : http://jsfiddle.net/H9Zb7/1/
Post a Comment for "Hide/show Column"