高亮显示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 相关文章推荐
网页自动刷新,不产生嗒嗒声的一个解决方法
Mar 27 Javascript
jquery 插件开发备注
Aug 27 Javascript
js内置对象 学习笔记
Aug 01 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
Jun 24 Javascript
jquery异步跨域访问代码
Jun 28 Javascript
dreamweaver 8实现Jquery自动提示
Dec 04 Javascript
JavaScript实现的浮动层框架用法实例分析
Oct 10 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
Sep 16 Javascript
半个小时学json(json传递示例)
Dec 25 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
Apr 04 Javascript
layui之数据表格--与后台交互获取数据的方法
Sep 29 Javascript
angula中使用iframe点击后不执行变更检测的问题
May 10 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
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
php学习 函数 课件
2008/06/15 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
javascript中去除数组重复元素的实现方法【实例】
2016/04/12 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
教你用十行node.js代码读取docx的文本
2017/03/08 Javascript
nodejs实现大文件(在线视频)的读取
2020/10/16 NodeJs
基于mpvue小程序使用echarts画折线图的方法示例
2019/04/24 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Python入门篇之函数
2014/10/20 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
学生打架检讨书1000字
2014/01/16 职场文书
会计学专业求职信
2014/07/17 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
初中班主任教育随笔
2015/08/15 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书