一、js代码——"tablehover.js"

/**
      *②、表格单元行滑过时高亮样式动效组件封装
      *oop形式封装交互动效类
      *组件说明这个组件是为了向下兼容到IE6,因为IE6不支持tr:hover这种形式的伪类,而在ff等标准浏览器中是支持的,这样写:
      .tablelist td{border:none;border-bottom: 1px solid #d0d9d9;}//注意:td初始状态下是不给背景色的,滑过时才写
      所以这段组件代码要开IETest6的环境下测试
    .tablelist tr:hover td{background: #e2f3fe;color: #2d9ff1;}
      *@param     tableid   表格对象的上下文环境
      *@param     tdColor   滑过时单元格内字体的颜色值
      *@param     rowBgColor滑过时表格行背景色
      *@param     tdColorDefault     非滑过时单元格内字体的颜色
      *@param     rowBgColorDefault  非滑过状态下表格行背景色
      *@param     或传入table对象  里面的配置属性写法是
      *var tabdom = {//   配置对象的各个参数即可,再不用往构造器中传一堆参数了
        tableid:'tablelist',
        hovercolor:'#2d95f1',
        hoverbgcolor:'#e2f3fe',
        defaultcolor:'#333',
        defaultbgcolor:'#fff'
      };
      *其整体调用写法是:
      *var tb = new TableRowHover(tabdom);
       // alert(tb instanceof TableRowHover);true证明tb是TableRowHover类的实例
       tb.togglerow();
      *
      **/
function TableRowHover(table){
     this.tableId = typeof table.tableid == 'string'?document.getElementById(table.tableid) : table.tableid;
     // if (this.tableId) {alert(this.tableId)};//弹出[objectdivelement],证明获取到了父table节点了
     this.tdColor = table.hovercolor;
     this.rowBgColor = table.hoverbgcolor;
     this.tdColorDefault = table.defaultcolor;
     this.rowBgColorDefault = table.defaultbgcolor;
};
TableRowHover.prototype = {
     togglerow:function(){
         var that = this;
         // alert(this.tableId.rows.length);
         for(var i = 1;i<this.tableId.rows.length;i++){
             var row = this.tableId.rows[i];
             // console.log(row);
             if (document.addEventListener) {//ff
                 // console.log(this.tableId.rows.length);//进来了
                 row.addEventListener('mouseover',function(e){
                     var ev = e || window.event; //注意:这里的写法,事件对象的获取只在事件紧跟着触发的事件句柄函数里面才能获取的到(生效),在句柄函数的子函数里面等情况是获取不到的,一定要注意这个坑,正确做法就是,现在父句柄函数里面获取到事件对象,再通过传参传入到子函数中即可
                     that.setRowColor(that,ev);
                 },false);
                 row.addEventListener('mouseout',function(e){
                     var ev = e || window.event;
                     that.setDefaultRowColor(that,ev);
                 },false);
             } else if(document.attachEvent) {//IE6
                 // alert(this.tableId.rows.length);//这也进来了
                 row.attachEvent('onmouseover',function(e){
                     var ev = e || window.event;
                     that.setRowColor(that,ev);//这样传值后IE6终于搞定了
                 });
                 row.attachEvent('onmouseout',function(e){
                     var ev = e || window.event;
                     that.setDefaultRowColor(that,ev);
                 });
             } else{
                 row.onmouseover = function(e){
                     var ev = e || window.event;
                     that.setRowColor(that,ev);
                 }
                 row.onmouseout = function(e){
                     var ev = e || window.event;
                     that.setDefaultRowColor(that,ev);
                 }
             }
         }
     },
     setRowColor:function(parent,ev){//传值设置表格行颜色
         // console.log(parent.rowBgColor);//ok搞定,就是这样的父元素this引用的问题,在这里this看不见,只有当参数传进来才能引用父构造器里面的颜色属性
        src = ev.srcElement || ev.target;
        if (src.tagName == 'TD') {
            src.parentNode.style.backgroundColor = parent.rowBgColor;
            var tds = src.parentNode.getElementsByTagName('td');
            for(var i = 0;i<tds.length;i++){
                tds[i].style.color = parent.tdColor;
            }
        };
     },
     setDefaultRowColor:function(parent,ev){//传值设置表格行颜色
         // console.log(parent.rowBgColorDefault);//进来了
        src = ev.srcElement || ev.target;
        if (src.tagName == 'TD') {
            src.parentNode.style.backgroundColor = parent.rowBgColorDefault;
            var tds = src.parentNode.getElementsByTagName('td');
            for(var i = 0;i<tds.length;i++){
                tds[i].style.color = parent.tdColorDefault;
            }
        };
     }
}

