js实现可变列
实现可变列的方法
动态添加列
使用JavaScript动态创建表格列可以通过操作DOM实现。以下是一个示例代码片段,展示如何向表格添加新列:
function addColumn(tableId) {
const table = document.getElementById(tableId);
const rows = table.getElementsByTagName('tr');
for (let i = 0; i < rows.length; i++) {
const newCell = rows[i].insertCell(-1);
newCell.innerHTML = `Column ${i+1}`;
}
}
动态删除列
要删除特定列,需要遍历表格的所有行并移除指定位置的单元格:
function deleteColumn(tableId, columnIndex) {
const table = document.getElementById(tableId);
const rows = table.getElementsByTagName('tr');
for (let i = 0; i < rows.length; i++) {
rows[i].deleteCell(columnIndex);
}
}
使用数据绑定框架
现代前端框架如React、Vue或Angular可以更高效地处理可变列。以下是React示例:
function DynamicTable({ columns, data }) {
return (
<table>
<thead>
<tr>
{columns.map((col, index) => (
<th key={index}>{col.header}</th>
))}
</tr>
</thead>
<tbody>
{data.map((row, rowIndex) => (
<tr key={rowIndex}>
{columns.map((col, colIndex) => (
<td key={colIndex}>{row[col.accessor]}</td>
))}
</tr>
))}
</tbody>
</table>
);
}
响应式列调整
结合CSS和JavaScript可以实现响应式列布局。使用媒体查询和动态类名切换:
function adjustColumns() {
const table = document.getElementById('responsiveTable');
const width = window.innerWidth;
if (width < 768) {
table.classList.add('mobile-view');
} else {
table.classList.remove('mobile-view');
}
}
虚拟滚动优化
对于大量数据的可变列,实现虚拟滚动可以提高性能:
function setupVirtualScroll(tableId, rowHeight, visibleRows) {
const table = document.getElementById(tableId);
const tbody = table.querySelector('tbody');
tbody.style.height = `${rowHeight * visibleRows}px`;
window.addEventListener('scroll', () => {
const scrollTop = window.pageYOffset;
const startRow = Math.floor(scrollTop / rowHeight);
const endRow = startRow + visibleRows;
// 更新可见行数据
});
}
列拖拽排序
实现可拖拽调整列顺序的功能:

function makeColumnsDraggable(tableId) {
const table = document.getElementById(tableId);
const headers = table.querySelectorAll('th');
headers.forEach(header => {
header.setAttribute('draggable', true);
header.addEventListener('dragstart', e => {
e.dataTransfer.setData('text/plain', header.cellIndex);
});
header.addEventListener('dragover', e => e.preventDefault());
header.addEventListener('drop', e => {
e.preventDefault();
const fromIndex = e.dataTransfer.getData('text/plain');
const toIndex = header.cellIndex;
if (fromIndex !== toIndex) {
swapColumns(table, fromIndex, toIndex);
}
});
});
}






