javascript表格操作大全:表格排序/倒序、动态添加列、批量删除、删除一行、隔行变色、鼠标悬浮切换背景色、全选/反选。(IE、火狐都兼容)


表格.html

<!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/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>表格操作</title>
	<script type= "text/javascript" src="domutil.js" ></script>
</head>

<body>  
	
				<!--以下数据纯属虚构-->

	<table id="tab" border="1" style =" align:center;text-align:center ">
		<thead style="background:#0000FF" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
			<tr>
				<th><input type="checkbox" name="quan" οnclick="quan()" style="cursor:pointer"/>全选</th>
				<th οnclick="sortTable('tab',1,'int')" style="cursor:pointer">编号</th>
				<th οnclick="sortTable('tab',2,'汉字')" style="cursor:pointer">编程语言</th>
				<th οnclick="sortTable('tab',3,'汉字')" style="cursor:pointer">所属公司</th>
				<th οnclick="sortTable('tab',4,'float')" style="cursor:pointer">市场份额</th>
				<th οnclick="sortTable('tab',5,'date')" style="cursor:pointer">诞生日期</th>
				<th style="cursor:pointer">操作</th>
			</tr>
		</thead>
		<tbody id="tbody">
			<tr style="background:#00FF00" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="checkbox" /></td>
				<td width=100 id="ID">4</td>
				<td id="name" width="100">Java</td>
				<td id="company" width="100" >甲骨文公司</td>
				<td id="age" width="100">47.6</td>
				<td id="date" width="100">1970/09/09</td>
				<td ><input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)"/></td>
			</tr>
			<tr style="background:#00FFFF" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="checkbox" /></td>
				<td width=100 id="ID">6</td>
				<td id="name" width="100">ASP</td>
				<td id="company" width="100">微软公司</td>
				<td id="age" width="100">30.3</td>
				<td id="date" width="100">1980/09/09</td>
				<td ><input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)"/></td>
			</tr>
			<tr style="background:#00FF00" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="checkbox" /></td>
				<td width=100 id="ID">3</td>
				<td id="name" width="100">PHP</td>
				<td id="company" width="100">公司Zend</td>
				<td id="age" width="100">22.1</td>
				<td id="date" width="100">1994/07/09</td>
				<td ><input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)"/></td>
			</tr>
			<tr style="background:#00FFFF" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="checkbox" /></td>
				<td width=100 id="ID">1</td>
				<td id="name" width="100">Objective-C</td>
				<td id="company" width="100" >Stepstone公司</td>
				<td id="age" width="100">35.9</td>
				<td id="date" width="100">1980/01/01</td>
				<td ><input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)"/></td>
			</tr>
			<tr style="background:#00FF00" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="checkbox" /></td>
				<td width=100 id="ID">5</td>
				<td id="name" width="100">VB</td>
				<td id="company" width="100">美国微软</td>
				<td id="age" width="100">32.7</td>
				<td id="date" width="100">1991/09/09</td>
				<td ><input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)"/></td>
			</tr>
			<tr style="background:#00FFFF" οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="checkbox" /></td>
				<td width=100 id="ID">2</td>
				<td id="name" width="100">javascript</td>
				<td id="company" width="100">Netscape</td>
				<td id="age" width="100">33.8</td>
				<td id="date" width="100">1992/06/09</td>
				<td ><input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)"/></td>
			</tr>
		</tbody>
		<tfoot style="background:#C0C0C0">
			<tr οnmοuseοver="over(this)" οnmοuseοut="out(this)">
				<td><input type="checkbox" name="fan" οnclick="fan()"/>反选</td>
				<td colspan="6">
				<input type="button" value="添加数据" οnclick="addRow()" />     
				<input type="button" value="删除选中行" οnclick="deleteChecked()"/>
				</td>
			</tr>
		</tfoot>
	</table>
	
</body> 
<script type="text/javascript"> 
		/*
		全局变量
		ID:    保存插入数据的编号
		color:保存原来的背景色
		*/
		var ID,color;
		window.onload = function(){
			var myTab = $q("#tab");
			ID = myTab.rows.length-1;
		}
		//鼠标悬浮在某元素时
		function over(node){
			color = node.style.backgroundColor;
			node.style.backgroundColor = '#FF00FF';
		}
		//鼠标离开某元素时
		function out(node){
			node.style.backgroundColor = color;
		}
		//全选
		function quan(){
			var checkArr = $q("$checkbox"); //得到tbody行的集合
			var qArr = $q("$quan"); 
			if(qArr[0].checked){ //如果是全选,设置全部选中
				for(var i=0;i<checkArr.length;i++){	 
					checkArr[i].checked = true;
				}
			}else{  //如果没有全选,设置全部没选中
				for(var i=0;i<checkArr.length;i++){	
					checkArr[i].checked = false;
				}
			}
		}

		//反选
		function fan(){
			var checkArr = $q("$checkbox"); //得到tbody行的集合
			for(var i=0;i<checkArr.length;i++){	//循环将所有行反选
				checkArr[i].checked = checkArr[i].checked ? false : true;
			}
		}

		//添加一行数据
		function addRow(){
			var myTab = $q("#tab");
			var rowLength = myTab.rows.length;
			var newRow = document.createElement("tr"); //创建一行
			//设置隔行变色
			if(rowLength%2 == 1){
				newRow.style.background = "#00FFFF";
			}else{
				newRow.style.background = "#00FF00";
			}
			if(newRow.addEventListener){
				//给创建的行添加鼠标悬浮的事件
				newRow.addEventListener("mouseover",function(){over(newRow);},false);
				//给创建的行添加鼠标离开的事件
				newRow.addEventListener("mouseout",function(){out(newRow);},false);
			}else if(newRow.attachEvent){
				//给创建的行添加鼠标悬浮的事件
				newRow.attachEvent("onmouseover",function(){over(newRow);});
				//给创建的行添加鼠标离开的事件
				newRow.attachEvent("onmouseout",function(){out(newRow);});
			}else{
				//给创建的行添加鼠标悬浮的事件
				newRow.onmouseover = function(){over(newRow);};
				//给创建的行添加鼠标离开的事件
				newRow.onmouseout = function(){out(newRow);};
			}  
			//创建多列
			var newCell1 = document.createElement("td");
			newCell1.innerHTML = '<input type="checkbox" name="checkbox" />';
			var newCell2 = document.createElement("td");
			newCell2.innerHTML = ID;
			ID += 1;
			var newCell3 = document.createElement("td");
			newCell3.innerHTML = prompt("请输入编程语言:","");
			var newCell4 = document.createElement("td");
			newCell4.innerHTML = prompt("请输入所属公司:","");
			var newCell5 = document.createElement("td");
			newCell5.innerHTML = prompt("请输入市场份额:","");
			var newCell6 = document.createElement("td");
			newCell6.innerHTML = prompt("请输入诞生日期:","");
			var newCell7 = document.createElement("td");
			newCell7.innerHTML = '<input type="button" value="删除" οnclick="deleteRow(this.parentNode.parentNode)" />' ;
			//将创建的多列添加到行
			newRow.appendChild(newCell1);
			newRow.appendChild(newCell2);
			newRow.appendChild(newCell3);
			newRow.appendChild(newCell4);
			newRow.appendChild(newCell5);
			newRow.appendChild(newCell6);
			newRow.appendChild(newCell7);
			var tbody = myTab.tBodies[0]; //获取表格的tbody
			tbody.appendChild(newRow);  //将创建的行添加到表格body里
		} 
		//删除一行数据
		function deleteRow(currentRow){
			var tab = $q("#tab"); //获得表格节点
			tab.deleteRow(currentRow.rowIndex); //删除选中的行
		}
		//删除多行数据
		function deleteChecked(){
			var tab = $q("#tab"); //获得表格节点
			var checkArr = $q("$checkbox");  //得到tbody行的集合
			for(var i=0;i<checkArr.length;i++){
				if(checkArr[i].checked){  //用循环删除选中的行
					var index = checkArr[i].parentNode.parentNode.rowIndex;
					tab.deleteRow(index);
				}
			}
		}
		//转换数据类型,v为值,dataType为数据类型
		function convert(v,dataType){
			switch(dataType){
				case "int":
					return parseInt(v);
				case "float":
					return parseFloat(v);
				case "date":
					return (new Date(Date.parse(v)));
				default:
					return v.toString();
			}
		}
		//排序函数,index为索引,type为数据类型
		function pai(index,dataType){
			if(dataType === "汉字"){
				return function compare(a,b){
							var str1 = convert(a.cells[index].innerHTML,dataType); 
							var str2 = convert(b.cells[index].innerHTML,dataType);
							return str1.localeCompare(str2);
						};
			}else{
				return function compare(a,b){
							//var str1 = convert(a.cells[index].firstChild.nodeValue,dataType);
							//var str2 = convert(b.cells[index].firstChild.nodeValue,dataType);
							var str1 = convert(a.cells[index].innerHTML,dataType); //两种方法效果一样
							var str2 = convert(b.cells[index].innerHTML,dataType);
							if(str1 < str2){
								return -1;
							}else if(str1 > str2){
								return 1;
							}else{ 
								return 0;
							}
						};
			}
		}
		//排序的过程
		function sortTable(tableID,index,dataType){
			var tab = $q("#"+tableID); //获取表格的ID
			var td = tab.tBodies[0]; //获取表格的tbody
			var newRows = td.rows;   //获取tbody里的所有行
			var arr = new Array();   //定义arr数组用于存放tbody里的行
			//用循环将所有行放入数组
			for(var i=0;i<newRows.length;i++){
				arr.push(newRows[i]);
			}
			//判断最后一次排序的列是否与现在要进行排序的列相同,如果是就反序排列
			if(tab.sortCol == index){
				arr.reverse();
			}else{ 
				//使用数组的sort方法,传进排序函数
				arr.sort(pai(index,dataType));
			}
			var oFragment = document.createDocumentFragment(); //创建文档碎片
            for (var i=0; i < arr.length; i++) {  //把排序过的aTRs数组成员依次添加到文档碎片
				if(i%2 == 1){
					arr[i].style.background = "#00FFFF";
					oFragment.appendChild(arr[i]);
				}else{
					arr[i].style.background = "#00FF00";
					oFragment.appendChild(arr[i]);
				}
			}
            td.appendChild(oFragment); //把文档碎片添加到tbody,完成排序后的显示更新
            tab.sortCol = index;  //记录最后一次排序的列索引
		}
	</script>
</html>

domutil.js

(此js为课堂笔记整理而成,有部分代码本次没有用到的)

var CustomFunctions = {
	//获取子节点的集合(ie,ff通用)
	getChildNodes:function(node){
		var arr = [];
		var nodes = node.childNodes;
		for(var i in nodes){
			if(nodes[i].nodeType == 1){ //查找元素节点
				arr.push(nodes[i]);
			}
		}
		return arr;
	},
	//获取第一个元素子节点(ie,ff通用)
	getFirstElementChild : function(node){
		return node.firstElementChild ? node.firstElementChild : node.firstChild ;
	},
	//获取最后一个元素子节点(ie,ff通用)
	getLastElementChild : function(node){
		return node.lastElementChild ? node.lastElementChild : node.lastChild ;
	},
	//获取上一个相邻节点(ie,ff通用)
	getPreviousSibling : function(node){
		//找到上一个节点就返回节点,没找到就返回null
		do{
			node = node.previousSibling;
		}while(node && node.nodeType!=1)
		return node;
	},
	//获取下一个相邻节点 (ie,ff通用)
	getNextSibling : function(node){
		//找到下一个节点就返回节点,没找到就返回null
		do{
			node = node.nextSibling;
		}while(node && node.nodeType!=1)
		return node;
	},
	//将元素插入到指定的node节点后面
	insertAfter : function(newNode,targetNode){
		if(newNode && targetNode){
			var parent = targetNode.parentNode;
			var nextNode = this.getNextSibling(targetNode);
			if(nextNode && parent){
				parent.insertBefore(newNode,nextNode);
			}else{
				parent.appendChild(newNode);
			}
		}
	}
};

/*清除字符串前后的空格*/
String.prototype.trim=function(){
	return this.replace(/^\s*|\s*$/,"");
};

/*
查找元素:
$q("div"):bytagname
$q(".l"):byclassname
$q("#l"):byid
$q("$name"):byname
selector:选择符
parentElement:父元素
*/
window.$q = function(selector,parentElement){
	if(selector && (typeof selector) === 'string'){
		selector = selector.trim();//去掉前后空格
		var parentEl = parentElement || document;
		var nodeArr = new Array();	
		var firstChar = selector.substr(0,1);	//取得第一个字符
		//以#开头,表示根据ID查找
		if(firstChar === '#'){
			return parentEl.getElementById(selector.substr(1));
		}
		//以$开头,根据name查找
		else if(firstChar === '$'){
			var all = parentEl.getElementsByTagName("*");
			for(var i=0;i<all.length;i++){
				var name = all[i].getAttribute("name");
				if(name === selector.substr(1)){
					nodeArr.push(all[i]);
				}
			}
			delete i;
			return nodeArr;
		}
		//以.开头,根据class名查找
		else if(firstChar === '.'){
			var className = selector.substr(1);
			if(parentEl.getElementsByClassName){
				return parentEl.getElementsByClassName(className);
			}
			else{
				var childList = parentEl.getElementsByTagName("*");
				for(var i=0;i<childList.length;i++){
					var nodeClassName = childList[i].className;
					var classNameArr = nodeClassName.split(' ');
					for(var j=0;j<classNameArr.length;j++){
						if(classNameArr[j]===className){
							nodeArr.push(childList[i]);
						}
					}
					delete j;
				}
				delete i;
				return nodeArr;
			}
		}
		//否则,根据标签名查找
		else{
			return parentEl.getElementsByTagName(selector);
		}
		
	}
	else{
		return document.all || document.getElementsByTagName("*");
	}

};


  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值