• [转]javascript 快速隐藏/显示万行表格列的方法


    原文地址:javascript 快速隐藏/显示万行表格列的方法

    隐藏表格列,最常见的是如下方式:

    td.style.display = "none";

    这种方式的效率极低。例如,隐藏一个千行表格的某列,在我的笔记本上执行需要约 4000毫秒的时间,令人无法忍受。例如如下代码:

     1 <body>   
     2 <input type=button onclick=hideCol(1) value='隐藏第 2 列'>   
     3 <input type=button onclick=showCol(1) value='显示第 2 列'>   
     4 <div id=tableBox></div>   
     5 <script>     
     6 //--------------------------------------------------------   
     7 // 时间转为时间戳(毫秒)   
     8 function time2stamp() {
     9     var d = new Date();
    10     return Date.parse(d) + d.getMilliseconds();
    11 }
    12 //--------------------------------------------------------   
    13 // 创建表格   
    14 function createTable(rowsLen) {
    15     var str = "<table border=1>" + "<thead>" + "<tr>" + "<th width=100>col1</th>" + "<th width=200>col2</th>" + "<th width=50>col3</th>" + "</tr>" + "</thead>" + "<tbody>";
    16 
    17     var arr = [];
    18     for (var i = 0; i < rowsLen; i++) {
    19         arr[i] = "<tr><td>" + i + "1</td><td>" + i + "2</td><td>" + i + "3</td></tr>";
    20     }
    21     str += arr.join("") + "</tbody></table>"; // 用 join() 方式快速构建字串,速度极快   
    22     tableBox.innerHTML = str; // 生成 table   
    23 }
    24 //--------------------------------------------------------   
    25 // 隐藏/显示指定列   
    26 function hideCol(colIdx) {
    27     hideOrShowCol(colIdx, 0);
    28 }
    29 function showCol(colIdx) {
    30     hideOrShowCol(colIdx, 1);
    31 }
    32 // - - - - - - - - - - - - - - - - - - - - - - - - - - - -   
    33 function hideOrShowCol(colIdx, isShow) {
    34     var t1 = time2stamp(); //    
    35     var table = tableBox.children[0];
    36     var rowsLen = table.rows.length;
    37     var lastTr = table.rows[0];
    38     for (var i = 0; i < rowsLen; i++) {
    39         var tr = table.rows[i];
    40         tr.children[colIdx].style.display = isShow ? "": "none";
    41     }
    42 
    43     var t2 = time2stamp();
    44     alert("耗时:" + (t2 - t1) + " 毫秒");
    45 }
    46 
    47 //--------------------------------------------------------   
    48 createTable(1000); // 创建千行表格   
    49 </script>  
    View Code

    遗憾的是,我们 google 出来的用 javascript 隐藏列的方式,都是采用这样的代码。

    实际上,我们可以用设置第一行的 td 或 th 的宽度为 0 的方式,来快速隐藏列。
    我们把 hideOrShowCol() 函数改为如下代码:

    1 function hideOrShowCol(colIdx, isShow) {
    2     var t1 = time2stamp(); // 
    3     var table = tableBox.children[0];
    4     var tr = table.rows[0];
    5     tr.children[colIdx].style.width = isShow ? 200 : 0;
    6 
    7     var t2 = time2stamp();
    8     alert("耗时:" + (t2 - t1) + " 毫秒");
    9 }

    不过,仅这样还达不到隐藏的效果,还需要设置 table 和 td 样式为如下:

    <style>
        table { border-collapse:collapse; table-layout:fixed; overflow:hidden;} 
        td { overflow:hidden; white-space: nowrap; }
    </style>

    重新测试,我们发现,隐藏千行表格的某列,只需要不到 15毫秒的时间。而即使用 createTable(10000) 创建万行表格,再来测试,也只需要 60 毫秒的时间(都是以我的笔记本上的执行时间为参照。实际上,你们大多数人的电脑配置都比我的笔记本高很多,因此时间会更短),效率十分令人满意。

    补充:
    根据 无常 网友的提议,加上了对 colgroup 处理的代码。奇怪的是,虽然处理原理完全一样,但对 colgroup 进行处理的时间达到了 140毫秒,即延长了一倍。尚不清楚原因。
    完整代码:

      1 <style>
      2     table { border-collapse:collapse; table-layout:fixed; overflow:hidden;} 
      3     td { overflow:hidden; white-space: nowrap; }
      4 </style>
      5 <body>
      6     <input type=button onclick=createTable() value='创建表格:使用 thead'>
      7     <input type=button onclick=createTable(1) value='创建表格:使用 colgroup'>
      8     <br>
      9     <input type=button onclick=hideCol(1) value='隐藏第 2 列'>
     10     <input type=button onclick=showCol(1) value='显示第 2 列'>
     11     <input type=button onclick=hideCol_fast(1) value='快速隐藏第 2 列'>
     12     <input type=button onclick=showCol_fast(1) value='快速显示第 2 列'>
     13     <div id=tableBox>
     14     </div>
     15     <script>
     16         var tableRowsLen = 10000; // 创建万行表格 
     17         //-------------------------------------------------------- 
     18         // 时间转为时间戳(毫秒) 
     19         function time2stamp() {
     20             var d = new Date();
     21             return Date.parse(d) + d.getMilliseconds();
     22         }
     23 
     24         //-------------------------------------------------------- 
     25         // 创建表格 
     26         function createTable(isUseColGroup) {
     27             if (isUseColGroup) // 使用 colgroup 标签 
     28             {
     29                 var str = "<table border=1>" + "<colgroup>" + "<col width=100 />" + "<col width=200 />" + "<col width=50 />" + "</colgroup>" + "<tbody>";
     30             }
     31             else {
     32                 // 使用 thead 标签 
     33                 var str = "<table border=1>" + "<thead>" + "<tr>" + "<th width=100>col1</th>" + "<th width=200>col2</th>" + "<th width=50>col3</th>" + "</tr>" + "</thead>" + "<tbody>";
     34             }
     35 
     36             var arr = [];
     37             for (var i = 0; i < tableRowsLen; i++) {
     38                 arr[i] = "<tr><td>" + i + "1</td><td>" + i + "2</td><td>" + i + "3</td></tr>";
     39             }
     40             str += arr.join("") + "</tbody></table>"; // 用 join() 方式快速构建字串,速度极快 
     41             tableBox.innerHTML = str; // 生成 table 
     42         }
     43 
     44         //-------------------------------------------------------- 
     45         // 隐藏/显示指定列 
     46         function hideCol(colIdx) {
     47             hideOrShowCol(colIdx, 0);
     48         }
     49         function showCol(colIdx) {
     50             hideOrShowCol(colIdx, 1);
     51         }
     52         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
     53         function hideOrShowCol(colIdx, isShow) {
     54             var t1 = time2stamp(); // 
     55             var table = tableBox.children[0];
     56             var rowsLen = table.rows.length;
     57             var lastTr = table.rows[0];
     58 
     59             if (rowsLen > 1001) {
     60                 if (!confirm("将要对 1000 行以上的表格操作,这将非常耗时(甚至导致浏览器死掉)。
    您确定要继续吗?")) return;
     61             }
     62 
     63             for (var i = 0; i < rowsLen; i++) {
     64                 var tr = table.rows[i];
     65                 tr.children[colIdx].style.display = isShow ? "": "none";
     66             }
     67 
     68             var t2 = time2stamp();
     69             alert("耗时:" + (t2 - t1) + " 毫秒");
     70         }
     71 
     72         //-------------------------------------------------------- 
     73         // 隐藏/显示指定列 - 快速 
     74         function hideCol_fast(colIdx) {
     75             hideOrShowCol_fast(colIdx, 0);
     76         }
     77         function showCol_fast(colIdx) {
     78             hideOrShowCol_fast(colIdx, 1);
     79         }
     80         // - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
     81         function hideOrShowCol_fast(colIdx, isShow) {
     82             var t1 = time2stamp(); // 
     83             var table = tableBox.children[0];
     84             var thead = table.children[0]; // 可能是 thead 或者 tbody,也可能是 colgroup 
     85             if (thead.tagName.toLowerCase() == "colgroup") // 对 colgroup 特殊处理 
     86             {
     87                 var td = thead.children[colIdx];
     88             }
     89             else {
     90                 // 注意:如果表格没有 thead 和 tbody 标签,则 table.children[0] 是 tbody 
     91                 var tr = thead.children[0];
     92                 var td = tr.children[colIdx];
     93             }
     94             td.style.width = isShow ? 200 : 0;
     95 
     96             var t2 = time2stamp();
     97             alert("耗时:" + (t2 - t1) + " 毫秒");
     98         }
     99 
    100         //-------------------------------------------------------- 
    101         createTable();
    102     </script>
  • 相关阅读:
    C# 获取枚举 Enum 变量值的 Description 属性
    javascript获取网页URL地址及参数等
    也谈用反射实现Enum→String映射:一种重视性能的方法20090412 21:35一、问题的提出
    LinQ 多表查询
    Windows Service得到当前用户的名字和域
    ASP.NET 部署
    加密解密-C#
    Domino Internet邮件
    C#动态创建表
    读取Excel2000文件
  • 原文地址:https://www.cnblogs.com/relax/p/3630275.html
Copyright © 2020-2023  润新知