【脚本共享】可以排序的Table控件,扩展较强。

本文介绍了一个使用JavaScript实现的可排序Table组件,支持动态创建和数据加载,具备良好的扩展性和移植性,适用于Ajax客户端应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Javascript看到一个帖子 【分享】Table排序
做得不错,就依葫芦画瓢自己重写一遍。
采用动态创建和动态载入数据,这样扩展性加强,容易移植为Ajax客户端。

实际效果

样式表文件--ListView.css
  1. /*--
  2. 标题:可排序的表对象相关样式表
  3. 设计:ZswangY37
  4. 博客:http://blog.youkuaiyun.com/zswang
  5. 日期:2008年10月19日
  6. --*/
  7. .ListView{border:1pxsolid#ebebeb;line-height:20px;font-size:12px;}
  8. .ListViewtheadtd{background-color:#ebebeb;}
  9. .ListViewtheada{text-decoration:none;color:#333;outline:none;/*ff*/hide-focus:expression(this.hideFocus=true);/*ie*/}
  10. .ListViewtd{padding:5px;}
  11. .ListView.SortButton{padding:0005px;font-size:8px;color:#716F6C;}
公用函数脚本--Common.js
  1. /*--
  2. 标题:常规函数封装
  3. 设计:ZswangY37
  4. 博客:http://blog.youkuaiyun.com/zswang
  5. 日期:2008年10月19日
  6. --*/
  7. if(typeofnamespace=="undefined")namespace=[];
  8. namespace.push("Common");
  9. $=document.getElementById;
  10. functioncallScript(id,url,loaded,error){
  11. varscript=document.createElement("script");
  12. script.type="text/javascript";
  13. script.id=id;
  14. script.src=url;
  15. script.onreadystatechange=function(){
  16. switch(this.readyState){
  17. case"complete":
  18. case"loaded":
  19. if(typeofloaded=="function")loaded();
  20. script.parentNode.removeChild(script);
  21. break;
  22. }
  23. }
  24. script.οnlοad=function(){
  25. if(typeofloaded=="function")loaded();
  26. script.parentNode.removeChild(script);
  27. }
  28. script.οnerrοr=function(){
  29. if(typeoferror=="function")error();
  30. }
  31. document.body.parentNode.appendChild(script);
  32. }
  33. functiondateFormat(date,separator){
  34. date=typeofdate=="number"?newDate(date):
  35. (typeofdate=="string"?newDate(Date.parse(date)):date);
  36. separator=typeofseparator=="string"?separator:"$1年$2月$3日$4时$5分$6秒";
  37. varstr=""+date.getFullYear()+"-"+(date.getMonth()+101)+"-"+(date.getDate()+100)+""+
  38. (date.getHours()+100)+":"+(date.getMinutes()+100)+":"+(date.getSeconds()+100);
  39. returnstr.replace(/^(/d+)-/d*(/d{2})-/d*(/d{2})/d*(/d{2}):/d*(/d{2}):/d*(/d{2})$/g,separator);
  40. }
  41. functionsizeFormat(size){
  42. vartext=size+"B";
  43. if(size>=1024*1024*1024)
  44. text=size/(1024*1024*1024)+"G";
  45. elseif(size>=1024*1024)
  46. text=size/(1024*1024)+"M";
  47. elseif(size>=1024)
  48. text=size/1024+"K";
  49. returntext.replace(/(/./d{2})/d*([a-z])/ig,"$1$2");
  50. }
  51. functioncolorFormat(color){
  52. return"#"+/.{6}$/.exec("00000"+color.toString(16));
  53. }
  54. functionsetElementText(element,text){
  55. if(typeofelement=="undefined")return;
  56. if(typeofelement.textContent!="undefined")
  57. element.textContent=text;
  58. else(typeofelement.innerText!="undefined")
  59. element.innerText=text;
  60. }
可排序的Table--ListView.js
  1. /*--
  2. 标题:可排序的表对象
  3. 设计:ZswangY37
  4. 博客:http://blog.youkuaiyun.com/zswang
  5. 日期:2008年10月19日
  6. --*/
  7. if(typeofnamespace=="undefined")namespace=[];
  8. namespace.push("ListView");
  9. functionListItem(listView,subItems){
  10. this.listView=listView;
  11. this.index=this.listView.items.length;
  12. this.row=listView.body.insertRow(-1);
  13. this.cells=[];
  14. for(vari=0;i<this.listView.columns.length;i++){
  15. varcell=this.row.insertCell(-1);
  16. cell.align=this.listView.columns[i].align;
  17. this.cells.push(cell);
  18. }
  19. }
  20. ListItem.prototype.doChange=function(){
  21. for(vari=0;i<this.listView.columns.length;i++)
  22. setElementText(this.cells[i],this.listView.ondisplay(
  23. this.listView.columns[i],this.listView.lines[this.index][i]));
  24. }
  25. functionListColumn(listView,caption,type,width,align){
  26. this.listView=listView;
  27. this.caption=caption;
  28. this.type=type;
  29. this.width=width;
  30. this.align=align;
  31. this.index=this.listView.columns.length;
  32. this.sortStyle="down";
  33. this.sorted=false;
  34. this.cell=listView.head.row.insertCell(-1);
  35. this.cell.align=align;
  36. this.cell.style.width=width+"px";
  37. this.a_caption=document.createElement("a");
  38. this.a_caption.href="javascript:void(0);";
  39. this.a_caption.listView=listView;
  40. this.a_caption.column=this;
  41. this.a_caption.οnclick=function(){
  42. if(this.listView.sortColumn==this.column)
  43. this.column.setSortStyle(this.column.sortStyle=="down"?"up":"down");
  44. elsethis.listView.setSortColumn(this.column);
  45. }
  46. this.cell.appendChild(this.a_caption);
  47. setElementText(this.a_caption,caption);
  48. this.a_button=document.createElement("a");
  49. this.a_button.href="javascript:void(0);";
  50. this.a_button.className="SortButton";
  51. this.a_button.style.display="none";
  52. this.a_button.listView=listView;
  53. this.a_button.column=this;
  54. this.a_button.οnclick=this.a_caption.onclick;
  55. this.cell.appendChild(this.a_button);
  56. }
  57. ListColumn.prototype.setSorted=function(sorted){
  58. if(this.sorted==sorted)return;
  59. this.sorted=sorted;
  60. this.doChange();
  61. }
  62. ListColumn.prototype.setSortStyle=function(sortStyle){
  63. if(this.sortStyle==sortStyle)return;
  64. this.sortStyle=sortStyle;
  65. this.doChange();
  66. this.listView.alphaSort();
  67. }
  68. ListColumn.prototype.doChange=function(){
  69. this.a_button.style.display=this.sorted?"":"none";
  70. setElementText(this.a_button,this.sortStyle=="down"?"▼":"▲");
  71. }
  72. functionListView(parent,width,height){
  73. this.parent=typeofparent=="object"?parent:document.body;
  74. this.width=width;
  75. this.height=height;
  76. this.ondisplay=function(column,value){
  77. switch(column.type){
  78. case"time":returndateFormat(value,"$1-$2-$3$4:$5:$6");
  79. case"date":returndateFormat(value,"$1-$2-$3");
  80. case"size":returnsizeFormat(value);
  81. default:returnvalue;
  82. }
  83. }
  84. this.table=document.createElement("table");
  85. this.table.className="ListView";
  86. this.table.cellPadding="0";
  87. this.table.cellSpacing="0";
  88. this.head=document.createElement("thead");
  89. this.body=document.createElement("tbody");
  90. this.parent.appendChild(this.table);
  91. this.table.appendChild(this.head);
  92. this.table.appendChild(this.body);
  93. this.columns=[];//表头列表
  94. this.items=[];//所有项
  95. this.lines=[];//所有数据
  96. this.sortColumn=null;
  97. this.head.row=this.head.insertRow(-1);
  98. this.table.style.width=this.width+"px";
  99. this.table.style.height=this.height+"px";
  100. }
  101. ListView.prototype.AddColumn=function(caption,type,width,align){
  102. varcolumn=newListColumn(this,caption,type,width,align);
  103. this.columns.push(column);
  104. }
  105. ListView.prototype.AddColumns=function(columns){
  106. for(vari=0;i<columns.length;i++)
  107. this.AddColumn(columns[i].caption,columns[i].type,columns[i].width,columns[i].align);
  108. }
  109. ListView.prototype.AddItem=function(subItems){
  110. varitem=newListItem(this,subItems);
  111. this.items.push(item);
  112. this.lines.push(subItems);
  113. item.doChange();
  114. }
  115. ListView.prototype.AddItems=function(items){
  116. for(vari=0;i<items.length;i++)
  117. this.AddItem(items[i]);
  118. }
  119. ListView.prototype.setSortColumn=function(column){
  120. if(column==this.sortColumn)return;
  121. if(this.sortColumn)this.sortColumn.setSorted(false);
  122. this.sortColumn=column;
  123. if(this.sortColumn)this.sortColumn.setSorted(true);
  124. this.alphaSort();
  125. }
  126. ListView.prototype.alphaSort=function(){
  127. if(this.sortColumn==null)return;
  128. varlistView=this;
  129. varsortIndex=listView.sortColumn.index;
  130. varsortStyle=listView.sortColumn.sortStyle=="up"?1:-1;
  131. this.lines.sort(function(a,b){
  132. returnsortStyle*(a[sortIndex]==b[sortIndex]?0:(a[sortIndex]>b[sortIndex]?-1:1));
  133. });
  134. for(vari=0;i<this.items.length;i++)
  135. this.items[i].doChange();
  136. }
测试页面--ListView.html
  1. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <htmlxmlns="http://www.w3.org/1999/xhtml">
  3. <headrunat="server">
  4. <title>ListView测试样例</title>
  5. <linkrel="Stylesheet"type="text/css"href="ListView.css?version=2008101701"/>
  6. </head>
  7. <scripttype="text/javascript"src="Common.js?version=2008101701"></script>
  8. <scripttype="text/javascript"src="ListView.js?version=2008101701"></script>
  9. <scripttype="text/javascript">
  10. functionBodyLoad(){
  11. varlistView=newListView(document.body,500,120);
  12. listView.AddColumns([
  13. {caption:"文件名",type:"string",width:200,align:"left"},
  14. {caption:"类型",type:"string",width:100,align:"left"},
  15. {caption:"日期",type:"time",width:130,align:"center"},
  16. {caption:"大小",type:"size",width:70,align:"right"}
  17. ]);
  18. listView.AddItems([
  19. ["new.rar","rar",1221180669000,433247],
  20. ["Scroller.js","js","2008/9/2311:26:57",2556],
  21. ["AlertBox.js","js","2008/9/2311:26:57",3565],
  22. ["1.htm","htm","2008/10/420:21:54",11394],
  23. ["4.htm","htm","2008/10/420:21:54",351],
  24. ["news.xml","htm","2008/10/420:24:11",14074],
  25. ["function.js","js","2008/10/420:24:11",2844],
  26. ["神秘园-Nocturne.mp3","mp3","2008/10/70:07:43",3111293],
  27. ["详细功略+剧情流程(一).doc","doc","2008/10/70:07:43",63488],
  28. ["详细功略+剧情流程(二).doc","doc","2008/10/70:07:43",164352],
  29. ["禁止文件预览功能.txt","txt","2008/10/70:07:58",860]
  30. ]);
  31. varlistView=newListView(document.body,500,120);
  32. listView.AddColumns([
  33. {caption:"ID",type:"int",width:100,align:"right"},
  34. {caption:"昵称",type:"string",width:200,align:"center"},
  35. {caption:"生日",type:"date",width:130,align:"center"},
  36. {caption:"城市",type:"string",width:70,align:"left"}
  37. ]);
  38. listView.AddItems([
  39. [1,"成龙","1961/2/1","香港"],
  40. [2,"章子怡","1970/12/13","上海"],
  41. [3,"那英","1976/8/8","北京"],
  42. [4,"陈坤","1980/12/30","南京"],
  43. [5,"黄晓明","1981/12/30","天津"],
  44. [6,"周杰伦","1980/11/11","台北"],
  45. [7,"莫文蔚","1973/3/17","香港"],
  46. [8,"黃品源","1980/7/18","拉萨"],
  47. [9,"張信哲","1975/7/21","高雄"],
  48. [10,"王力宏","1970/2/16","厦门"],
  49. [11,"張柏芝","1984/6/4","深圳"]
  50. ]);
  51. }
  52. </script>
  53. <bodyonload="BodyLoad();">
  54. </body>
  55. </html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值