[解析]:

1、第一个坑:row.addEventListener('mouseover',function(e){
                   
 var ev = e || window.event;
//注意:这里的写法,事件对象e的获取只在事件紧跟着触发的事件句柄函数里面才能获取的到(生效),在句柄函数的  子函数里面等情况是获取不到的,一定要注
意这个坑,正确做法就是,现在父句柄函数里面获取到事件对象,再通过传参传入到子函数中即可

that.setRowColor(that,ev);

最后在子函数里面获取事件源对象ev.srcElement,这是可以的

setRowColor:function(parent,ev){
       
        src = ev.srcElement || ev.target;

...

2、第二个坑:就是父构造器的this指向的问题。

一般来说,父构造器中的this.属性在其原型的方法里面是能够直接看到并被引用的。

但是一旦遇到了事件触发,并需要再其事件的句柄函数中引用构造器this,那么这就不好使了,因为事件的句柄函数中的this默认是指向触发事件的元素的

togglerow:function(){
         var that = this;

这时的解决办法只有将构造器this对象存入一个变量中,如上面的that,用that变量指向构造器的this,来调用构造器中定义的属性和原型方法

row.addEventListener('mouseover',function(e){
                   
 var ev = e || window.event;
                     that.setRowColor(that,ev);
                 },false);

3、优化:就是配置参数对象了,与其向构造器中传一长串参数,不如只传一个配置对象,如:*var tabdom = {//   配置对象的各个参数即可,再不用往构造器中传一堆参数了
        tableid:'tablelist',
        hovercolor:'#2d95f1',
        hoverbgcolor:'#e2f3fe',
        defaultcolor:'#333',
        defaultbgcolor:'#fff'
      };
      *其整体调用写法是:
      *var tb = new TableRowHover(tabdom);

那么构造器那边获取就这样写:

function TableRowHover(table){
     this.tableId = typeof table.tableid == 'string'?document.getElementById(table.tableid) : table.tableid;
     this.tdColor = table.hovercolor;
     this.rowBgColor = table.hoverbgcolor;
     this.tdColorDefault = table.defaultcolor;
     this.rowBgColorDefault = table.defaultbgcolor;
};

二、html部分(验证上面js封装的效果)

<!-- 主体部分 -->
    <div class="listfile">
        <h1 class="list-title">文件草稿列表</h1>
        <div class="btn-group clearfix">
            <ul class="clearfix">
                <li><a href="" style="background:#3091f0;color:#fff;"><i class="add-icon"></i><span class='icon-txt'>新增</span></a></li>
                <li><a href="">修改</a></li>
                <li><a href="">删除</a></li>
                <li><a href="">送盖章</a></li>
                <li><a href="">查询</a></li>
            </ul>
            <span style="display:inline-block;height:34px;line-height:34px;padding-left:20px;color:#333;">当前显示的是2016-2-29后的公文,查询之前的公文请点击"查询"按钮</span>
        </div>
        <table border="0" cellspacing="0" cellpadding="0" class="tablelist" id="tablelist">
            <colgroup>
                <col class="col1" />
                <col class="col2" />
                <col class="col3" />
                <col class="col4" />
                <col class="col5" />
            </colgroup>
            <thead>
                <tr>
                    <th><input type="checkbox" /></th>
                    <th>文号</th>
                    <th>标题</th>
                    <th>发文单位</th>
                    <th>登记时间</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
                <tr>
                    <td><input type="checkbox" /></td>
                    <td>某某某2016aaaaaaaa</td>
                    <td>湖北某某某企业某某某文件</td>
                    <td>某某某某某某某某某企业</td>
                    <td>2016-3-3 10:00:00</td>
                </tr>
            </tbody>
        </table>
        <div class="pagebg">
            <div class="page">
                <ul class="clearfix">
                    <li class="pre_next"><a href="" class="pre_next">上一页</a></li>
                    <li><a href="">1</a></li>
                    <li><a href="">2</a></li>
                    <li><a href="">3</a></li>
                    <li><a href="">4</a></li>
                    <li><a href="">5</a></li>
                    <li><a href="">6</a></li>
                    <li class="pre_next"><a href="" class="pre_next">下一页</a></li>
                </ul>
            </div>
        </div>
        
    </div>

.

.

.

<script type="text/javascript" src="./tablehover.js"></script>
<script type="text/javascript">
    var tabdom = {//配置对象的各个参数即可,再不用往构造器中传一堆参数了
        tableid:'tablelist',
        hovercolor:'#2d95f1',
        hoverbgcolor:'#e2f3fe',
        defaultcolor:'#333',
        defaultbgcolor:'#fff'
    };
    var tb = new TableRowHover(tabdom);
    // alert(tb instanceof TableRowHover);true证明tb是TableRowHover类的实例
    tb.togglerow();
</script>

兼容ie6及以上和firefox等标准浏览器的表格行滑过时背景色切换的效果的更多相关文章

  1. 兼容ie6及以上的表格行滑过时背景色切换的效果

    ;(function(window){    var tb = document.getElementById('tablelist');    function trfocus(){//为了兼容IE ...

  2. 图片水平垂直居中(兼容IE6,IE7,firefox,opera,safari,其中图片可以是任何块元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 在页面左右一个悬浮div兼容IE6 IE7 8 9 Firefox chrome

    在页面左右一个悬浮div兼容IE6 IE7 8 9 Firefox chrome #identifier-pannel { bottom: 345px; margin-left: 512px; pos ...

  4. CSS兼容IE6 IE7 IE8 IE9 Firefox的总结

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 网页重构中区分IE6、IE7、IE8及标准浏览器的最佳方法

    由于万恶的IE6和IE7,我们在页面重构时不免要对其进行各种bug修复及差异化处理.在标准浏览器中可实现的效果在IE里却有各种离奇问题,例如IE6.IE7不能良好应对的inline-block和.cl ...

  6. 七行jquery代码实现图片渐变切换【兼容ie6+、 Chrome、 Firefox】

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. ie6 7 8 9 firefox的css兼容问题

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 最新区分兼容IE6/IE7/IE8/IE9/FF的CSS HACK写法和Css if hack条件语法操作说明

    自从安装了IE8.0正式版本!木头 就对基本的几个 CSS HACK的做一下归纳!希望对网页前端布局DIV+CSS的实施者有所帮助! 本文就主要以:IE6+IE7+IE8+IE9+FF为主要研究对象 ...

  9. 区分兼容IE6/IE7/IE8/IE9/FF的CSS HACK写法

    HACK原理:不同浏览器对各中字符的识别不同 在 CSS中常用特殊字符识别表: (1)*:  IE6+IE7都能识别*,而标准浏览器FF+IE8是不能识别*的; (2)!important: 除IE6 ...

随机推荐

  1. C#入门经典第八章面向对象编程简介-1

    面向对象编程(Object-Oriented Programming,OOP)技术 本章中的OPP实际上是.NET OOP,这里讲的一些技术不能应用于其他OOP环境.

  2. plsql找外键约束关联的表的方法

    直接Ctrl + 鼠标左键 表名 就可以找到参照表(关联表)的名称 下面的是复杂的方法 这个就是关联的表 这里右键查看 可以查看到参照的表

  3. zf-关于SYS_User表type的分类

    type=1 表示管理员 type=2 表示领导 type=3 表示非领导

  4. Html 中表单提交的一些知识总结——防止表单自动提交,以及submit和button提交表单的区别

    转自:http://jackaudrey.blog.163.com/blog/static/1314217882010590041833/ 在页面中有多个input type="text&q ...

  5. Android ---paint类

    引自:http://www.cnblogs.com/-OYK/archive/2011/10/25/2223624.html Android Paint和Color类   要绘图,首先得调整画笔,待画 ...

  6. .htaccess 保护文件夹

    想要保护admin文件夹,经过以下两个步骤: 步骤一.可以用记事本新建文件.htaccess,输入以下内容: AuthType BasicAuth UserFile D:/AppServ/www/Hi ...

  7. BLDC(无刷直流电机)应用相关

    1.基于XC866的直流无刷电机简易正弦波控制 http://blog.gkong.com/hushunlin_219521.ashx 2.无刷直流电机的PWM调制方式介绍 http://blog.g ...

  8. Varnish Cache

    1 Varnish简介 Varnish是高性能且开源的反向代理服务器和HTTP加速器(cache server).其开发者Poul-Henning Kamp是FreeBSD核心的开发人员之一.Varn ...

  9. Hibernate---O/R Mapping

    1. JDBC数据库繁琐 2. sql语句不是面向对象 3. 可以在对象和关系表之间建立关联简化编程 4. O/R Mapping可以简化编程, 跨越数据库平台 比较流行的O/R Mapping Fr ...

  10. Hadoop详解一:Hadoop简介

    从数据爆炸开始... 一. 第三次工业革命        第一次:18世纪60年代,手工工厂向机器大生产过渡,以蒸汽机的发明和使用为标志.      第二次:19世纪70年代,各种新技术新发明不断被应 ...