用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例

先上效果图:

CSS:

复制代码 代码如下:

body{margin:0px;padding:0px;-moz-user-select:none;cursor:default;}

.tabEditDiv{position:absolute;width:15px;height:15px;cursor:pointer;}
.seltab{position:absolute;width:15px;height:15px;cursor:pointer;background:url(images/seltab.gif) no-repeat;}
.splitx{overflow:hidden;position:absolute;height:3px;cursor:row-resize;background:red !important;filter:Alpha(opacity=10);-moz-opacity:0.1;opacity: 0.1; }
.splity{overflow:hidden;position:absolute;width:3px;cursor:col-resize;background:red !important;filter:Alpha(opacity=10);-moz-opacity:0.1;opacity: 0.1;}
#tabletitle{font-weight:bold;font-size:18px;height:30px;width:800px;margin:0 auto;text-align:center;font-family:宋体;line-height:30px;}
#tabletitle input{width:100%;border:0px;height:28px;line-height:30px;text- align:center;font-weight:bold;font-size:18px;font-family:宋体;}
.finelinetable{border-right:1px solid #000;border-top:1px solid #000;border-collapse:collapse;font-size:13px;width:800px;margin:0 auto;}
.finelinetable td{border-left:1px solid #000;border-bottom:1px solid #000;height:25px;}

HTML:

复制代码 代码如下:

<body>
<div id="tabletitle">表格标题</div>
<table id="mainTable" class="finelinetable">
<tr>
<td colspan="8">1</td>
</tr>
<tr>
<td rowspan="3">2</td>
<td>3</td>
<td colspan="3">4</td>
<td>5</td>
<td>6</td>
<td>7</td>
</tr>
<tr>
<td>8</td>
<td>9</td>
<td>10</td>
<td colspan="2">11</td>
<td>12</td>
<td>13</td>
</tr>
<tr>
<td>14</td>
<td colspan="3">15</td>
<td>16</td>
<td>17</td>
<td>18</td>
</tr>
<tr>
<td colspan="8"> </td>
</tr>
<tr>
<td rowspan="3"> </td>
<td> </td>
<td colspan="2"> </td>
<td> </td>
<td colspan="3"> </td>
</tr>
<tr>
<td> </td>
<td colspan="2"> </td>
<td> </td>
<td colspan="3"> </td>
</tr>
<tr>
<td style="height: 25px"> </td>
<td colspan="2" style="height: 25px"> </td>
<td style="height: 25px"> </td>
<td colspan="3" style="height: 25px"> </td>
</tr>
<tr>
<td> </td>
<td colspan="7"> </td>
</tr>
<tr>
<td colspan="2"> </td>
<td colspan="6"> </td>
</tr>
<tr>
<td colspan="2"> </td>
<td colspan="6"> </td>
</tr>
<tr>
<td colspan="2"> </td>
<td colspan="6"> </td>
</tr>
</table>
</body>

JS:

复制代码 代码如下:

//注释:获取对象.示例:$("objectId") 等同于 document.getElementById("objectId")
if (typeof $ != "function") { var $ = function (ids) { return document.getElementById(ids) }; }
//注释:获取坐标,parentNode最后节点.示例:absPos(object).x
function absPos(_node, parentNode) { var x = y = 0; var node = _node; do { if (parentNode && node == parentNode) { break; } x += node.offsetLeft; y += node.offsetTop; } while (node = node.offsetParent); node = _node; return { 'x': x, 'y': y }; }
function addEvent(object, event, func) { if (object.addEventListener) { /* W3C方法(DOM方法)下面语句中的false意思是用于冒泡阶段,若是true则是用于捕获阶段(IE不支持捕获),所以这里用false是一方面的 原因是为了统一 */object.addEventListener(event, func, false); return true; } else if (object.attachEvent) { /* MSIE方法(IE方法) */object['e' + event + func] = func; object[event + func] = function () { object['e' + event + func](window.event); }; object.attachEvent('on' + event, object[event + func]); return true; } /*如两种方法都不具备则返回false */return false; }
//注释:判断是否是对象内子节点触发的onmouseover和onmouseout.示例:e = e || event;if (isMouseLeaveOrEnter(e, obj)) {}
function isMouseLeaveOrEnter(e, handler) { if (e.type != 'mouseout' && e.type != 'mouseover') return false; var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement; while (reltg && reltg != handler) reltg = reltg.parentNode; return (reltg != handler); }

var table = $("mainTable");
var tabEditDiv; //覆盖在table上的DIV
var cellHide = [];//补充的rowspan,cellspan的格子
var moveMode = "";//鼠标移动模式
var moveArgs = []; //移动模式参数

document.onselectstart = function(){return false;};
addEvent(window,"resize",function(){loadTable();});

$("tabletitle").ondblclick = function(){
if(this.getElementsByTagName("input").length > 0){return;}
this.innerHTML = "<input type='text' value='" + (this.innerHTML == "表格标题" ? "" : this.innerHTML) + "' />";
var input = this.getElementsByTagName("input")[0];
var _this = this;
input.focus();
input.onblur = function(){_this.innerHTML = this.value;}
input.onkeydown = function (e) { var key = window.event ? window.event.keyCode : e.which; if (key == 13) this.blur(); };
}

function loadTable(){
var tabPos = absPos(table);
if(!tabEditDiv){
tabEditDiv = document.createElement("div");
document.body.appendChild(tabEditDiv);
}
tabEditDiv.style.cssText = "left:" + (tabPos.x - 15) + "px;top:" + (tabPos.y - 15) + "px;";
tabEditDiv.className = "tabEditDiv";

//全选Table按钮
if(!seltab){
var seltab = document.createElement("div");
seltab.style.cssText = "width:15px;height:15px;left:" + (tabPos.x - 15) + "px;top:" + (tabPos.y - 15) + "px;";
seltab.className = "seltab";
seltab.onclick = function(){
if(table.getAttribute("selected") == "1"){
table.removeAttribute("selected");
table.style.background = "";
this.style.width = "15px";
this.style.height = "15px";
}else{
table.setAttribute("selected","1");
table.style.background = "#B6CAEB";
this.style.width = (table.clientWidth + 15) + "px";
this.style.height = (table.clientHeight + 15) + "px";
}
}
document.body.appendChild(seltab);
}
loadTableEdit();
} loadTable();

function loadTableEdit(){ //加载可调整宽度及高度的div
var tabPos = absPos(table);
tabEditDiv.innerHTML = "";
var cellcount = 0;
var isadd = cellHide.length == 0;
for(var i=0;i<table.rows.length;i++){
for(var j=0;j<table.rows[i].cells.length;j++){
var pos = absPos(table.rows[i].cells[j],table);
if(!$("splitx_" + (pos.y + table.rows[i].cells[j].clientHeight))){ //加载可调整高度的div
var split = document.createElement("div");
split.id = "splitx_" + (pos.y + table.rows[i].cells[j].clientHeight);
split.className = "splitx";
split.style.cssText = "width:" + table.clientWidth + "px;left:15px;top:" + (pos.y + table.rows[i].cells[j].clientHeight - 1 + 15) + "px";
split.onmousedown = function(){
var index = this.getAttribute("index");
if(index == null){ index = 0; var divs = tabEditDiv.getElementsByTagName("div"); var left = parseInt(this.id.split("_")[1]); for(var k=0;k<divs.length;k++){ if(divs[k].id.indexOf("splitx_") < 0) continue; if(parseInt(divs[k].id.split("_")[1]) < left) index++; } this.setAttribute("index",index);}else{index = parseInt(index);}
moveMode = "cellHeight";
moveArgs[moveArgs.length] = index;
}
tabEditDiv.appendChild(split);
}
if(j > 0){ //加载可调整宽度的div
if(!$("splity_" + pos.x)){
var split = document.createElement("div");
split.id = "splity_" + pos.x;
split.className = "splity";
split.style.cssText = "height:" + table.clientHeight + "px;top:15px;left:" + (pos.x - 2 + 15) + "px";
split.onmousedown = function(){
var index = this.getAttribute("index");
if(index == null){ index = 0; var divs = tabEditDiv.getElementsByTagName("div"); var left = parseInt(this.id.split("_")[1]); for(var k=0;k<divs.length;k++){ if(divs[k].id.indexOf("splity_") < 0) continue; if(parseInt(divs[k].id.split("_")[1]) < left) index++; } this.setAttribute("index",index);}else{index = parseInt(index);}
moveMode = "cellWidth";
moveArgs[moveArgs.length] = index;
}
tabEditDiv.appendChild(split);
}
}
if(isadd){
loadHide();
}
table.rows[i].cells[j].onmousedown = function(){
//alert("x");
}
}
}
}

function loadHide(){
cellHide = [];
var tempHide = [];
for(var i=0;i<table.rows.length;i++){
for(var j=0;j<table.rows[i].cells.length;j++){
for(var k=1;k<table.rows[i].cells[j].rowSpan;k++){
cellHide[cellHide.length] = [i+k,j];
tempHide[tempHide.length] = [i+k,j];
}
}
}
for(var i=0;i<table.rows.length;i++){
for(var j=0;j<table.rows[i].cells.length;j++){
for(var k=1;k<table.rows[i].cells[j].colSpan;k++){
var yc = 0;
for(var l=0;l<tempHide.length;l++){
if(tempHide[l][0]==i&&tempHide[l][1]<j){yc++;}
}
for(var l=0;l<j;l++){
if(table.rows[i].cells[l].colSpan > 1){yc+=table.rows[i].cells[l].colSpan-1;}
}
cellHide[cellHide.length] = [i,j+k+yc];
}
}
}
}

addEvent(document,"mousemove",function(e){
e = e || window.event;
if(moveMode == "cellWidth"){ //调整宽度

var temp = moveArgs[0];
var test = "";
for(var i=0;i<table.rows.length;i++){
var index = temp;
for(var j=0;j<cellHide.length;j++){
if(i==cellHide[j][0] && temp>=cellHide[j][1]){index--;}
}
if(!table.rows[i].cells[index] || index < 0 || table.rows[i].cells[index].colSpan > 1){continue;}
if(e.clientX > absPos(table.rows[i].cells[index]).x)
table.rows[i].cells[index].style.width = e.clientX - absPos(table.rows[i].cells[index]).x + "px";
}
loadTableEdit();
}else if(moveMode == "cellHeight"){ //调整高度
var index = moveArgs[0];
for(var i=0;i<table.rows[index].cells.length;i++){
if(table.rows[index].cells[i].rowSpan > 1){continue;}
if(e.clientY > absPos(table.rows[index].cells[i]).y)
table.rows[index].cells[i].style.height = e.clientY - absPos(table.rows[index].cells[i]).y + "px";
}
loadTableEdit();
}
});
addEvent(document,"mouseup",function(e){
moveMode = ""; moveArgs = [];
});
addEvent(document,"mouseout",function(e){
e = e || event;
if (!isMouseLeaveOrEnter(e, this)) { return; }
moveMode = ""; moveArgs = [];
});

时间: 2024-09-21 09:27:22

用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例的相关文章

js 检测上传图片类型与高宽(按比例缩放)

<form action="" method="post" enctype="multipart/form-data" name="dform">   <label for="ifile"></label>   <input type="file" name="ifile" id="ifile">  

js操作table示例(个人心得)_javascript技巧

记得以前面试的时候遇到过这样一个问题:有一个表格,然后有4个输入框,一个合并按钮,输入框是这样的,从第几行到第几行,从第几列到第几列,然后点击按钮,合并 .当时我从学校出来,js知识只是知道一些,根本做不到!现在想想,其实这个问题也还是考基础功夫是否扎实!大家有兴趣可以自己做做看,测下自己是不是能够做出来.题目的截图:  现在做这个问题,看起来简单,但我还是花了很长时间,可能是我的思路不对吧?主要就是用js来操作html,我现在实现了添加行,删除行,添加列,删除列 ,但合并单元格却不能完整的实现

巧妙处理有多个合并单元格的复杂Excel表格

Excel是功能非常强大的表格处理软件,特别是其表格计算能力,方便.快捷和自动化运算,使越来越多的人选择采用EXCEL来处理日常办公表格.但是,当碰到一些"不规则"的表格时,许多初学者感到十分棘手.表格"不规则",主要表现为合并单元格太多,单元格或上下不对齐,或左右不对齐,复杂的甚至多行.多列不对齐.例如图1中的中美MBA报名表: 图1 细看上表,发现"职务"单元格和"性别"单元格上下不对齐."手机"和&q

处理有多个合并单元格的复杂Excel表格

  Excel是功能非常强大的表格处理软件,特别是其表格计算能力,方便.快捷和自动化运算,使越来越多的人选择采用EXCEL来处理日常办公表格.但是,当碰到一些"不规则"的表格时,许多初学者感到十分棘手.表格"不规则",主要表现为合并单元格太多,单元格或上下不对齐,或左右不对齐,复杂的甚至多行.多列不对齐.例如图1中的中美MBA报名表: 图1 细看上表,发现"职务"单元格和"性别"单元格上下不对齐."手机"和

jquery 动态合并单元格的实现方法_jquery

如下所示: ////在table的第二行的位置添加一行: var tbl_elm = $("#dgList"); $('<tr><td colspan=\'2\'>xxxxxx</td></tr>').insertBefore($("TR", tbl_elm).eq(1)) ////table中指定行第N列合并单元格(合并后会多出一列,删除N+1单元格即可) var tds = $("#dgList .Tab

Excel中合并单元格的几种方法及合并单元格快捷键

  Excel中合并单元格的几种方法及合并单元格快捷键          如下图所示,希望将A1到E1,这之间所有单元格合并成一个大单元格操作方法如下: 合并单元格方法一:利用格式菜单上的"合并及居中"按钮合并单元格 ①首先,选中A1.B1.C1.D1.E1这些单元格; ②然后单击"格式"工具栏上面的"合并及居中"按钮; 此时,这几个单元格就已经合并成了一个大单元格了,是不是很简单呀. 合并单元格方法二:利用"设置单元格格式"

excel合并单元格快捷键是什么

  excel合并单元格快捷键是什么          excel合并单元格快捷键需要用以下方法设置: 1.打开excel,选择工具--点击"自定义".这时会出现一个"自定义"表单.不要理会这个表单,上面没有可供选择的项目. 2.右键点击"合并单元格"的图标.发现没有,和平时右击不一样了! 3.选择"总是只用文字"选项.这时平时用来合并的按钮就变成了"合并及居中(M)",这个(M)就是你想要的快捷方式了,现

excel合并单元格怎么操作以及合并单元格快捷键

现象重现步骤如下: 第一步:在A1:C4区域分别输入数字.实际区域可自己选定,数字也可根据自己的喜好来输. 第二步:选中A1:A4区域,单击"开始"标签"对齐方式"功能区中的"合并居中"命令按钮,在弹出的对话框中单击"确定"按钮完成单元格的合并. 上面两步是一个正常的单元格合并步骤,没有任何问题.最终效果为A1:A4区域合并为一个单元格,并且里面的数值是之前A1单元格中的数值100. 第三步:继续刚才的操作,使合并后的A1单元

excel合并单元格的快捷键是什么

  excel合并单元格的快捷键是什么          快捷键的熟练使用可以帮助我们在工作中提高效率,接下来为您讲解合并单元格的快捷键设置方法的图文演示 合并单元格在excel默认的情况下是没有快捷键的. 需要用以下方法设置 1.打开excel,选择工具--点击"自定义".这时会出现一个"自定义"表单.不要理会这个表单,上面没有可供选择的项目. 2.右键点击"合并单元格"的图标.发现没有,和平时右击不一样了! 3.选择"总是只用文字&