高亮显示web页表格行的javascript代码


Posted in Javascript onNovember 19, 2010

本篇作为开发学习笔记之一。
[文]
在web开发中经常遇到需要加亮鼠标指向的表格行的情况。首先说说一般的情况。
·简单尝试
CSS2中允许我们对HTML元素使用hover伪类,这极大的方便了对于表格的样式的控制。
我们从一个小例子开始:
XHTML(只列出了表格部分,请自行补完页面,本例在Transational的DTD下通过):

<table class="datatable" cellspacing="0"> 
<thead> 
<tr> 
<th>Item</th> 
<th>Value</th> 
</tr> 
</thead> 
<tbody> 
<tr class="oddRow"> 
<td>项目Item1</td> 
<td>值Value1</td> 
</tr> 
<tr class="evenRow"> 
<td>项目Item2</td> 
<td>值Value2</td> 
</tr> 
<tr class="oddRow"> 
<td>项目Item3</td> 
<td>值Value3</td> 
</tr> 
<tr class="evenRow"> 
<td>项目Item4</td> 
<td>值Value4</td> 
</tr> 
<tr class="oddRow"> 
<td>项目Item5</td> 
<td>值Value5</td> 
</tr> 
<tr class="evenRow"> 
<td>项目Item6</td> 
<td>值Value6</td> 
</tr> 
</tbody> 
</table>

然后用CSS定义了表格的样式:
.datatable{ 
margin:15px auto; 
width:500px; /*这两行可以根据需要修改,仅为示例*/ 
} 
.datatable,.datatable tr,.datatable td,.datatable th,.datatable .tableheader td{ 
border:1px #0073ac solid; 
border-collapse:collapse; 
padding:3px; 
} 
.datatable .tableheader td,.datatable th{ 
font-weight:bold; 
background:#fff url(images/thead.png) repeat-x; 
padding:8px 5px; 
} 
.datatable tr:hover{ 
background-color:#cfe9f7; 
}

对于css的部分,不做过多解释。请注意最后加粗的部分,对tr元素应用了伪类hover的样式。这在对CSS2支持的浏览器下(IE7+,FF,Opera,Safari等)运作的十分完美。然而CSS1仅提供对于锚元素a的伪类支持,遗憾的是IE6仍然只支持CSS1的伪类。于是我们要进行修改,提供对于IE6的支持。
首先增加一个样式:
.datatable .trHover,.datatable tr:hover{ 
background-color:#cfe9f7; 
}

此处增加了一个trHover的类,用以修正IE6下的显示。接下来就是书写javascript了。最初的想法非常简单,你不是要鼠标指向时高亮当前行么?于是就对每一行应用javascipt呗。首先写一个javascript的函数。为了统一我把加亮和撤销加亮合并到一个函数中了,这样就可以简化函数调用,对tr的mouseover和mouseout事件绑定一个函数就行了。
function highlightTr(o){ 
var regStr=/\b\s*trHover\b/g; /*正则表达式过滤trHover类*/ 
if(o.className.indexOf('trHover')==-1) 
o.className+=" trHover"; 
else 
o.className=o.className.replace(regStr,""); 
}

这里用到一个小技巧:正则表达式替换。因为你的tr元素可能有其他样式(类)——比如本例的evenRow和oddRow,所以不能简单的在撤销高亮时把对象的className置空。然后就如大家想象的,给tr绑定事件吧:
<tr class="oddRow" onmouseover="highlightTr();" onmouseout="hightlightTr();"> 
<td>项目Item1</td> 
<td>值Value1</td> 
</tr>

