Скрытие столбцов в таблице JavaScript - PullRequest
13 голосов
/ 13 октября 2011

Этот скрипт перестает работать, как только я добавляю таблицу в таблицу, так как это сделать? Мне не нужны решения jQuery, я хочу чистый JavaScript. Вот мой скрипт , найденный в интернете:

<script>

  function show_hide_column(col_no, do_show) {

    var stl;
    if (do_show) stl = 'block'
    else         stl = 'none';

    var tbl  = document.getElementById('id_of_table');
    var rows = tbl.getElementsByTagName('tr');

    for (var row=1; row<rows.length;row++) {
      var cels = rows[row].getElementsByTagName('td')
      cels[col_no].style.display=stl;
    }
  }

</script>

Вот мой HTML :

<table id='id_of_table' border=1>
  <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&uuml;nf</td></tr>
  <tr><td>  6</td><td>   six</td><td>    six</td><td>    sechs</td></tr>
</table>

А вот и моя Форма :

<form>
  Enter column no: <input type='text' name=col_no><br>
  <input type='button' onClick='javascript:show_hide_column(col_no.value,  true);' value='show'>
  <input type='button' onClick='javascript:show_hide_column(col_no.value, false);' value='hide'>
</form>

Ответы [ 3 ]

23 голосов
/ 13 октября 2011

Если вы можете использовать тег col, решение в чистом javascript будет простым:

<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&uuml;nf</td></tr>
  <tr><td>  6</td><td>   six</td><td>    six</td><td>    sechs</td></tr>
</table>

Вы можете применить к col только пару атрибутов css, но видимость - один из них

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";
   }
}

Рекомендации:

9 голосов
/ 13 октября 2011

Вы можете использовать children и проверить их tagName, чтобы убедиться, что они td.Примерно так:

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';
        }
    }
}

Редактировать : Вот рабочий пример: http://jsfiddle.net/3DjhL/2/.

Редактировать : На самом деле, я простовспомнил свойства rows и cols, которые делают его еще проще.См. http://jsfiddle.net/3DjhL/4/, чтобы увидеть его в действии.

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';
        }
    }
}

О, и если вы думаете, что номера столбцов должны начинаться с 1 (а они нет), вам придется сместить этогде-то.Например, в верхней части show_hide_column():

col_no = col_no - 1;
1 голос
/ 07 мая 2013

У меня была ситуация, когда было бы очень сложно изменить каждое значение TD и добавить соответствующее имя класса, чтобы я мог его переключать.В результате я написал немного JavaScript, чтобы сделать это автоматически.Пожалуйста, смотрите следующий код.

  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'; 
   }
}

В моем примере я смотрю на первый ряд, чтобы установить заголовок верхнего уровня (в моем примере у меня было несколько человек, у которых был colspans).Он использует offsetLeft и offsetWidth, чтобы определить диапазон верхнего заголовка (который в моих случаях имеет подзаголовки), так что все вложенные столбцы будут переключаться с его родителем.

На основе этих значений setClasses устанавливает соответствующие классы для всех элементов.

В моем примере я затем переключаю "col0" и "col1", чтобы они были невидимы (снова запустив функциюсделает их снова видимыми).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...