欢迎讨论
/** * table单元格合并 * 合并规则:要合并的多个td name属性相同,且呈方形连续分布 * @param {string} tableId */ function combineTable(tableId) { var oTbl = document.getElementById(tableId); var allTds = oTbl.getElementsByTagName("td"); if(allTds.length < 1) { return; } //step 1:查找需要合并的td,规则:相同name出现超过两次的td,就是需要合并的 var map = new Object(); for(var i = 0; i < allTds.length; i++) { var tmpTdName = allTds[i].getAttribute("name"); if(tmpTdName) { map[tmpTdName] = !map[tmpTdName] ? 1 : Number(map[tmpTdName]) + 1; } } var tdNames = new Array(); for(var i in map) { if(Number(map[i]) > 1) { tdNames.push(i); } } //step2 combine tds //解决IE下面getElementsByName无效问题 var commonGetElementsByName = function(parentDom, tagName, name) { var result = new Array(); var doms = parentDom.getElementsByTagName(tagName); for (var i = 0; i < doms.length; i++) { if (doms[i].getAttribute("name") == name) { result.push(doms[i]); } } return result; }; var tdsToDelete = new Array(); for (var i = 0; i < tdNames.length; i++) { var tdsToCombine = commonGetElementsByName(oTbl, "td", tdNames[i]); var tdFirst = tdsToCombine[0]; var tdLast = tdsToCombine[tdsToCombine.length - 1]; var colspan = tdLast.cellIndex - tdFirst.cellIndex + 1; var rowspan = 1; for (var j = 0; j < tdsToCombine.length; j++) { var aTd = tdsToCombine[j]; //calculate rowspan if (j > 0 && tdsToCombine[j].parentNode != tdsToCombine[j - 1].parentNode) { rowspan++; } //暂存要删除的 if (aTd != tdFirst) { tdsToDelete.push(aTd); } } if(colspan > 1) { tdFirst.setAttribute("colspan", colspan); tdFirst.colSpan = colspan; } if(rowspan > 1) { tdFirst.setAttribute("rowspan", rowspan); tdFirst.rowSpan = rowspan; } } //delete at last for (var i = 0; i < tdsToDelete.length; i++) { tdsToDelete[i].parentNode.removeChild(tdsToDelete[i]); } }