给所有的tr写上事件绑定就可以了。然而这样做也有问题:1、增加了页面的代码量。2、如果表格是由后台服务端程序输出的,有时不允许你给tr元素绑定javascript函数。怎么办?直接的想,可以用js在页面某范围里搜索该样式的表格,然后绑定tr的事件。不过我们今天换个思路,直接对table元素绑定js事件,实现对某一行的高亮!
这种想法是有根据的。这不得不说说浏览器的事件模型。由于历史原因,各种浏览器在实现javascript事件响应上有差异,然而基本思路还是一致的。js事件在W3C DOM中被描述成捕获-冒泡模型。简单的说有点像下饺子,饺子逐渐沉到锅底,接受了热传递,慢慢漂到上面。回到模型本身,javascript事件有两大类,首先从最外层的元素捕获事件,逐渐向内传递到触发事件的元素——这叫事件捕获,然后再逐渐向外扩展到外层元素——这叫做事件冒泡。IE的实现不支持捕获类型的事件,对冒泡型事件的实现与W3C DOM标准也略有区别,但总体思路是一样的。
说了半天,我们这次就是想用事件的冒泡处理机制来达到高亮表格行的目的。
再次重申,冒泡事件是从触发javascript事件的最内层元素扩散到外层的,就像石子激起的涟漪一样。鼠标滑过某一行,首先最内层元素比如td里的文本或者其他元素触发mouseover,接下来传到td-->tr-->tbody-->table依次响应mouseover事件,鼠标移出时,也有这种依次冒泡的过程。这就是我们这样处理事件响应程序的根据。
首先,我们需要修改XHMTL中的事件绑定代码。去掉tr元素中mouseover和mouseout的事件处理,随后给table加上事件处理。最后表格变成这样:
<table class="datatable" cellspacing="0" onmouseover="highlightTr();" onmouseout="highlightTr();"> 
<thead> 
<tr> 
<th>Item</th> 
<th>Value</th> 
</tr> 
</thead> 
<tbody> 
<tr class="oddRow"> 
<td>项目Item1</td> 
<td>值Value1</td> 
</tr> 
<tr class="evenRow"> 
<td>项目Item2</td> 
<td>值Value2</td> 
</tr> 
<tr class="oddRow"> 
<td>项目Item3</td> 
<td>值Value3</td> 
</tr> 
<tr class="evenRow"> 
<td>项目Item4</td> 
<td>值Value4</td> 
</tr> 
<tr class="oddRow"> 
<td>项目Item5</td> 
<td>值Value5</td> 
</tr> 
<tr class="evenRow"> 
<td>项目Item6</td> 
<td>值Value6</td> 
</tr> 
</tbody> 
</table>

和最初我们写的表格相比,只多了table元素的js事件绑定。接下来就是给我们的hightlightTr函数做个大手术了!这里先把最终的代码贴出来然后一起分析:
<script type="text/javascript"> 
//<!-[CDATA[ 
//该函数修正IE6不能识别TR元素hover伪类的bug 
function highlightTr(){ 
var theEvent=window.event||arguments.callee.caller.arguments[0]; 
var srcElement = theEvent.srcElement; 
if (!srcElement) 
{ 
srcElement = theEvent.target; 
} 
if(!srcElement.parentNode) return false; 
var o=srcElement.parentNode; 
while(o.parentNode&&o.tagName!="TR") 
{ 
if(o.tagName=="TABLE") break; 
else o=o.parentNode; 
} 
var regStr=/\b\s*trHover\b/g; 
if(o.className.indexOf('trHover')==-1) 
o.className+=" trHover"; 
else 
o.className=o.className.replace(regStr,""); 
} 
//]]> 
</script>

修改后的hightlighTr的版本的思路是这样的:1、处理事件,获得触发javascript事件的页面元素。2、寻找它的父节点,直到找到tr。3、进行样式处理。
值得说的就是获得触发事件元素的部分考虑了浏览器兼容性。IE的事件模型里window对象有一个event属性,而W3C DOM标准event对象必须作为唯一参数传给事件处理函数,于是它便存在于函数的一个隐藏的参数(在参数列表第0个)里。接下来就是防止异常的一些判断之类的了。最终实现还是由修改元素样式表来完成。
至此整个兼容不同浏览器的高亮表格行的旅行结束了(好长的定语-口-)。很好玩吧~ 文中难免疏漏差错,如果对本文有建议或意见欢迎批评指正~ ^_^
Javascript 相关文章推荐
javascript 面向对象编程 万物皆对象
Sep 17 Javascript
仿jQuery的siblings效果的js代码
Aug 09 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
Nov 13 Javascript
js汉字转拼音实现代码
Feb 06 Javascript
js中把JSON字符串转换成JSON对象最好的方法
Mar 21 Javascript
JavaScript中用于生成随机数的Math.random()方法
Jun 15 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
Node.js开发第三方微信公众平台
Jun 05 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
Dec 07 Javascript
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
May 13 Javascript
详解CocosCreator项目结构机制
Apr 14 Javascript
javascript tips提示框组件实现代码
Nov 19 #Javascript
突发奇想的一个jquery插件
Nov 19 #Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 #Javascript
基于jQuery的获得各种控件Value的方法
Nov 19 #Javascript
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 #Javascript
使用jQuery的将桌面应用程序引入浏览器
Nov 19 #Javascript
DIV菜单层实现代码
Nov 19 #Javascript
You might like
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
Jquery实现自定义tooltip示例代码
2014/02/12 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
JS实现的简单下拉框联动功能示例
2018/05/11 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
微信小程序云开发详细教程
2019/05/16 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
Python 处理图片像素点的实例
2019/01/08 Python
django 控制页面跳转的例子
2019/08/06 Python
Python类继承和多态原理解析
2020/02/05 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
美国社交购物市场:MassGenie
2019/02/18 全球购物
大学学习生活感言
2014/01/18 职场文书
迎国庆演讲稿
2014/09/05 职场文书
委托书的写法
2014/09/16 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书