Скрытие столбцов в таблице JavaScript
Итак, здесь я отправляю свой сценарий, который у меня есть где-то в Интернете, теперь моя проблема заключается в том, что этот скрипт перестает работать в тот момент, когда я добавляю таблицу внутри таблицы, и как ее заставить работать? Мне не нужны какие-либо решения 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ü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>
Ответы
Ответ 1
Если вы можете использовать тег 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ü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";
}
}
Рекомендации:
Ответ 2
Вы можете использовать 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;
Ответ 3
У меня была ситуация, когда было бы очень большой проблемой изменить каждое значение 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", поэтому они будут невидимыми (повторное выполнение функции снова сделает их видимыми).