<script language="JavaScript" type="text/JavaScript"> /*--------------------------------------------------------------------------- 表格、单元格操作类 功能: 合并单元格,拆分单元格,向上插入行,向下插入行,向左插入列, 向右插入列,删除行,删除列 设计思路: 将表格按总行与总列数进行网状分割,为每个座标网格找到对应的单元格, 这样,在操作过程中就可以随时找出每个单元格的位置及属性 适用IE5.0以上 -----------------------------------------------------------------------------*/ function LwgTable() { this.tdobj; this.trobj; this.tblobj; this.xy = new Array(); this.x; this.y; } function tmpObj(x, y, obj) { this.x = x; this.y = y; this.obj = obj; } LwgTable.prototype.getObj = function () { var tdobj = document.selection.createRange().parentElement(); if (!tdobj || tdobj.tagName != "TD") return false; var trobj = tdobj.parentElement; if (!trobj || trobj.tagName != "TR") return false; var tblobj = trobj.parentElement.parentElement; if (!tblobj || tblobj.tagName != "TABLE") return false; this.tdobj = tdobj; this.trobj = trobj; this.tblobj = tblobj; return true; } LwgTable.prototype.setxy = function () { for (var i = 0; i < this.tblobj.rows.length; i++) this.xy[i] = new Array(); for (var i = 0; i < this.tblobj.rows.length; i++) { var tmp_row = this.tblobj.rows[i]; var tmp_y = 0; for (var n = 0; n < tmp_row.cells.length; n++) { var tmp_cell = tmp_row.cells[n]; if (this.tdobj == tmp_cell) { this.x = i; tmp_y = this.y = this.findy(i, tmp_y); } for (var c = 0; c < tmp_cell.colSpan; c++) { for (var r = 0; r < tmp_cell.rowSpan; r++) { var tmp_ir = i + r; var tmp_y = this.findy(tmp_ir, tmp_y); if (c == 0 && r == 0) var tmp_obj = new tmpObj(i, tmp_y, tmp_cell); this.xy[tmp_ir][tmp_y] = tmp_obj; } } tmp_y++; } } } LwgTable.prototype.findy = function (x, y) { if (!this.xy[x][y]) return y; else return this.findy(x, y + 1); } LwgTable.prototype.mergeCell = function (what) { switch (what) { case "up": var tmp_obj = this.checkToMerge(-1, 0); if (!tmp_obj) return false; if (this.tdobj.innerHTML != "?") tmp_obj.obj.innerHTML += this.tdobj.innerHTML; tmp_obj.obj.rowSpan += this.dropCell(this.trobj.rowIndex, this.tdobj.cellIndex, 'r'); break; case "down": var tmp_obj = this.checkToMerge(this.tdobj.rowSpan, 0); if (!tmp_obj) return false; if (tmp_obj.obj.innerHTML != "?") this.tdobj.innerHTML += tmp_obj.obj.innerHTML; this.tdobj.rowSpan += this.dropCell(this.trobj.rowIndex + this.tdobj.rowSpan, tmp_obj.obj.cellIndex, 'r'); break; case "left": var tmp_obj = this.checkToMerge(0, -1); if (!tmp_obj) return false; if (this.tdobj.innerHTML != "?") tmp_obj.obj.innerHTML += this.tdobj.innerHTML; tmp_obj.obj.colSpan += this.dropCell(this.trobj.rowIndex, this.tdobj.cellIndex, 'c'); break; case "right": var tmp_obj = this.checkToMerge(0, this.tdobj.colSpan); if (!tmp_obj) return false; if (tmp_obj.obj.innerHTML != "?") this.tdobj.innerHTML += tmp_obj.obj.innerHTML; this.tdobj.colSpan += this.dropCell(this.trobj.rowIndex, this.tdobj.cellIndex + 1, 'c'); break; default: break; } } LwgTable.prototype.checkToMerge = function (x, y) { if (!this.xy[this.x + x]) return false; var tmp_obj = this.xy[this.x + x][this.y + y]; if (!tmp_obj) return false; if (x != 0) { if (tmp_obj.y != this.y || tmp_obj.obj.colSpan != this.tdobj.colSpan) return false; } else if (y != 0) { if (tmp_obj.x != this.x || tmp_obj.obj.rowSpan != this.tdobj.rowSpan) return false; } return tmp_obj; } LwgTable.prototype.dropCell = function (x, y, kind) { var trobj = this.tblobj.rows[x]; if (!trobj) return false; var rowspans = trobj.cells[y].rowSpan; var colspans = trobj.cells[y].colSpan; trobj.deleteCell(y); if (kind == "r") return rowspans; else if (kind == "c") return colspans; } LwgTable.prototype.changeRowspan = function (x, num) { var y = 0; while (y < this.xy[x].length) { var tmp = this.xy[x][y]; if (tmp.obj.rowSpan > 1) { tmp.obj.rowSpan += num; } y += tmp.obj.colSpan; } } LwgTable.prototype.insertRow = function (what, num) { var x = this.x; var x1 = (what == 'up') ? x : (x + 1); if (x1 == this.tblobj.rows.length) { for (var n = 0; n < num; n++) { var newRow = this.tblobj.insertRow(x1); var lastxy = this.xy[this.xy.length - 1]; var i = 0; while (i < lastxy.length) { var newCell = newRow.insertCell(); newCell.innerHTML = "?"; newCell.mergeAttributes(lastxy[i].obj); newCell.rowSpan = 1; i += lastxy[i].obj.colSpan; } } return true; } for (var n = 0; n < num; n++) { var trobj = this.tblobj.rows[x]; var newRow = this.tblobj.insertRow(x1); var delcell = new Array(); for (var i = 0; i < trobj.cells.length; i++) { if (trobj.cells[i].rowSpan == 1) { var newCell = newRow.insertCell(); newCell.innerHTML = "?"; newCell.mergeAttributes(trobj.cells[i]) } else if (what == 'up') { var newCell = newRow.insertCell(); trobj.cells[i].rowSpan += 1; newCell.innerHTML = trobj.cells[i].innerHTML; delcell[i] = 1; newCell.mergeAttributes(trobj.cells[i]) } } var deli = 0; for (i in delcell) { trobj.deleteCell(i - deli); deli++; } } this.changeRowspan(this.x, num); } LwgTable.prototype.deleteRow = function () { if (this.trobj.rowIndex == this.tblobj.rows.length - 1) { this.tblobj.deleteRow(this.trobj.rowIndex); return true; } var y = 0; while (y < this.xy[this.x].length) { var tmp_obj = this.xy[this.x][y].obj; if (tmp_obj.rowSpan > 1) { tmp_obj.rowSpan -= 1; if (tmp_obj.parentElement.rowIndex == this.x) { if (tmp_obj.cellIndex < this.trobj.cells.length - 1) var cellIndex = this.xy[this.x + 1][y + tmp_obj.colSpan].obj.cellIndex; else var cellIndex = this.tblobj.rows[this.x + 1].cells.length; newCell = this.tblobj.rows[this.x + 1].insertCell(cellIndex); newCell.replaceNode(tmp_obj); } } y += tmp_obj.colSpan; } this.tblobj.deleteRow(this.trobj.rowIndex); } LwgTable.prototype.deleteCol = function () { var x = 0; while (x < this.xy.length) { var tmp_obj = this.xy[x][this.y].obj; x += tmp_obj.rowSpan if (tmp_obj.colSpan == 1) { tmp_obj.parentElement.deleteCell(tmp_obj.cellIndex); } else tmp_obj.colSpan -= 1; } } LwgTable.prototype.insertCol = function (what, num) { var x = 0; while (x < this.xy.length) { var tmp_obj = this.xy[x][this.y].obj; x += tmp_obj.rowSpan if (tmp_obj.colSpan == 1) { var cellIndex = (what == "right") ? (tmp_obj.cellIndex + 1) : tmp_obj.cellIndex; for (var n = 0; n < num; n++) { var newCell = tmp_obj.parentElement.insertCell(cellIndex); newCell.innerHTML = "?"; newCell.mergeAttributes(tmp_obj) } } else tmp_obj.colSpan += num; } } LwgTable.prototype.rowSplit = function (num) { if (num < 2) return false; while (num > 1) { var y = 0; var tmp_x = this.x + this.tdobj.rowSpan - 1; var tmp_index = 0; while (y < this.xy[tmp_x].length) { vartmp_obj = this.xy[tmp_x][y] if (this.tdobj.rowSpan > 1) { if (tmp_obj.obj == this.tdobj) { var newCell = this.tblobj.rows[tmp_x].insertCell(tmp_index); newCell.innerHTML = "?"; newCell.mergeAttributes(this.tdobj); newCell.rowSpan = 1 } if (tmp_x == tmp_obj.x) tmp_index++; } else { if (tmp_obj.obj == this.tdobj) { var newRow = this.tblobj.insertRow(this.x + 1); var newCell = newRow.insertCell(0); newCell.innerHTML = "?"; } else tmp_obj.obj.rowSpan += 1; } y += tmp_obj.obj.colSpan; } if (this.tdobj.rowSpan > 1) this.tdobj.rowSpan -= 1; num -= 1; } } LwgTable.prototype.colSplit = function (num) { var x = 0; while (x < this.xy.length) { var tmp_obj = this.xy[x][this.y].obj; x += tmp_obj.rowSpan if (tmp_obj == this.tdobj) { for (var n = 0; n < num; n++) { var newCell = tmp_obj.parentElement.insertCell(this.tdobj.cellIndex); newCell.innerHTML = "?"; newCell.mergeAttributes(tmp_obj) } } else tmp_obj.colSpan += num; } } function table_change() { var t = new LwgTable(); if (!t.getObj()) return false; t.setxy(); var args = table_change.arguments; switch (args[0]) { case "insertrow_up": t.insertRow('up', args[1]); break; case "insertrow_down": t.insertRow('down', args[1]); break; case "deleterow": t.deleteRow(); break; case "deletecol": t.deleteCol(); break; case "insertcol_left": t.insertCol('left', args[1]); break; case "insertcol_right": t.insertCol('right', args[1]); break; case "rowsplit": t.rowSplit(args[1]); break; case "colsplit": t.colSplit(args[1]); break; case "merge": t.mergeCell(args[1]); break default: break; } } </script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <table border="0" cellpadding="5" cellspacing="1" bgcolor="#999999"> <tr bgcolor="#FFFFFF"> <td align="right" bgcolor="#efefef"> 合并单元格 </td> <td> <input type="button" name="Submit2" value="向上" onclick="table_change('merge','up')"><input type="button" name="Submit22" value="向下" onclick="table_change('merge','down')"><input type="button" name="Submit23" value="向左" onclick="table_change('merge','left')"><input type="button" name="Submit24" value="向右" onclick="table_change('merge','right')"> </td> </tr> <tr bgcolor="#FFFFFF"> <td align="right" bgcolor="#efefef"> 拆分单元格 </td> <td> <input type="button" name="Submit2424" value="拆成3行" onclick="table_change('rowsplit',3)"><input type="button" name="Submit24242" value="拆成2列" onclick="table_change('colsplit',2)"> </td> </tr> <tr bgcolor="#FFFFFF"> <td align="right" bgcolor="#efefef"> 插入行 </td> <td> <input type="button" name="Submit242" value="向上插入3行" onclick="table_change('insertrow_up',3)"><input type="button" name="Submit2422" value="向下插入2行" onclick="table_change('insertrow_down',2)"> </td> </tr> <tr bgcolor="#FFFFFF"> <td align="right" bgcolor="#efefef"> 插入列 </td> <td> <input type="button" name="Submit2423" value="向左插入3列" onclick="table_change('insertcol_left',3)"><input type="button" name="Submit24223" value="向右插入2列" onclick="table_change('insertcol_right',2)"> </td> </tr> <tr bgcolor="#FFFFFF"> <td align="right" bgcolor="#efefef"> 删除行 </td> <td> <input type="button" name="Submit24222" value="删除行" onclick="table_change('deleterow')"> </td> </tr> <tr bgcolor="#FFFFFF"> <td align="right" bgcolor="#efefef"> 删除列 </td> <td> <input type="button" name="Submit242222" value="删除列" onclick="table_change('deletecol')"> </td> </tr> </table> 使用方式:先在单元格中建立一个选区,再点击上面按钮<br> <table width="100%" border="1"> <tr> <td colspan="2"> 1 </td> <td> 2 </td> <td> 3 </td> </tr> <tr> <td bgcolor="#CCCCCC"> ? </td> <td rowspan="2"> 47 </td> <td> 5 </td> <td> 6 </td> </tr> <tr> <td rowspan="3"> 45 </td> <td> 8 </td> <td bgcolor="#CCCCCC"> 9 </td> </tr> <tr> <td rowspan="3"> 10 </td> <td bgcolor="#FFFFCC"> 11 </td> <td rowspan="2"> 1214 </td> </tr> <tr> <td bgcolor="#CCCCCC"> 13 </td> </tr> <tr> <td> 123 </td> <td bgcolor="#CCCCCC"> ? </td> <td> 6 </td> </tr> </table>