热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> AJAX编程>>正文内容

分享经验——JS表格,万条数据瞬间加载

发布时间:2010年03月09日点击数: 佚名

在Ajax动态加载数据的实际应用中,大家都习惯了一种思维方式:一条数据创建一行。
于是如果数量大的时候,一次性要加载完数据的话,浏览器就会卡上半天

受Flex的DataGrid控件的启发,在Flex的DataGrid控件中,展示数据的方法并不是有多少条数据就创建多少行,它最多只创建你在界面上所看到的十几二十行(假设为n行),如果数据多的话,在滚动过程中,会从数据中抽取你应该看到的这n行数据,重新展示在已经创建好的那n行控件中。
也就是说,Flex的DataGrid控件中,我们实际上看到的仅仅是那n行控件,只是它们展示的数据是根据滚动条状态来筛选出来的。

所以,如果在JS中,也用类似的方法实现,那么就是上万条数据,可能也只要创建几十个Dom而已,效率自然快得多了。
废话不多说,上代码。首先,需要一个滚动条

JS代码:

  1. function Scrollbar() { 
  2.     this.options = { 
  3.         total: 0,   //数据总数 
  4.         pos: 0,     //当前滚动位置 
  5.         itemSize: 20,  //单项尺寸 
  6.         size: 200  //控件尺寸 
  7.     }; 
  8. Scrollbar.prototype = (function() { 
  9.     function setOptions(options) { 
  10.         for (var attr in options) { 
  11.             this.options[attr] = options[attr]; 
  12.         } 
  13.         Refresh(this); 
  14.     } 
  15.     function Refresh(_this) { 
  16.         if (!_this.created) return
  17.  
  18.         //设置控件高度 
  19.         _this.bar.style.height = _this.options.size + "px"
  20.  
  21.         //设置内容高度 
  22.         var ch = _this.options.total * _this.options.itemSize; 
  23.         _this.content.style.height = ch + "px"
  24.     } 
  25.     //获取滚动位置 
  26.     function getPos() { 
  27.         var top = this.bar.scrollTop; 
  28.         var pos = parseInt(top / this.options.itemSize); 
  29.         return pos; 
  30.     } 
  31.     //每页可展示的数据数量 
  32.     function getPageItems() { 
  33.         return this.options.size / this.options.itemSize; 
  34.     } 
  35.      
  36.     //滚动事件响应 
  37.     function OnScroll(_this) { 
  38.         var pos = _this.getPos(); 
  39.         if (pos == _this.options.pos) return
  40.         _this.options.pos = pos; 
  41.         _this.onScroll(pos); 
  42.     } 
  43.  
  44.     //滚动条创建 
  45.     function CreateAt(dom) { 
  46.         var _this = this
  47.  
  48.         var bar = document.createElement("div"); 
  49.         var content = document.createElement("div"); 
  50.         bar.appendChild(content); 
  51.  
  52.         bar.style.width = "19px"
  53.         bar.style.overflowY = "scroll"
  54.         bar.style.overflowX = "hidden"
  55.         if (bar.attachEvent) { 
  56.             bar.attachEvent("onscroll"function() { OnScroll(_this); }); 
  57.         } 
  58.         else {//firefox兼容 
  59.             bar.addEventListener("scroll"function() { OnScroll(_this); }, false); 
  60.         } 
  61.         content.style.backgroundColor = "white"
  62.         content.style.width = "1px"
  63.  
  64.         this.bar = bar; 
  65.         this.content = content; 
  66.  
  67.         if (typeof (dom) == "string") { 
  68.             dom = document.getElementById(dom); 
  69.         } 
  70.         dom.innerHTML = ""
  71.         dom.appendChild(this.bar); 
  72.         this.created = true
  73.         Refresh(this); 
  74.     } 
  75.  
  76.     return { 
  77.         setOptions: setOptions, 
  78.         CreateAt: CreateAt, 
  79.         getPos: getPos, 
  80.         getPageItems: getPageItems, 
  81.         onScroll: null  //模拟滚动条事件 
  82.     }; 
  83. })(); 

HTML页面代码

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  3. <html xmlns="http://www.w3.org/1999/xhtml"> 
  4. <head> 
  5.     <title>表格控件</title> 
  6.  
  7.     <script src="Scrollbar.js" type="text/javascript"></script> 
  8. <script language="javascript" type="text/javascript"> 
  9.     var data = []; 
  10.     //创建一万条示例数据 
  11.     for (var i = 0; i < 10000; i++) { 
  12.         var row = { id: i, text: "text" + i }; 
  13.         data.push(row); 
  14.     } 
  15.  
  16.     //创建滚动条 
  17.     var scrbar = new Scrollbar(); 
  18.     window.onload = function() { 
  19.         scrbar.CreateAt("divScroll"); 
  20.         scrbar.setOptions({ total: 10000,size:300 }); 
  21.         scrbar.onScroll = function(pos) { 
  22.             ShowData(pos); 
  23.         } 
  24.  
  25.         //获取模板 
  26.         var items = scrbar.getPageItems(); 
  27.         var tpl = document.getElementById("trTpl"); 
  28.         tpl.parentNode.removeChild(tpl); 
  29.  
  30.         //仅创建所看到的几十行表格,所以自然快得多 
  31.         var list = document.getElementById("tblList"); 
  32.         for (var i = 0; i < data.length && i < items; i++) { 
  33.             var nr = tpl.cloneNode(true);   //从模板行复制新行 
  34.             list.appendChild(nr); 
  35.         } 
  36.         ShowData(scrbar.getPos()); 
  37.     } 
  38.      
  39.     //根据滚动条,展示数据 
  40.     function ShowData(pos) { 
  41.         var n=scrbar.getPageItems(); 
  42.         var rows=document.getElementById("tblList").rows; 
  43.         for (var i = 0; i < n; i++) { 
  44.             var row = rows[i]; 
  45.             var item = data[i + pos]; 
  46.             row.cells["tdID"].innerHTML = item["id"]; 
  47.             row.cells["tdText"].innerHTML = item["text"]; 
  48.         } 
  49.     } 
  50. </script> 
  51. </head> 
  52. <body> 
  53.     <div id="divScroll" style="float:right"> 
  54.     </div> 
  55.     <table border="1"> 
  56.         <!--行标题--> 
  57.         <thead><tr> 
  58.             <th>ID</th> 
  59.             <th>Text</th> 
  60.         </tr></thead> 
  61.          
  62.         <!--数据展示区--> 
  63.         <tbody id="tblList"><tr id="trTpl"> 
  64.             <td id="tdID">&nbsp;</td> 
  65.             <td id="tdText">&nbsp;</td> 
  66.         </tr></tbody> 
  67.     </table> 
  68. </body> 
  69. </html> 

OK!上万条数据,也是瞬间的事
当然,页面很粗糙,不过加点JS代码把那个滚动条和表格对齐一下,也就差不多了。
代码还没封装好,以后再慢慢封装了
而且,还轻易地解决了一个常见问题:固定表格的标题行,哈哈。。。。 

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作