亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

用js實現table單元格高寬調整,兼容合并單元格(兼容IE6、7、8、FF)實例

2019-11-20 22:36:58
字體:
來源:轉載
供稿:網友

先上效果圖:

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 = [];
 });

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲免费电影| 国产香蕉97碰碰久久人人| 国产91露脸中文字幕在线| 日韩在线视频一区| 亚洲a区在线视频| 97久久国产精品| 亚洲激情 国产| 在线成人激情视频| 欧美黄色性视频| 国产精品久久91| 亚洲аv电影天堂网| 欧美日韩久久久久| 亚洲精品网站在线播放gif| 亚洲免费人成在线视频观看| 国产黑人绿帽在线第一区| 一区二区亚洲精品国产| 日韩电影免费观看中文字幕| 国产精品久久久久久av| 亚洲欧美日韩国产成人| 成人欧美一区二区三区黑人| 91久久精品国产| 粗暴蹂躏中文一区二区三区| 亚洲自拍偷拍色图| 亚洲精品一区二三区不卡| 国产精品96久久久久久| 92版电视剧仙鹤神针在线观看| 欧美激情视频网址| 国产精品96久久久久久| 亚洲精品xxxx| 亚洲欧美一区二区三区四区| 国产精品久久久久久av福利软件| 亚洲精品久久久久久久久久久久久| 国产91热爆ts人妖在线| 国产在线观看精品| 欧美国产激情18| 久久亚洲春色中文字幕| 色爱精品视频一区| 亚洲国产欧美一区二区丝袜黑人| 国内精品一区二区三区| 欧美一区二区三区艳史| 欧美日韩一区二区在线| 国产欧美va欧美va香蕉在线| 国产精品美女呻吟| 成人网址在线观看| 久久精品小视频| 亚洲激情久久久| 久久久av免费| 青青久久av北条麻妃海外网| 91亚洲午夜在线| 久久久久久久久久国产精品| 欧美激情伊人电影| 亚洲精品久久视频| 97久久久免费福利网址| 97婷婷大伊香蕉精品视频| 国产不卡av在线免费观看| 亚洲国产成人av在线| 伊人久久久久久久久久久| 欧美激情视频网址| 亚洲精品电影在线观看| 91精品久久久久久久久久久| 国产午夜精品麻豆| 日韩电影免费观看中文字幕| 国内免费精品永久在线视频| 国产91精品久久久久久久| 九九久久久久久久久激情| 国产精品成人av在线| 国产精品极品美女粉嫩高清在线| 亚洲欧美激情一区| 欧美日韩视频在线| 91精品在线观看视频| 日韩成人在线观看| 久久久久久久国产精品视频| 国产aⅴ夜夜欢一区二区三区| 国产精品美女主播| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产精品嫩草影院久久| 日本久久91av| 欧美日韩久久久久| 欧美成人免费va影院高清| 2018日韩中文字幕| xxxx欧美18另类的高清| 国产日韩精品在线播放| 色婷婷成人综合| 色综久久综合桃花网| 日韩高清电影好看的电视剧电影| 国产自产女人91一区在线观看| 97欧美精品一区二区三区| 久久久久久久久久久国产| 欧美大片免费观看在线观看网站推荐| 国产成人av网址| 国产精品com| 国内久久久精品| 亚洲国产精品一区二区三区| 欧美性猛交xxxx偷拍洗澡| 亚洲视频自拍偷拍| 亚洲国产精品美女| 另类天堂视频在线观看| 91成人福利在线| 亚洲欧美自拍一区| 色视频www在线播放国产成人| 国产精品高清在线| 国产精品户外野外| 免费91麻豆精品国产自产在线观看| 国产一级揄自揄精品视频| 欧美孕妇毛茸茸xxxx| 亚洲天堂男人天堂| 中文字幕欧美精品在线| 亚洲精品v欧美精品v日韩精品| 久久久免费高清电视剧观看| 国产精品pans私拍| 久久久久久久香蕉网| 国产精品专区第二| 国内精品在线一区| 亚洲天堂一区二区三区| 伊人久久久久久久久久久久久| 久久久久久91| 欧美日韩高清在线观看| 国产精品一区二区av影院萌芽| 在线成人激情黄色| 91高清免费在线观看| 国产香蕉精品视频一区二区三区| 亚洲激情视频在线观看| 久久久久久久久久久免费精品| 精品国产欧美成人夜夜嗨| 欧美日韩一区二区在线播放| 成人黄色av网站| 最近2019年中文视频免费在线观看| 亚洲视频在线看| 亚洲自拍偷拍色片视频| 亚洲欧美制服另类日韩| 国产亚洲精品久久久久动| 国产成人91久久精品| 精品在线观看国产| 中文字幕成人精品久久不卡| 国产精品偷伦视频免费观看国产| 精品久久国产精品| 波霸ol色综合久久| 欧美伊久线香蕉线新在线| 国模极品一区二区三区| 国产精品欧美激情在线播放| 欧美日在线观看| 亚洲一区二区福利| 亚洲系列中文字幕| 欧美激情日韩图片| 亚洲乱码一区二区| 国产成人综合久久| 成人黄色av播放免费| 国产精品稀缺呦系列在线| 亚洲欧美在线免费| 日韩精品中文字幕在线| 精品久久久久久久久国产字幕| 91产国在线观看动作片喷水| 亚洲精品天天看| 欧美日韩人人澡狠狠躁视频| 亚洲系列中文字幕| 成人女保姆的销魂服务| 91免费精品国偷自产在线| 久久精品欧美视频| 综合网日日天干夜夜久久| 国产精品精品国产| 欧美午夜美女看片| 欧美精品在线第一页| 日韩在线视频一区| www.欧美视频|