GridView实现跟随鼠标移动及单击高亮显示
看着一些表格带那些鼠标移动过去的时候会触发tr的背景颜色发生变化,当你单击某一行时,它还能以高亮的颜色显示你单击中了哪一条,相当羡慕的说啊!!!
网上面也有很多的例子,有通过C#代码的Attribute方法绑定,也有直接写JS实现的,由于觉得在服务器端实现会浪费资源(虽然很小),所以哥哥我就想在JS那里写一下,至于怎么实现,我会一步一步的把过程写出来,不着急,哈。
1、实现鼠标经过tr时,触发行的背景色发生变化,一开始的念头是通过onmouseover 和 onmouseout 来实现的,于是就写了下面一段出来(Gridview的ID值是 gvE4,下同)
1 $("#gvE4").find("tr").attr("onmousemove","c=this.style.backgroundColor;this.style.backgroundColor='#DFF8FF'"); 2 $("#gvE4").find("tr").attr("onmouseout","this.style.backgroundColor=c");
思路是上我觉得是没问题的,但最后却没有反应,于是百度了一下,找到了另外一个办法,如下:
1 $("#gvE4 tr").hover( 2 function(){$(this).addClass("hover");}, 3 function(){$(this).removeClass("hover");} 4 );
这个写法很漂亮,也实用,原理简单说一下,通过设定tr的hover事件,hover(function(){},function(){})里面的第一个function是鼠标经过时触发的,第二个function是鼠标离开时触发的,而里面所执行的就是通过经过与离开时,动态绑定或去掉一个class属性,而这个hover类的话,在下面:
1 <style type="text/css"> 2 .hover{background-color:#DFF8FF; font-weight:bold;} /*这里是鼠标经过时的颜色*/ 3 </style>
这样,第一个功能已经实现了。
2、当鼠标单击的时候,怎么样使得被单击的一行高亮显示呢??要做到两点:单击的那一行高亮显示、其它行要去掉高亮效果。
那要做到这两步的话,有一个简单的方法:先把所有的行数都去掉高亮,然后再为被单击的那一行添加高亮效果,代码如下:
1 $("#gvE4 tr td").click(function(){ 2 $(this).parent().parent().find("tr").attr("style","height:28px;"); 3 $(this).parent().attr("style","height:28px;background-color:#DFF8FF; font-weight:bold;"); 4 });
这样子以后,当鼠标单击某一行时,它就会被高亮显示出来,但是,令人蛋疼的是,由于GridView的分页功能,它的页脚那里鼠标经过或被单击时,也会以高亮显示,见下图(最底部):
图一、分页下方也被高亮显示了
这样的效果真的会让人看得蛋疼,于是反复的看了一下jquery的手册,想办法只选中前面几个tr,而把最后一行tr排除在外就行了,于是看到过last,也看到过eq的用法,最后又看到了lt,一翻偿试后,发现lt能够解决这个办法,但也不能一劳永逸,先看看代码我再说一下吧。
由于我是选解决那个鼠标移动时的问题再解决单击时产生的问题,所以我先说说第一个解决办法:
1) 都晓得,css属性background-color与直接定义标签的background-color属性的优先级别不一样的,实验证明,内置的属性优先级别要比css那个高,所以,只要我把它的背景颜色直接设置为白色,那么无论它怎么通过addClass或removeClass都不会影响到它的外观,嘿嘿,于是嘛,直接在gridview的属性栏把分页的背景设成白色了,然后运行看,鼠标移动过去时,木有变化,哈哈,设置的传送门在下面:
图二、设置分页的背景颜色,直接回避该问题
2) 当然,会了第二个方法的话,第一个可以不鸟它,咱们用点高深点的办法,就是上面我提到过的lt那个jquery选择器了,我不说太多,真接上代码:
1 $("#gvE4 tr td").click(function(){ 2 $(this).parent().parent().find("tr:lt(11)").attr("style","height:28px;"); 3 $(this).parent().attr("style","height:28px;background-color:#DFF8FF; font-weight:bold;"); 4 });
有看懂那个find("tr:lt(11)")吗?先看看lt()的用法,直接翻译过来就是:选中前11个tr标签。为什么会是11呢?这个就是我上面说的不是一个一劳永逸的办法,首先,1是那个表格的标题行,而剩下的10是我的分页记录数,我设成是10了,所以前11的肯定不会选中那一行分页栏,至此,运行一下,嘿嘿,还有问题。。。单击分页栏时,还是会高亮显示,尼玛,这不白忙吗。。。于是一通检查,终于发现,第一句没事了,出事就出在第二句:它不会识别你当前点的是哪一行,还会自动着色,我了个去了,于是又陷入苦想,怎么样区别它呢???打开网页源代码发现,分页那一栏嵌入了一个一行N列的表格table,既然这样,哥哥又想到办法了,单击时,判断一下该行是不是有嵌一个表格来判断是否是分页栏位,如下:
1 $("#gvE4 tr td").click(function(){ 2 $(this).parent().parent().find("tr:lt(11)").attr("style","height:28px;"); 3 if($(this).find("tr").length == 0 ){ 4 $(this).parent().attr("style","height:28px;background-color:#DFF8FF; font-weight:bold;"); 5 } 6 });
至此,整个功能做出来了,感觉又学到点东西了,先记下来,以后不会还能回过头来看看
PS:上面可能写得不算好,各位借鉴时请谨慎,另外,有砖丢砖,没砖打赏点也行~~
1 <script language="javascript" type="text/javascript"> 2 $(document).ready(function(){ 3 $("#ShowListInfo").attr("style","display:none;"); 4 $("#btnBack").attr("style","display:none;"); 5 // $("#gvE4").find("tr").attr("onmousemove","c=this.style.backgroundColor;this.style.backgroundColor='#DFF8FF'"); 6 // $("#gvE4").find("tr").attr("onmouseout","this.style.backgroundColor=c"); 7 $("#gvE4 tr").hover( 8 function(){$(this).addClass("hover");}, 9 function(){$(this).removeClass("hover");} 10 ); 11 $("#gvE4 tr td").click(function(){ 12 //由于GridView是以10條記錄為一頁,算上表格標題和分頁的那一行的話,如果出現分頁,則本表格tr行數應超過11行,否則就沒有分行,故可以此作為一個判斷標准。 13 $(this).parent().parent().find("tr:lt(11)").attr("style","height:28px;"); 14 if($(this).find("tr").length == 0 ){ 15 $(this).parent().attr("style","height:28px;background-color:#DFF8FF; font-weight:bold;"); 16 } 17 }); 18 19 // 20 // $("#gvE4 tr td").click(function(){ 21 // var e = $(this).parent(); 22 // $(this).parent().parent().find("tr").attr("style","border-color:White;border-width:0px;height:28px;"); 23 // $(this).parent().attr("style","border-color:White;border-width:0px;height:28px;background-color:#DFF8FF; font-weight:bold;"); 24 // }); 25 26 }); 27 </script> 28 <style type="text/css"> 29 .hover{background-color:#DFF8FF; font-weight:bold;} /*这里是鼠标经过时的颜色*/ 30 #gvE4 table tr td 31 { 32 background-color:#FFFFFF; 33 font-weight:normal; 34 } 35 th 36 { 37 background-color:#FFFFFF; 38 background-image:url(images/win_top.png); 39 height: 26px; 40 font-weight:bold; 41 color: #FFF; 42 } 43 .style1 44 { 45 width: 100%; 46 } 47 </style>