日期:2014-05-16  浏览次数:20358 次

js操作table元素,表格的行列新增、删除汇集

直接上代码,如何表格涉及到合并的话,虽然做了处理可能还存在一些问题。(另外这个代码主要用于ie下,火狐等浏览器需要针对event一些地方再做一些修改的)

/************ 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');
		}