Hiding columns in table JavaScript

后端 未结 3 1620
离开以前
离开以前 2020-12-10 12:01

This script stops working the moment I add a table inside a table, so how to get it worked? I don\'t need any jQuery solutions, I want pure JavaScript. Here\'s my sc

相关标签:
3条回答
  • 2020-12-10 12:15

    You could use children and check their tagName to make sure they're td's. Something like this:

    function show_hide_column(col_no, do_show) {
        var tbl = document.getElementById('id_of_table');
        var rows = tbl.getElementsByTagName('tr');
    
        for (var row = 0; row < rows.length; row++) {
            var cols = rows[row].children;
            if (col_no >= 0 && col_no < cols.length) {
                var cell = cols[col_no];
                if (cell.tagName == 'TD') cell.style.display = do_show ? 'block' : 'none';
            }
        }
    }
    

    Edit: Here's a working example: http://jsfiddle.net/3DjhL/2/.

    Edit: In fact, I've just remembered the rows and cols properties, which make it even simpler. See http://jsfiddle.net/3DjhL/4/ to see it in action.

    function show_hide_column(col_no, do_show) {
        var rows = document.getElementById('id_of_table').rows;
    
        for (var row = 0; row < rows.length; row++) {
            var cols = rows[row].cells;
            if (col_no >= 0 && col_no < cols.length) {
                cols[col_no].style.display = do_show ? '' : 'none';
            }
        }
    }
    

    Oh, and if you think the column numbers should start at 1 (which they don't), you'll have to offset that somewhere. For example at the top of show_hide_column():

    col_no = col_no - 1;
    
    0 讨论(0)
  • 2020-12-10 12:27

    If you can leverage the col tag the solution, in pure JavaScript, is straightforward:

    <table id='id_of_table' border=1>
      <col class="col1"/>
      <col class="col2"/>
      <col class="col3"/>
      <col class="col4"/>
      <tr><td colspan="4"><table><tr><td></td></tr></table></td></tr>
      <tr><td>  2</td><td>   two</td><td>   deux</td><td>     zwei</td></tr>
      <tr><td>  3</td><td> three</td><td>  trois</td><td>     drei</td></tr>
      <tr><td>  4</td><td>  four</td><td>quattre</td><td>     vier</td></tr>
      <tr><td>  5</td><td>  five</td><td>   cinq</td><td>fÜnf</td></tr>
      <tr><td>  6</td><td>   six</td><td>    six</td><td>    sechs</td></tr>
    </table>
    

    You can apply to col just a couple of CSS attributes, but visibility is one of them:

    function show_hide_column(col_no, do_show) {
       var tbl = document.getElementById('id_of_table');
       var col = tbl.getElementsByTagName('col')[col_no];
       if (col) {
         col.style.visibility=do_show?"":"collapse";
       }
    }
    

    References:

    • col
    • visibility on quirksmode
    0 讨论(0)
  • 2020-12-10 12:39

    I had a situation where it would have been a very big hassle to modify every single TD value and add the appropriate class name so I could toggle it. As a result I wrote some JavaScript to do that automatically. Please see the following code.

      tbl = document.getElementById("Mytable")
      classes = getClasses(tbl.rows[0]);
      setClasses(tbl, classes);
      toggleCol("col0");
      toggleCol("col1");
    
    
    
    function getClasses(row){
        var cn = 0;
        var classes = new Array();
        for(x=0; x < row.cells.length; x++){
            var cell = row.cells[x];
            var c = new Column(cell.textContent.trim(), cell.offsetLeft, cell.offsetLeft + cell.offsetWidth, x);
            classes[x]= c;
        }
        return classes;
    }
    
    function Column(name, left, right, cols) {
        this.name = name;
        this.left = left;
        this.right = right;
        this.cols = cols;
    }
    
    function setClasses(table, classes){
        var rowSpans = new Array();
        for(x=0; x < table.rows.length; x++){
            var row = table.rows[x]; 
            for(y=0; y < row.cells.length; y++){
                var cell = row.cells[y];
                for(z=0; z < classes.length; z++){
                  if(cell.offsetLeft >= classes[z].left && cell.offsetLeft <= classes[z].right){
                    cell.className = "col" + classes[z].cols;
                  }
                }
            }    
        }
    }
    
    function toggleCol(name){ 
      var cols = document.getElementsByClassName(name); 
      for(x=0; x < cols.length; x++){ 
        cols[x].style.display= (cols[x].style.display == 'none') ? '' : 'none'; 
       }
    }
    

    In my example I take a look at the first row to set the top level header (In my example I had several who had colspans). It uses the offsetLeft and offsetWidth to determine the range of the top header (which in my cases has sub headers), so that all sub-columns would toggle with its parent.

    Based on these values setClasses sets the appropriate classes to all the elements.

    In my example I then toggle "col0" and "col1", so they would be invisible (Running the function again would make them visible again).

    0 讨论(0)
提交回复
热议问题