一、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. the.book.of.gimp.pdf文字不显示

    逆天了,不是中文也不显示. https://bugs.freedesktop.org/show_bug.cgi?id=70529 说要升级libfreetype,可是已经是wheezy最新了,其他不稳 ...

  2. java的property

    System.currentTimeMillis() 返回以毫秒为单位的当前时间.System.gc() 垃圾回收System.getProperties().返回当前的系统属性System.getP ...

  3. Swift 项目中常用的第三方框架

    Swift 项目中可能用到的第三方框架 字数1004 阅读4091 评论17 喜欢93 这里记录下swift开发中可能用的框架 , 最近浏览了不少,积累在这里,以后用的时候方便查阅.顺便推荐给大家! ...

  4. ScreenCaptureHtmlUnitDriver.java

    https://github.com/apache/incubator-zeppelin/blob/master/zeppelin-server/src/test/java/com/webautoma ...

  5. mtp

    http://www.android.gs/mount-google-nexus-4-mtp-sd-card-on-ubuntu-and-other-linux-computers/ https:// ...

  6. PAT (Advanced Level) 1006. Sign In and Sign Out (25)

    简单题. #include<iostream> #include<cstring> #include<cmath> #include<algorithm> ...

  7. iOS之UILabel自适应大小

    //初始化一个label self.label=[[UILabel alloc] init]; //设置自动行数与字符换行 [self.label setNumberOfLines:0]; //给la ...

  8. CodeForces 620A Professor GukiZ's Robot

    水题 #include<cstdio> #include<cstring> #include<cmath> #include<stack> #inclu ...

  9. PHP 安装 redis、memcached、openssl、pdo_mysql等

        PHP openssl 扩展的安装 这些插件可以通过在 php.ini 中添加 extension 的方式来加载所需要的插件,其实在 php 的安装包里就已经有相关的插件代码包了,在 php7 ...

  10. html5 js控制音乐播放

      <!DOCTYPE HTML><html><head><meta charset="UTF-8"><script lang ...