我在HTML表格中遇到了缩放问题,同时在JavaScript中进行操作。
我有一个JavaScript代码blob,它可以动态地从JSON数组创建一个表。 它修复了标题并允许表体滚动,效果很好。
标题是一个单独的表格,我强烈控制单元格宽度,以确保标题表格的单元格与正文表格单元格匹配。
正文表格单元格的宽度都是明确设置的 我迭代表中的行,然后在该循环中对单元格进行交互,并设置每个单元格的宽度。
这个迭代没有扩展,因为行增长到100并且列变为40奇数,我得到Firefox的抱怨,脚本挂起或没有响应。它没有响应,因为它正在忙于设置所有单元格宽度。
nz.dynatable.setTableColumnWidths = function (table, arrayColumnWidths) {
// Iterate the table and set width settings for each cell
for (var i = 0; i < table.rows.length; ++i) {
for (var j = 0; j < table.rows[i].cells.length; ++j) {
var width = arrayColumnWidths[j] || 0;
table.rows[i].cells[j].style.width = width.toString() + "px";
}
}
}
问:是否可以在一行中为表格设置单元格宽度,并使表格中的所有其他单元格与此一致? Firefox是否因为更改单元格宽度而导致重新计算每个循环的表大小?
完整代码块位于公共GitHub仓库中:https://github.com/Hiblet/DynaTable
答案 0 :(得分:0)
试试这个:我遇到了同样的问题,这对我很有帮助:
let tables = document.getElementsByClassName("table");
if(tables.length == 2){
let firstTableCol = tables[0].querySelectorAll('colgroup col');
let secondTableCol = tables[1].querySelectorAll('tr')[0].querySelectorAll('td');
if(firstTableCol.length == secondTableCol.length){
for(let index = 0; index < firstTableCol.length; index++){
firstTableCol[index].style.width = secondTableCol[index].offsetWidth + "px";
}
}else
console.log('cols count mismatch');
}else
console.log('count of tables are bigger than 2');
答案 1 :(得分:0)
我尝试了几种方法来修饰这只猫,这是我的发现。最终的解决方案最终变得非常干净和高效,我在Chrome上测试的警告,而不是其他浏览器,以及中等大,但不是很大的表。总结一下,使用css如下来将第5列设置为宽度70,并使用javascript修改该css:
table#my_table th:nth-child(5), table#my_table td:nth-child(5){ max-width:70px; min-width:70px;}
更多详情:
您需要同时设置min-width和max-width,以避免为了保持表格大小不变而不尝试重新调整大小的列来
你可以使用element.style.xxxWidth来做到这一点,但OP中的一个简单方法不能很好地扩展,如OP所说。
但是,任何涉及对element.style.xxxWidth的直接更改的内容都会感到混乱,尤其是在必须添加代码以仅更新可查看元素之后。此外,尽管这种变化的表现要好得多,但它似乎仍然不是最佳的。所以我最终使用的最终解决方案是执行以下操作(让我们称之为“动态样式表方法”):
通过为每列创建新样式(document.createElement('style')
)来初始化表。包含一个规则的样式,该规则仅为具有该ID的表选择该列,例如对于id为“my_table”的表,第5列(cellIndex 4),将宽度设置为70:
table#my_table th:nth-child(5), table#my_table td:nth-child(5){ max-width:70px; min-width:70px;}
将新创建的styleElements添加到table元素(而不是文档)中,这样如果从DOM中删除表,这些额外的样式也会消失
总的来说,在我看来,使用动态样式表方法是赢家,原因如下: