DOM(三)-01-(示例-邮件列表)

表格样式table.css代码

@CHARSET "UTF-8";

table{
	border:##249bdb 1px solid;
	width:500px;
	border-collapse:collapse;	
}

table td{
	border:#249bdb 1px solid;
	padding:5px;/*td左边顶格*/
}
table th{
	border:#249bdb 1px solid;
	padding:5px;
	background-color: rgb(200,200,200);/*可以通过这种方式设置背景色*/
}

主程序代码

<!--
【综合练习】邮件列表,包含选择邮件,全选按钮,删除邮件按钮等等
1.添加行颜色间隔显示功能;——对应【一】
2.添加鼠标悬停高亮、离开恢复功能;——对应【二】
3.添加全选功能;——对应【三】
4.添加“全选”、“取消全选”、“反选”这三个按钮的功能;——对应【四】
5.添加“删除所选邮件”这个按钮的功能;——对应【五】
-->

<html>
	<head>
		<style type="text/css">
			@import url(table.css);
			.one{/*表格奇数行背景样式*/
				background-color:#9bf7d5;
			}
			.two{/*表格偶数行背景样式*/
				background-color:#f3e99a;
			}
			.over{/*鼠标悬停在某行高亮样式*/
				background-color:ef7125;
			}
		</style>
	</head>
	<body>
		<script type="text/javascript">
		
			var name;//该变量用于制作【二】,记录原样式
			//【一】行颜色间隔显示功能。
			function trColor(){
				
				//【一(1)】获取表格对象
				var oTabNode = document.getElementById("mailtable");
				
				//【一(2)】因为要做行间隔显示功能,所以需要拿到所有行节点对象,【记住】要操作什么节点,就获取什么节点,这点万变不离其宗
				var collTrNodes = oTabNode.rows;
				
				//【一(3)】对所有需要设置背景的行节点对象进行遍历(【注意】这里循环初值从1开始,因为1对应表格第二行,表格第一行背景无需设置
				for(var x=1;x<collTrNodes.length-1;x++){//【注意】本例中表格最后一行也不需要设置背景
					
					if(x%2 == 1){//奇数行
						collTrNodes[x].className = "one";
					}else{//偶数行
						collTrNodes[x].className = "two";
					}
				
					//【二】添加光标悬停高亮、离开恢复的功能
					/*
					 *因为表格除了头尾两行外,每行都需要该功能,所以直接定义在这个for循环内部
					 */
					collTrNodes[x].onmouseover = function(){
						
						name = this.className;
						this.className = "over";//this表示当前鼠标悬停的一行
					}
					
					collTrNodes[x].onmouseout = function(){
						
						this.className = name;
					}
				}
			}
			
			//定义运行自定义函数的方法,必须全部加载完再调用自定义函数并运行
			onload = function(){
				
				trColor();
			}
			
			//【三】复选框的全选功能
			function checkAll(node){
				
				//【三(1)】获取所有的mail复选框
				var collMailNodes = document.getElementsByName("mail");
				
				//【三(2)】遍历所有mail复选框节点对象,将全选的checked状态逐一赋给这些复选框的checked状态。即它们checked状态统一
				for(var x=0;x<collMailNodes.length;x++){
					
					collMailNodes[x].checked = node.checked;
				}
			}
			
			//【四】定义操作复选框按钮的方法。
			function checkAllByBut(num){
				
				var collMailNodes = document.getElementsByName("mail");
				
				for(var x=0;x<collMailNodes.length;x++){
					
			//从table中的最后一个tr节点可知,num只能有三种形式:0、1、2
					if(num>1){
						/*
						 *num>1即num=2,说明此时是“反选”按钮在调用function,那根据反选的含义:原来选中的现在
						 *不选,原来不选的现在选,也就是将当前遍历到的mail复选框的checked属性取非运算。
						 */
						collMailNodes[x].checked = !collMailNodes[x].checked;
					}else{
						/*
						 *这里说明为什么table最后一个tr节点中的“全选”、“取消全选”、“反选”三个按钮中的onclick事件传入1、0、2三个数字:
						 *
						 *因为这里else说明num<=1,即num=1或0,那么如果num=1说明是“全选”,即所有mial复选框都要被选中,即所有mail复选框
						 *的checked属性都必须为true,那么num此时为1,1就是真,所以将num赋给collMailNodes[x].checked;同样,如果num=0,
						 *说明是“取消全选”,即所有mail复选框都不选,即素有mail复选框的checked属性都必须为false,那么num此时为0,0就是
						 *假,所以将num赋给collMailNodes[x].checked。所以只要不是“反选”,直接将num赋给collMailNodes[x].checked。
						 */
						
						collMailNodes[x].checked = num;
					}
				}
			}
			
			//【五】删除所选邮件功能
			function deleteMail(){
				
				//因为本程序还没设置“恢复删除邮件”的功能,所以这里加个提示判断
				if(confirm("您真的要删除吗?注意,删除后不可恢复!")){
					
					//【五(1)】获取所有mail节点
					var collMailNodes = document.getElementsByName("mail");
					
					//【五(2)】遍历所有mail复选框,判断是否被选中,选中就删除一行
					for(var x=0;x<collMailNodes.length;x++){
						
						if(collMailNodes[x].checked == true){
							
							/*
							 *如果if条件满足,说明该mail复选框已被选中,即准备删除该行,所以先拿到其行节点,观察table内代码发现,
							 *mail复选框的父节点是td,td的父节点是tr,所以mail复选框是tr节点的“孙子”,所以连续两次调用parentNode
							 *即可拿到被选中行的行节点对象。
							 */
							var oTrNode = collMailNodes[x].parentNode.parentNode;
							oTrNode.parentNode.removeChild(oTrNode);
			/*
			 *【特别注意】说明为什么要x--?
			 *如果没有x--,当选中表格中“张三22”、“张三33”、“张三44”、“张三55”这4行邮件,然后单击“删除所选附件”按钮,
			 *会出现“张三22”和“张三33”被干掉,而“张三33”和“张三44”还保留,原因如下:
			 *【记住】只要是remove相关方法,就一定改变数组长度,比如一个容器中有2、3、4、5这四个元素,角标是0、1、2、3,此时
			 *指针port指向第一个元素,即停在角标0位置,当用remove删除第一个元素后,后面三个元素一次向前“补位”,但是此时指针
			 *port指向第二个元素,即停在角标1位置,这时候角标1上的元素是4,然后再调用remove删除该位置上的元素,所以本来想一次
			 *删除4个元素,现在变成删除2和4,3和5保留,这就是原因。(可以自己动手画个草图,一目了然)
			 *
			 *【解决办法】让指针在每删除一个元素时候,回到前一个位置,即x--,因为remove方法删一个元素,指针会右移一位,这样
			 *保证指针自始至终都指向容器起始位置。
			 */
							x--;
						}
					}
					//在删除部分邮件后,让界面再次恢复行间隔显示效果。
					trColor();//如果不再调用trColor()方法,会导致删除部分邮件后,不再是行间隔显示效果。
				}
			}
				
		
		</script>
		
		<table id="mailtable">
			<tr>
				<th>
					<input type="checkbox" name="selectall" οnclick="checkAll(this)" />全选
				</th>
				<th>
					发件人
				</th>
				<th>
					邮件名称
				</th>
				<th>
					邮件附属信息
				</th>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三11
				</td>
				<td>
					我是邮件11
				</td>
				<td>
					我是附属信息11
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三22
				</td>
				<td>
					我是邮件22
				</td>
				<td>
					我是附属信息22
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三33
				</td>
				<td>
					我是邮件33
				</td>
				<td>
					我是附属信息33
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三44
				</td>
				<td>
					我是邮件44
				</td>
				<td>
					我是附属信息44
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三55
				</td>
				<td>
					我是邮件55
				</td>
				<td>
					我是附属信息55
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三66
				</td>
				<td>
					我是邮件66
				</td>
				<td>
					我是附属信息66
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三117
				</td>
				<td>
					我是邮件117
				</td>
				<td>
					我是附属信息117
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三118
				</td>
				<td>
					我是邮件118
				</td>
				<td>
					我是附属信息118
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三119
				</td>
				<td>
					我是邮件119
				</td>
				<td>
					我是附属信息119
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三1100
				</td>
				<td>
					我是邮件1100
				</td>
				<td>
					我是附属信息1100
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三11a
				</td>
				<td>
					我是邮件11a
				</td>
				<td>
					我是附属信息11a
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三11b
				</td>
				<td>
					我是邮件11b
				</td>
				<td>
					我是附属信息11b
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三11c
				</td>
				<td>
					我是邮件11c
				</td>
				<td>
					我是附属信息11c
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三11d
				</td>
				<td>
					我是邮件11d
				</td>
				<td>
					我是附属信息11d
				</td>
			</tr>
			<tr>
				<td>
					<input type="checkbox" name="mail" />
				</td>
				<td>
					张三11e
				</td>
				<td>
					我是邮件11e
				</td>
				<td>
					我是附属信息11e
				</td>
			</tr>
			<tr>
				<th>
					<input type="checkbox" name="selectall" οnclick="checkAll(this)" />全选
				</th>
				<th colspan="3">	<!-- 【注意】这个colspan必须有,意思是将三个单元格合并成一列 -->
		<!--
		【注意】在做效果【四】的时候,由于“全选”、“取消全选”、“反选”这三个功能类似,所以可以定义在同一个function内,
		但是你怎么知道当前function应该为哪个按钮所用?即你怎么知道当前是哪个按钮在调用function,所以在下面三个按钮中定义
		事件onclick,通过往里面传值1、0、2来区分不同的按钮操作。
		-->				
					<input type="button" value="全选" οnclick="checkAllByBut(1)" />
					<input type="button" value="取消全选" οnclick="checkAllByBut(0)" />
					<input type="button" value="反选" οnclick="checkAllByBut(2)" />
					<input type="button" value="删除所选附件" οnclick="deleteMail()" />
				</th>
			</tr>
		</table>
	</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值