DOM(三)-01-(示例-邮件列表)
2015-08-20 17:18
411 查看
表格样式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" onclick="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" onclick="checkAll(this)" />全选 </th> <th colspan="3"> <!-- 【注意】这个colspan必须有,意思是将三个单元格合并成一列 --> <!-- 【注意】在做效果【四】的时候,由于“全选”、“取消全选”、“反选”这三个功能类似,所以可以定义在同一个function内, 但是你怎么知道当前function应该为哪个按钮所用?即你怎么知道当前是哪个按钮在调用function,所以在下面三个按钮中定义 事件onclick,通过往里面传值1、0、2来区分不同的按钮操作。 --> <input type="button" value="全选" onclick="checkAllByBut(1)" /> <input type="button" value="取消全选" onclick="checkAllByBut(0)" /> <input type="button" value="反选" onclick="checkAllByBut(2)" /> <input type="button" value="删除所选附件" onclick="deleteMail()" /> </th> </tr> </table> </body> </html>
相关文章推荐
- 读取bq26500电池电量 Driver
- Oracle自增序列
- struts2用户是否登录拦截器,拦截之后异步跳转到登录页面
- 【转】Eclipse配置Struts2问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- 安卓突击:Android 动画有哪几种?
- 如何识别真正的程序员
- 基于 OpenFlow 实现网络虚拟化
- linux挂载
- Android性能优化之内存篇-google
- POJ 3984:迷宫问题【BFS】
- photoshop制作艺术字视频教学
- 收藏下 Unicode范围
- Hue3.9 安装教程:华丽的Spark,Hadoop UI
- Android中AsyncTask的简单用法
- 关于IOS searchbar更改背景
- DOM(二)-13-(示例-全选商品列表)
- 网络请求与数据解析
- WPF/Silverlight 页面绑定Model验证机制升级版
- android --学习导航
- QCOM平台子系统通过AP处理异常