zoukankan      html  css  js  c++  java
  • JavaScript表头固定,内容滚动查询插件

    对于有些页面列数很多的table,无法使用合适的宽度来全显示的话,可以采用固定表头,然后表体内容可以滚动查询,这样就既可以看到表头信息,同时也可以让每列的宽度设定成最佳呈现宽度,以下是自己写的一个插件 , 原理是利用js将table拆分成两个table,并分别塞进两个div里头进行样式调整和滚轮绑定,请看代码:

    JS代码:

    (function(win,doc,undefined){
    var splitTable = function(table,srow,newId){
    this.table = doc.getElementById(table);
    this.author = "Aaron Li";
    this.srow=srow;
    this.newId=newId;
    this.init();
    }
    splitTable.prototype={
    constractor:splitTable,
    init:function()
    {
    var _self=this;
    var split=_self.table.getAttribute("split");
    if (split.toString()=="true")
    {
    _self.cutTable(_self.table,_self.srow,_self.newId);
    }
    },
    cutTable:function(table,srow,newId){
    var body=document.getElementsByTagName('body')[0];
    if(isNaN(srow))
    {
    console.log("msg:srow error");
    return;
    }
    srow = parseInt(srow);
    srow = srow<1?1:srow;
    srow = table.rows.length>srow?srow:(table.rows.length-1);
    var newtable = table.cloneNode(false);
    var tbody = newtable.appendChild(document.createElement("tbody"));
    table.id = newId?newId:(table.id+"_cut");
    table.parentNode.insertBefore(newtable,table);
    for(var i=0;i<srow;i++)
    {
    tbody.appendChild(table.rows[0]);
    }
    var divNode1=document.createElement("div");
    divNode1.setAttribute("id","divHeader");
    divNode1.setAttribute("style","overflow: hidden;margin-bottom: 0px;"); 
    var divNode2=document.createElement("div");
    divNode2.setAttribute("id","divTbody");
    newtable.setAttribute("style","margin-bottom: 0px; table-layout: fixed; ");
    divNode2.setAttribute("style","overflow-y: scroll; overflow-x: scroll; max-height: 245px");
    divNode2.setAttribute("onscroll","javascript:divHeader.scrollLeft = divTbody.scrollLeft;");
    table.setAttribute("style","margin-bottom: 0px; table-layout: fixed; ");
    var tableParent= table.parentNode;
    divNode1.appendChild(newtable)
    divNode2.appendChild(table);
    tableParent.appendChild(divNode1);
    tableParent.appendChild(divNode2);
    }
    
    }
    win.splitTable=splitTable;
    }(window,document))

    HTML:

    <html>
    <head></head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <style>
    </style>
    <body>
    <div id='tableParent'>
    <table class="table table-striped" id="table1" split="true">
    <tr>
    <th style=" 500px !important">Name</th>
    <th style=" 500px !important">Age</th>
    <th style=" 500px !important">Gender</th>
    <th style=" 500!important">Work</th>
    </tr>
    <tr>
    <td style=" 500px !important">Jack</td>
    <td style=" 500px !important">18</td>
    <td style=" 500px !important">Male</td>
    <td style=" 480!important">Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr> <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    <tr>
    <td>Jack</td>
    <td>18</td>
    <td>Male</td>
    <td>Doctor</td>
    </tr>
    </table>
    </div>
    </body>
    <script src="./test.js"></script>
    <script type="text/javascript">
    window.onload=function(){
    var table =new splitTable("table1",1,"table2"); 
    }
    </script>
    
    
    </html>

     我们来看一下效果:

     table的头部和表体被拆分到两个div里进行操作, 用户可以点击滑动滚轮来查看表的内容,当有多个表需要使用这种模式的时候可以调用这个插件,抵用插件的时候要定好需要使用的table的ID,同时设定split="true",同时设定好预期需要的适合的列宽,注意表头和表体都要设定,表体设定一次即可。 

    加载插件代码,同时设定table的ID,从第几行开始切割, 第三个参数是被拆分后的新table的ID,当然也可以不设,会默认生成。

    快试试吧。

    结语:插件要是能自动生成合适的列宽就更棒了,目前还没想好怎么写,插件不足的地方希望大神们多多指教。

  • 相关阅读:
    最近ACM刷题见到的没见过的名词
    最近刷题常常遇见的需要百度的知识点
    简单RPG场景实现(改
    简单RPG场景实现
    位图载入与位图移动
    动态菜单
    静态菜单
    双人五子棋
    HDU 2112 HDU Today
    音痴又音痴的LT
  • 原文地址:https://www.cnblogs.com/Aaron-Lee/p/9350706.html
Copyright © 2011-2022 走看看