[英]How to set HTML Table column widths explicitly in JavaScript
我在使用 JavaScript 操作時遇到了 HTML 表格的縮放問題。
我有一個 JavaScript 代碼塊,可以從 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
試試這個:我有同樣的問題,這對我有幫助:
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');
我嘗試了幾種方法給這只貓剝皮,這是我的發現。 最終的解決方案最終變得非常干凈和高效,並帶有我在 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 添加到表格元素(而不是文檔),這樣如果表格從 DOM 中刪除,這些額外的樣式也會消失
總的來說,在我看來,使用動態樣式表方法是贏家,原因如下:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.