javascript對錶格的操作總結1

zhyp29發表於2016-05-11
本文例項講述了js操作table元素實現表格行列新增、刪除的方法。分享給大家供大家參考,具體如下:
/************ TableTool.js ******************************************************************************************************************
************************************************************** 快速索引 ***************************************************************
表格行、列刪除
【一】、 doTableRowDelete 說明:預設根據當前事件指向的物件,向上尋找TR,進行刪除(可選引數:表格物件;刪除的行的行號,按升序方式以逗號分割,如2,3,5;向上遍歷TD幾次,預設為1次)
合併表格 ******
【一】、 conbainTableRow 說明:縱向單元格的內容相同的合併,傳入表格物件,需要合併的列,(可選的引數,從第幾行開始);
【二】、 combineCell 說明:橫向單元格合併,傳入單元格內一物件,(可選的引數,合併幾個單元格<向右>;是否保留原單元格的值);
單元格與行的移動 ******
【一】、 moveUp 說明:進行上移,(可選引數,最上移動到第幾行,預設為第零行;需要移動的行或者td物件或者td內的子物件,預設獲取當前事件指向的行)
【二】、 moveDown 說明:進行下移,(可選引數,最低移動到倒數第幾行,預設為倒數第零行;需要移動的行或者td物件或者td內的子物件,預設獲取當前事件指向的行)
【三】、 moveCell 說明:行交換,表格物件、交換的行的行號
賦值單元格樣式 ******
【一】、 cloneStyle 說明:將模板單元格的樣式COPY到目標單元格上,模板單元格,要修正樣式的單元格
新增行、列 ******
【一】、 insertTableRow 說明:新增行,表格物件,新增行的內容的陣列(可選引數,每個單元格的colSpan的陣列引數,預設取前一行的屬性; 新增到的行的行號,預設是最後一行)
【二】、 insertTableCol 說明:新增列,表格物件,新增行的內容的陣列(可選引數,每個單元格的rowSpan的陣列引數,預設取前一列的屬性;新增到的列的列號,預設是最後一列)
獲取表格中一行的元素 ******
【一】、 doGetRowObj 說明: 獲取表格中行內的元素 ,表格物件,行號,(可選引數,是否copy物件,預設為false;是否獲取單元格物件,預設false)
其他驗證與引數獲取 ******
【一】、 doFetchBaseCols 說明:獲取列號在表格內行中的實際位置,表格物件,列號;返回一個陣列,記錄每行中指定的單元格的cellIndex
【二】、 doFetchEffectCells 說明:獲取插入當前行,被影響到rowSpan屬性的單元格集合
【三】、 calculateSpanWidth 說明:計算Span的寬度,根據當前span外的單元格的寬度,(可選引數:容器物件,容器物件為空時,取當前document,即遍歷頁面上所有的Span物件)
*******************************************************************************************************************************************
***********************************************************************************************************************************************/
/**
* 刪除表格的行
*
* tdCount 根據當前event事件向上追溯TD物件幾次,預設為1次
*
* 說明:event事件需要附著在將要刪除的TD內部,且不能有多重TD的巢狀;否則需要指定巢狀幾層TD物件
*/
function doTableRowDelete(){
var tablObj = arguments[0];
var trIndexs = arguments[1];
var tdCount = arguments[2]==undefined?1:parseFloat(arguments[2]);
if(trIndexs==undefined){
tdCount = tdCount-1;
var tdObj = event.srcElement;
var trObj,tableObj;
while(tdCount > 0){
tdCount--;
while(tdObj.tagName != 'TD'){
tdObj = tdObj.parentNode;
}
tdObj = tdObj.parentNode;
}
while(tdObj.tagName != 'TD'){
tdObj = tdObj.parentNode;
}
trObj = tdObj.parentNode;
tableObj = trObj.parentNode;
if(tableObj.tagName != 'TABLE'){
tableObj = tableObj.parentNode;
}
var cellIndex = tdObj.cellIndex;
var rowIndex = trObj.rowIndex;
var effectCells = doFetchEffectCells(tableObj,rowIndex);
for(var i=0;i<effectCells.length;i++){
effectCells[i].rowSpan = effectCells[i].rowSpan - 1;
}
tableObj.deleteRow(rowIndex);
}else{
var delIndexArr = trIndexs.split(",");
for(var i=delIndexArr.length-1;i>-1;i--){
tablObj.deleteRow(delIndexArr[i]);
}
}
isDeleteFlag = true;
return isDeleteFlag;
}
/**
* 刪除表格的列
*
* tdCount 根據當前event事件向上追溯TD物件幾次,預設為1次
*
* 說明:event事件需要附著在將要刪除的TD內部,且不能有多重TD的巢狀;否則需要指定巢狀幾層TD物件
*/
function doTableColDelete(){
var isDeleteFlag = false;
var tdCount = arguments[0]==undefined?1:parseFloat(arguments[0]);
var tdObj = event.srcElement;
while(tdCount!=0){
tdCount--;
while(tdObj.tagName != 'TD'){
tdObj = tdObj.parentNode;
}
}
var trObj = tdObj.parentNode;
var tableObj = trObj.parentNode;
var cellIndex = tdObj.cellIndex;
var rowIndex = trObj.rowIndex;
tableObj.deleteRow(rowIndex);
isDeleteFlag = true;
return isDeleteFlag;
}
/**
* 根據Span外最臨近的TD的寬度計算重置當前Span的寬度
*
* obj 可以是頁面上一個容器物件,TR、TD、TABLE,此項為空,則會遍歷頁面上所有的Span物件
*/
function calculateSpanWidth(){
var obj = arguments[0];
var spanObjs;
if(obj!=undefined){
spanObjs = obj.getElementsByTagName('span');
}else{
spanObjs = document.getElementsByTagName('span');
}
for(var i=0;i<spanObjs.length;i++){
var tdObj = spanObjs[i].parentNode;
while(tdObj.tagName!='TD'&&typeof(tdObj)=='Object'){
tdObj = tdObj.parentNode;
}
if(tdObj.tagName=='TD'){
var offsetWidth = tdObj.offsetWidth;
spanObjs[i].style.width = offsetWidth-5;
}
}
}
/**
* 合併表格中縱向相鄰單元格的內容相同的項
*
* tableObj 表格物件(必須)
* combainCols 需要合併的列 (格式:從小到大,連續的用-分割,獨立的用逗號; 例如:1-5,7,9)
* beginRowIndex 從第幾行開始合併, 預設從第零行開始
*/
function conbainTableRow(){
var tableObj = arguments[0];
var combainCols = arguments[1];
var beginRowIndex = arguments[2]==undefined?0:arguments[2];
//var beginColIndex = arguments[3]==undefined?0:arguments[3];
var colsArr = combainCols.split(",");
var cols = new Array();
var index = 0;
for(var i=0;i<colsArr.length;i++){
var indexChar = colsArr[i].indexOf("-");
if(indexChar!=-1){
var beginIndex = parseInt(colsArr[i].substring(0,indexChar));
var endIndex = parseInt(colsArr[i].substring(indexChar+1));
for(var j=beginIndex;j<=endIndex;j++){
cols[index++] = j;
}
}
else{
cols[index++] = parseInt(colsArr[i]);
}
}
if(tableObj.rows.length>beginRowIndex){
var modelArr = new Array();
for(var i=beginRowIndex;i<tableObj.rows.length;i++){
var row = tableObj.rows[i];
for(var k=cols.length-1;k>=0;k--){
var j = cols[k];
if(modelArr[j]==undefined){
modelArr[j] = row.cells[j];
}else{
if(row.cells[j].outerText == modelArr[j].outerText){
modelArr[j].rowSpan = modelArr[j].rowSpan + 1;
row.deleteCell(j);
}else{
modelArr[j] = row.cells[j];
}
}
}
}
}
}
/**
* 行上移
*
*minRowIndex 向上移動到的最小行號,預設時零
* Elm 可以預設,如果當前需要移動的行與激發本函式的位置有比較複雜的關係時,需要自行指名tr物件或者當前行的td物件傳入
*
* 返回,移動成功返回true,如果當前時第minRowIndex行則返回false
*/
function moveUp(){
//傳入的物件
var minRowIndex = arguments[0]==undefined?0:arguments[0];
//傳入的物件
var Elm = arguments[1];
//返回值
var isSuccess = false;
//表格物件
var myTable;
if(Elm==undefined){
Elm=event.srcElement;
}
while(Elm&&Elm.tagName!="TR"){
Elm=Elm.parentElement;
}
//當前行號
var x = Elm.rowIndex;
//獲取表格物件
myTable = Elm.parentElement;
if(myTable.tagName!='TABLE'){
myTable = myTable.parentNode;
}
//移到上一行
if (x > minRowIndex){
moveCell(myTable, x, x-1);
isSuccess = true;
}
return isSuccess;
}
/**
* 行下移
*
*minRowIndex 向下移動到表格的倒數幾行,預設是零,即表格的最後一行
* Elm 可以預設,如果當前需要移動的行與激發本函式的位置有比較複雜的關係時,需要自行指名tr物件或者當前行的td物件傳入
*
* 返回,移動成功返回true,如果當前時最後一行則返回false
*/
function moveDown(){
//傳入的物件
var minRowIndex = arguments[0]==undefined?0:arguments[0];
//傳入的物件
var Elm = arguments[1];
//返回值
var isSuccess = false;
//表格物件
var myTable;
if(Elm==undefined){
Elm=event.srcElement;
}
while(Elm&&Elm.tagName!="TR"){
Elm=Elm.parentElement;
}
//當前行號
var x = Elm.rowIndex;
//獲取表格物件
myTable = Elm.parentElement;
if(myTable.tagName!='TABLE'){
myTable = myTable.parentNode;
}
var tableLength = myTable.rows.length;
//移到下一行
if (x < tableLength-minRowIndex-1){
moveCell(myTable, x, x+1);
isSuccess = true;
}
return isSuccess;
}
/**
* 行交換,處理了checkbox丟值的問題
*
*myTable 表格物件
* a 行號
* b 行號
*/
function moveCell(myTable, a, b){
var e2 = myTable.rows[a].all.tags("input");
var e3 = myTable.rows[b].all.tags("input");
var arr = [];
//遍歷a行的所有input控制元件
for(i = 0; i < e2.length; i++) {
if(e2[i].type == "checkbox"){
//對所有checkbox控制元件新增到陣列中
arr.push(e2[i], e2[i].checked);
}
}
//遍歷b行的所有input控制元件
for(i = 0; i < e3.length; i++) {
if(e3[i].type == "checkbox"){
//對所有checkbox控制元件新增到陣列中
arr.push(e3[i], e3[i].checked);
}
}
myTable.moveRow(a, b);
//對陣列中所有元素獲得物件並對引用的物件賦原值
while(arr.length > 0){
arr.shift().checked = arr.shift();
}
}
/**
*替換單元格的樣式為傳入的單元格樣式
*
*tdObj 模板單元格
*targetTdObj 目標替換的單元格
*
*/
function cloneStyle(){
//單元格中物件
var tdObj = arguments[0];
//合併列數
var targetTdObj = arguments[1];
//克隆傳入的物件
var tempObj = tdObj.cloneNode(false);
//克隆目標物件
var targetHtml = targetTdObj.innerHTML;
//橫向合併的個數
var colspan = targetTdObj.colSpan;
//縱向合併的個數
var rowspan = targetTdObj.rowSpan;
//寬度
var width = targetTdObj.width;
//行物件
var rowObj = tdObj.parentNode;
//替換當前單元格
rowObj.replaceChild(tempObj, targetTdObj);
//for(var i=0;i<targetObj.childNodes.length;i++){
// tempObj.appendChild(targetObj.childNodes[i]);
//}
tempObj.innerHTML = targetHtml;
tempObj.colSpan = colspan;
tempObj.rowSpan = rowspan;
tempObj.width = width;
}
/**
* 合併單元格,TODO:行合併暫未實現
*
* obj 單元格中物件
* colspan 合併列數
* rowspan 合併的行數
*keepFlag 是否保留每個單元格的值
*/
function combineCell(){
//單元格中物件
var obj = arguments[0];
//合併列數
var colspan = arguments[1]==undefined?1:arguments[1];
//合併的行數
var rowspan = arguments[2]==undefined?1:arguments[2];
//是否保留每個單元格的值
var keepFlag = arguments[3]==undefined?false:arguments[3];
var elementObjs = new Array();
var tdObj = obj.tagName!='TD'?obj.parentNode:obj;
var trObj = tdObj.parentNode;
var tableObj = trObj.parentNode;
if(tableObj.tagName!='TABLE'){
tableObj = tableObj.parentNode;
}
//當前單元格的原來的格式
var colIndex = tdObj.cellIndex;
var rowIndex = trObj.rowIndex;
//
//var colIndexs;
//if(rowspan>1){
// colIndexs = doFetchBaseCols(tableObj,doGetColIndex(obj));
//}
for(var i=colspan-1;i>0;i--){
//alert("i+colIndex="+(i+colIndex));
//alert("trObj.cells.length="+trObj.cells.length);
var tempObj = trObj.cells[i+colIndex].cloneNode(true);
elementObjs[elementObjs.length] = tempObj;
trObj.removeChild(trObj.cells[i+colIndex]);
}
tdObj.colSpan = tdObj.colSpan + colspan - 1;
//alert("keepFlag="+keepFlag);
//alert("elementObjs.length="+elementObjs.length);
//新增每個單元格的物件
if(keepFlag&&elementObjs.length>0){
for(var i=elementObjs.length-1;i>-1;i--){
var tempObj = elementObjs[i];
for(var j=0;j<tempObj.childNodes.length;j++){
tdObj.appendChild(tempObj.childNodes[j]);
}
}
}
}
/**
* 對錶格新增一行
*
* tableObj 被新增的表格物件
* htmlArr新增內容物件陣列,
* htmlCols 每個td的元素對應的colSpan引數,為空則獲取之前的Tr資訊,否則根據htmlCols生成
* rowIndex 行號 預設方式在最後一行新增行,從零開始
*
*返回新增成功、失敗
*/
function insertTableRow(){
//表格物件
var tableObj = arguments[0];
//增加物件集
var htmlArr = arguments[1];
//元素的TD的colSpan屬性
var htmlCols = arguments[2]==undefined?new Array():arguments[2];
//增加的行位置
var rowIndex = arguments[3];
//根據當前table表的行數,進行引數的處理
if(tableObj==undefined||tableObj.rows==undefined){
rowIndex = 0;
}else if(rowIndex==undefined||rowIndex>tableObj.rows.length){
rowIndex = tableObj.rows.length;
}
//新增行成功標誌,預設失敗
var isSuccess = doCheckPara(tableObj,htmlArr,htmlCols,rowIndex);
if(isSuccess){
//新增行
//alert("tableObj="+tableObj.rows.length+"\nrowIndex="+rowIndex);
//alert("htmlArr.length="+htmlArr.length);
var newTrObj = tableObj.insertRow(rowIndex);
for(var i=0;i<htmlArr.length;i++){
var cellObj = newTrObj.insertCell(i);
//判斷傳入引數不為空,新增物件
if(htmlArr[i]!=undefined && htmlArr[i]!=null){
if(htmlArr[i].constructor == Array){
var childHtmlArr = htmlArr[i];
for(var k=0;k<childHtmlArr.length;k++){
if(typeof(childHtmlArr[k])=='object'){
cellObj.appendChild(childHtmlArr[k]);
}
}
}else{
if(typeof(htmlArr[i])=='object'){
cellObj.appendChild(htmlArr[i]);
}else{
cellObj.innerHTML = htmlArr[i];
}
}
}
if(htmlCols[i]!=undefined && htmlCols[i]!="" && htmlCols[i]!="1"){
cell.colSpan=htmlCols[i];
}
}
isSuccess = true;
}
return isSuccess;
}
/**
* 對錶格新增一行
*
* tableObj 被新增的表格物件
* htmlArr 新增內容物件陣列,
* htmlRows 每個td的元素對應的rowSpan引數,為空則獲取之前的Td資訊,否則根據htmlRows生成
* colIndex 行號 預設方式在最後一列新增列(此處的指定列進行插入,在表格中存在rowSpan!=1的情況下會有有問題),從零開始
*
*返回新增成功、失敗
*/
function insertTableCol(){
//表格物件
var tableObj = arguments[0];
//增加物件集
var htmlArr = arguments[1];
//元素的TD的rowSpan屬性
var htmlRows = arguments[2]==undefined?new Array():arguments[2];
//增加的列位置
var colIndex = arguments[3];
//alert(colIndex);
var baseHtmlCols = doFetchBaseCols(tableObj,colIndex);
//判斷返回為undefined,則表示當前不可進行插入操作
if(baseHtmlCols==undefined){
return false;
}
//新增行成功標誌,預設失敗
var isSuccess = doCheckPara(tableObj,htmlArr,htmlRows,colIndex,false,baseHtmlCols);
if(isSuccess){
//新增行
var rowSpanCount = 0;
var rowIndex = 0;
//alert("htmlArr.length="+htmlArr.length);
for(var i=0,rowIndex=0;rowIndex<tableObj.rows.length&&rowIndex<htmlArr.length;i++){
var trObj = tableObj.rows[rowIndex];
var index = baseHtmlCols[rowIndex];
var cellObj = trObj.insertCell(index);
//判斷傳入引數不為空,新增物件
if(htmlArr[i]!=undefined && htmlArr[i]!=null){
if(htmlArr[i].constructor == Array){
var childHtmlArr = htmlArr[i];
for(var k=0;k<childHtmlArr.length;k++){
if(typeof(childHtmlArr[k])=='object'){
cellObj.appendChild(childHtmlArr[k]);
}
}
}else{
if(typeof(htmlArr[i])=='object'){
cellObj.appendChild(htmlArr[i]);
}else{
cellObj.innerHTML = htmlArr[i];
}
}
}
if(htmlRows[i]!=undefined && htmlRows[i]!="" && htmlRows[i]!="1"){
cellObj.rowSpan=htmlRows[i];
}
//alert(htmlRows[0]+"\n"+htmlRows[1]+"\n"+htmlRows[2]+"\n"+htmlRows[3]+"\n");
//跳過已經被合併的行
rowIndex = rowIndex + (htmlRows[i]!=undefined?parseFloat(htmlRows[i]):1);
//alert(rowIndex);
}
isSuccess = true;
}
return isSuccess;
}
/**
*獲取表格中一行的元素,物件陣列,返回單元格物件陣列、單元格的第一個子物件陣列
*
* tableObj 表格物件
* rowIndex 獲取的行號 ,從零開始
* isCopy 獲取copy物件,預設為false,不進行copy
* isCellObj 獲取單元格物件陣列標誌,,預設為false,返回單元格的子物件
*/
function doGetRowObj(){
var objArr = new Array();
//表格物件
var tableObj = arguments[0];
//增加物件集
var rowIndex = arguments[1];
//是否獲取COPY物件
var isCopy = arguments[2]==undefined?false:arguments[2];
//是否為單元格物件
var isCellObj = arguments[3]==undefined?false:arguments[3];
//c判斷為當前為拷貝時
if(isCopy){
//var copyTable = document.body.createTextRange();
//copyTable.moveToElementText(tableObj);
var memeoryTable = tableObj.cloneNode(true);
tableObj = memeoryTable;
}
//判斷物件為空或者不是一個表格物件時
if(tableObj==undefined || tableObj.tagName!="TABLE"){
alert("傳入表格(tableObj)不是一個物件或表格!");
return objArr;
}
//判斷表格內容為空時
if(tableObj.rows==undefined||tableObj.rows.length==0){
alert("當前表格物件為空!");
return objArr;
}
//判斷要讀取的行引數為空
if(rowIndex==undefined){
alert("未指名獲取的行號!");
return objArr;
}
//判斷當前要獲取的行超過表格物件的範圍
if(rowIndex<0 || rowIndex>=tableObj.rows.length){
alert("要獲取的行號不在當前的表格物件內!");
return objArr;
}
//進行行內容提取,返回物件
var rowObj = tableObj.rows[rowIndex];
for(var i=0;i<rowObj.cells.length;i++){
var cellObj = rowObj.cells[i];
var objCopy;
//返回當前單元格
if(isCellObj){
objCopy = cellObj;
}
else{
objCopy = cellObj.childNodes!=undefined?cellObj.childNodes[0]:undefined;
}
objArr[i] = objCopy;
}
return objArr;
}
/**
*進行列或者行插入前的check,如果預設的colSpan與rowSpan不存在則根據行去前一行、列取前一列的思路獲取預設值
*
* tableObj 表格物件
* htmlArr 內容物件陣列,
* htmlSpan 元素的TD的colSpan、rowSpan屬性
* index 行號 增加的行、列位置,從零開始
*/
function doCheckPara(){
//表格物件
var tableObj = arguments[0];
//增加物件集
var htmlArr = arguments[1];
//元素的TD的colSpan、rowSpan屬性
var htmlSpan = arguments[2];
//增加的行、列位置
var index = arguments[3];
//alert("tableObj="+tableObj+"\nhtmlArr.length="+htmlArr.length+"\nhtmlSpan.length="+htmlSpan.length+"\nindex="+index);
//新增列、行標誌,預設為行追加
var isRowInsert = arguments[4]==undefined?true:false;
var baseHtmlCols = arguments[5];
//新增行成功標誌,預設失敗
var isSuccess = false;
if(tableObj==undefined||tableObj.tagName!="TABLE"){
alert("傳入表格(tableObj)不是一個物件或表格!");
return isSuccess;
}
//傳入的為表格
else{
//驗證邏輯上的錯誤
if(htmlArr==undefined){
alert("傳入的物件陣列(htmlArr)為空或未定義!");
return isSuccess;
}else if(htmlSpan.length>0 && htmlSpan.length!=htmlArr.length){
alert("傳入的屬性(htmlCols)與增加物件集(htmlArr)的長度不等!");
return isSuccess;
}
//行追加
if(isRowInsert){
var tableRowLength = tableObj.rows!=undefined?tableObj.rows.length:0;
//設定初始值
//設定元素對應的colSpan的屬性,預設取當前要插入行的前一行的屬性
if(htmlSpan.length==0 && index>0 && index<tableRowLength){
//獲取臨近一行物件
var lastTrObj = tableObj.rows[index-1];
//獲取預設TD樣式與當前存入元素不對應,無法插入
if(lastTrObj.childNodes.length!=htmlArr.length){
alert("插入失敗,獲取預設單元格的colSpan屬性的個數與傳入物件的個數不相等!");
return isSuccess;
}else {
for(var i=0;i<lastTrObj.childNodes.length;i++){
var cellObj = lastTrObj.childNodes[i];
//列屬性
htmlSpan[i] = cellObj.colSpan!=undefined?cellObj.colSpan:"1";
}
}
}
}
//列追加時
else{
var tableRowLength = tableObj.rows!=undefined?tableObj.rows.length:0;
if(index!=undefined && index>0 && htmlSpan.length==0){
for(var i=0,k=0;i<tableRowLength;i++){
if(baseHtmlCols[i]!=undefined && baseHtmlCols[i]>0){
var lastTrObj = tableObj.rows[i];
//alert("baseHtmlCols[i]="+baseHtmlCols[i]);
//alert("lastTrObj.cells.length="+lastTrObj.cells.length);
var lastTdRowSpan = lastTrObj.cells[parseInt(baseHtmlCols[i])-1].rowSpan;
htmlSpan[k++] = lastTdRowSpan;
}
}
if(htmlSpan.length!=htmlArr.length){
alert("插入失敗,獲取預設單元格的rowSpan屬性的個數與傳入物件的個數不相等!");
return isSuccess;
}
}
}
}
isSuccess = true;
return isSuccess;
}
/**
*獲取表格在指定列在實際行中位置
*
*tableObj 表格物件 (必須項)
*index 指定的列,數值(必須項),從零開始
*
*return baseHtmlCols行中指定列的實際位置,一般情況下返回一個陣列,出錯時返回一個undefined物件
*/
function doFetchBaseCols(){
var tableObj = arguments[0];
var index = arguments[1];
var noAlert = arguments[2]==undefined?false:arguments[2];
// 需要返回的行實際位置
var baseHtmlCols = new Array();
//alert("tableObj="+tableObj);
//獲取初始值,指定的列
for(var i=0;i<tableObj.rows.length;i++){
baseHtmlCols[i] = index;
}
if(index!=0){
//進行值獲取
for(var i=0;i<tableObj.rows.length;i++){
var row = tableObj.rows[i];
//預設插入列
if(index==undefined){
baseHtmlCols[i] = row.cells.length;
}
//生成實際的列值
else{
var colsIndex = 0;
//計算當前行的個數
for(var j=0;j<row.cells.length;j++){
if(j==baseHtmlCols[i]){
break;
}
var cell = row.cells[j];
//合併的行數
var rowSpanIndex = cell.rowSpan!=undefined?cell.rowSpan:0;
//合併的列數
var colSpanIndex = cell.colSpan!=undefined?cell.colSpan:1;
//將當前行減去該TD的colspan引數的影響
baseHtmlCols[i] = baseHtmlCols[i] - (colSpanIndex-1);
//迴圈行,將當前合併的列影響到的列,均調整相應的個數
for(var k=1;k<rowSpanIndex;k++){
baseHtmlCols[i+k] = baseHtmlCols[i+k] - colSpanIndex;
}
//判斷當前指定的列被跳過,因為當前列已經被合併
if(j+(colSpanIndex-1) > baseHtmlCols[i]){
if(!noAlert){
alert("遍歷到第"+i+"行時,因為當前插入的列包含在第"+j+"列合併的單元格內,無法在此處進行操作!");
}
return undefined;
}
//判斷當前行遍歷到指定的列時
else if(j == baseHtmlCols[i]){
break;
}
}
}
}
}
return baseHtmlCols;
}
/**
* 根據表格的一個td的子項,返回當前物件所在列的每個單元格對應的行的位置
*
*obj 傳入的表格中某個td的一個子物件
*isComplexTable 是否複雜表格標誌,預設下都使用false,
1、簡單表格,根據該單元格之前的部分就能計算出當前列在表格中的絕對位置的,就設定成false,或者不定義
2、針對刪除的單元格所在的行存在受之前行中單元格的rowspan與colspan影響,而使得得到的colIndex列的絕對位置
*
*返回一個長度為表格的行個數,存有該列在每行中的位置
*
*缺陷,如果表格比較複雜,頁面上顯示的一列但是在實際行中不是相等的位置
*/
function doGetColIndex(obj){
var obj = arguments[0];
var isComplexTable = arguments[1]==undefined?false:arguments[1];
var tdObj = obj.parentNode;
var trObj = tdObj.parentNode;
var tableObj = trObj.parentNode;
if(tableObj.tagName!='TABLE'){
tableObj = tableObj.parentNode;
}
//當前行下的第幾列
var colIndex = tdObj.cellIndex;
//當前行是第幾行
var rowIndex = trObj.rowIndex;
//定義一個需要返回的值
var arrColsIndex;
//alert("colIndex="+colIndex);
//alert("rowIndex="+rowIndex);
//alert("isComplexTable="+isComplexTable);
if(isComplexTable){
for(var i=0;true;i++){
arrColsIndex = doFetchBaseCols(tableObj,i);
if(arrColsIndex!=undefined){
if(arrColsIndex[rowIndex]==colIndex){
break;
}else if(arrColsIndex[rowIndex]>colIndex){
alert("出錯當前方法不支援合併列的操作!");
return undefined;
}
}
}
}else{
for(var i=colIndex-1;i>-1;i--){
//alert("colIndex="+colIndex);
var ChildObj = trObj.cells[i];
var colspanIndex = ChildObj.colSpan-1;
//alert("colspanIndex="+colspanIndex);
colIndex = colIndex + colspanIndex;
}
//alert('begin');
//alert("colIndex="+colIndex);
arrColsIndex = doFetchBaseCols(tableObj,colIndex);
}
return arrColsIndex;
}
/**
*獲取刪除當前行,影響到單元格rowSpan屬性的單元格集,此處只能遍歷到該行之前的受影響的單元格;如果當前行存在rowSpan屬性存在大於1的,本方法未遍歷到
*
*tableObj 表格物件 (必須項)
*index 指定的行,數值(必須項)
*
*return effectCells,一般情況下返回一個陣列,出錯時返回一個undefined物件
*/
function doFetchEffectCells(){
var tableObj = arguments[0];
var index = arguments[1];
//插入當前會影響到rowSpan屬性的單元格物件集
var effectCells = new Array();
//判斷新增的行在表格的中間時
if(index>0&&index<tableObj.rows.length){
for(var i=0,k=0;i<index;i++){
var row = tableObj.rows[i];
for(var j=0;j<row.cells.length;j++){
var cellObj = row.cells[j];
var rowSpanIndex = cellObj.rowSpan!=undefined?cellObj.rowSpan:1;
if(i+rowSpanIndex>index){
effectCells[k++] = cellObj;
}
}
}
}
return effectCells;
}

相關文章