js操作table元素实现表格行列新增、删除技巧总结

本文实例讲述了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;
}

希望本文所述对大家JavaScript程序设计有所帮助。

(0)

相关推荐

  • JS实现点击Radio动态更新table数据

    tbody定义一个标签 当上面变化的,在js里面做拼接就行了,拼接结束 tbody.html(XXX) <script type="text/javascript"> $(function(){ var quotas = { 1:{name:"工商银行",oneTime:1000}, 2:{name:"农业银行",oneTime:800}, 3:{name:"中国银行",oneTime:2000}, 4:{name

  • JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题

    正文 前言:一年前,博主分享过一篇关于bootstrapTable组件冻结列的解决方案  JS组件系列--Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 ,通过该篇,确实可以实现bootstrapTable的冻结列效果,并且可以兼容ie浏览器.这一年的时间,不断有园友以及群里面的朋友问过我关于固定高度之后,冻结列页面效果不能对齐的问题,奈何博主太忙,一直没有抽空将这个问题优化.最近项目里面也不断有人提过这个bug,这下子不能再推了,必须要直面"惨淡的bug",于

  • jquery.tableSort.js表格排序插件使用方法详解

    本文实例为大家分享了jquery.tableSort.js表格排序的具体代码,供大家参考,具体内容如下 1.一定要引jQuery包,所有jq插件都是基于jQuery包的 2.如果想指定哪一栏不排序这样写 $("#mytable").tablesorter({headers:{5:{sorter:false}}}); 第5列的sorter为false就OK了 参考:http://www.jb51.net/article/105217.htm <!DOCTYPE html> &

  • 详解PHP中的 input属性(隐藏 只读 限制)

    隐藏 <input type="hidden"> 只读 <input type="text" readonly> 失效 <input type="text" disabled> 限制 <input type="text" maxlength="1"> ENTER键让光标移到下一个输入框 <input onkeydown="if(event.ke

  • angularJs中datatable实现代码

    本文介绍了angularJs中datatable实现,有需要的小伙伴可以参考下 html引用derective: 复制代码 代码如下: <table datatable dtOptions="dtOptionsExample2" class="table table-striped m-b-none"></table> controller设置: $scope.dtOptions = { "bProcessing": tr

  • js操作table元素实现表格行列新增、删除技巧总结

    本文实例讲述了js操作table元素实现表格行列新增.删除的方法.分享给大家供大家参考,具体如下: /************ TableTool.js ****************************************************************************************************************** **********************************************************

  • js操作table中tr的顺序实现上移下移一行的效果

    总体思路是在table外部加个div,修改div的innerHtml实现改变tr顺序的效果 具体思路是 获取当前要移动tr行的rowIndex,在table中删除掉,然后循环table的rows,到了目标行再直接加进去,最后把整体的html赋值给div完成效果 js代码如下 //使行向上一行 function setRowUp(obj) { if (obj.parentNode.parentNode.rowIndex != 1) { var tab = obj.parentNode.parent

  • js 操作table之 移动TR位置 兼容FF 跟 IE

    js操作table之 移动TR位置 兼容FF 跟 IE var mousePos; function Up_Move(obj){ try{ if(document.all){ document.getElementById('show_input').style.top = mousePos.y document.getElementById('show_input').style.left = mousePos.x }else{ document.getElementById('show_in

  • Js操作DOM元素及获取浏览器高宽的简单方法

    在JavaScript中,经常会来获取Document文档元素,是 HTML 文档对象模型的英文缩写,Document Object Model for HTML,是基于浏览器编程,HTML DOM 定义了用于 HTML 的一系列标准的对象,以及访问和处理 HTML 文档的标准方法. 通过 DOM,可以访问所有的 HTML 元素,连同它们所包含的文本和属性.可以对其中的内容进行修改和删除,同时也可以创建新的元素.HTML DOM 独立于平台和编程语言.它可被任何编程语言诸如 Java.JavaS

  • js操作table示例(个人心得)

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

  • JS实现table表格内针对某列内容进行即时搜索筛选功能

    本文实例讲述了JS实现table表格内针对某列内容进行即时搜索筛选功能.分享给大家供大家参考,具体如下: 往往有些时候,我们把数据从数据库读取出来,显示到table里面,而此时来了个新需求,要在一个搜索框内输入关键字,表格的内容进行即时的筛选. 而即时触发进行数据库的查询,再回调显示,就显得慢,拖累服务器,降低用户体验度,这时,要是有个纯js操作,进行表格某列的即时筛选,这样既能提高搜索速度,也不用占用服务器资源,用户自然也满意. 实现如下,先看效果图, 开始状态: 在输入框内输入'e',表格即

  • JS实现table表格数据排序功能(可支持动态数据+分页效果)

    asp.net会经常遇到分页的效果,尤其是希望实现静态的html分页排序(html分页相信大家都已经有自己的解决方案.在这里就不多说).我写了一个简单的Demo排序. 数据就是字母和数字两组.(汉字需要找到asc码) 原理就是利用数组自带的sort排序,进行表格重组.已在.net mvc 中测试过.支持分页.(申明一点.只对当前页面数据排序 无刷新,对所有页面排序的话,肯定需要刷新.这点我还在解决中.)希望有新想法的高手们,给下指点. 下面把html的代码贴出来: <!DOCTYPE HTML

  • jQuery+CSS实现的table表格行列转置功能示例

    本文实例讲述了jQuery+CSS实现的table表格行列转置功能.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org

  • JS控制网页动态生成任意行列数表格的方法

    本文实例讲述了JS控制网页动态生成任意行列数表格的方法.分享给大家供大家参考.具体分析如下: 这是一个非常简单使用的JS在线生成表格的代码效果 通过JS功能代码,直接输入行数和列数就可以自动生成你需要的表格 当然你也可以扩展JS代码实现生成文字的各种形式 复制代码 代码如下: <html> <head> <title>Js动态生成表格</title> <style type="text/css"> table{font-siz

  • js动态实现表格添加和删除操作

    本文实例为大家分享了js动态实现表格添加和删除的具体代码,供大家参考,具体内容如下 运行效果如图(两种实现方案,被注释的是第一种实现方案) 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <style type="text/css"> div{ text-al

随机推荐