在Javascript看到一个帖子
【分享】Table排序
做得不错,就依葫芦画瓢自己重写一遍。
采用动态创建和动态载入数据,这样扩展性加强,容易移植为Ajax客户端。
实际效果
样式表文件--ListView.css
公用函数脚本--Common.js
可排序的Table--ListView.js
测试页面--ListView.html
做得不错,就依葫芦画瓢自己重写一遍。
采用动态创建和动态载入数据,这样扩展性加强,容易移植为Ajax客户端。
实际效果
样式表文件--ListView.css
- /*--
- 标题:可排序的表对象相关样式表
- 设计:ZswangY37
- 博客:http://blog.youkuaiyun.com/zswang
- 日期:2008年10月19日
- --*/
- .ListView{border:1pxsolid#ebebeb;line-height:20px;font-size:12px;}
- .ListViewtheadtd{background-color:#ebebeb;}
- .ListViewtheada{text-decoration:none;color:#333;outline:none;/*ff*/hide-focus:expression(this.hideFocus=true);/*ie*/}
- .ListViewtd{padding:5px;}
- .ListView.SortButton{padding:0005px;font-size:8px;color:#716F6C;}
- /*--
- 标题:常规函数封装
- 设计:ZswangY37
- 博客:http://blog.youkuaiyun.com/zswang
- 日期:2008年10月19日
- --*/
- if(typeofnamespace=="undefined")namespace=[];
- namespace.push("Common");
- $=document.getElementById;
- functioncallScript(id,url,loaded,error){
- varscript=document.createElement("script");
- script.type="text/javascript";
- script.id=id;
- script.src=url;
- script.onreadystatechange=function(){
- switch(this.readyState){
- case"complete":
- case"loaded":
- if(typeofloaded=="function")loaded();
- script.parentNode.removeChild(script);
- break;
- }
- }
- script.οnlοad=function(){
- if(typeofloaded=="function")loaded();
- script.parentNode.removeChild(script);
- }
- script.οnerrοr=function(){
- if(typeoferror=="function")error();
- }
- document.body.parentNode.appendChild(script);
- }
- functiondateFormat(date,separator){
- date=typeofdate=="number"?newDate(date):
- (typeofdate=="string"?newDate(Date.parse(date)):date);
- separator=typeofseparator=="string"?separator:"$1年$2月$3日$4时$5分$6秒";
- varstr=""+date.getFullYear()+"-"+(date.getMonth()+101)+"-"+(date.getDate()+100)+""+
- (date.getHours()+100)+":"+(date.getMinutes()+100)+":"+(date.getSeconds()+100);
- returnstr.replace(/^(/d+)-/d*(/d{2})-/d*(/d{2})/d*(/d{2}):/d*(/d{2}):/d*(/d{2})$/g,separator);
- }
- functionsizeFormat(size){
- vartext=size+"B";
- if(size>=1024*1024*1024)
- text=size/(1024*1024*1024)+"G";
- elseif(size>=1024*1024)
- text=size/(1024*1024)+"M";
- elseif(size>=1024)
- text=size/1024+"K";
- returntext.replace(/(/./d{2})/d*([a-z])/ig,"$1$2");
- }
- functioncolorFormat(color){
- return"#"+/.{6}$/.exec("00000"+color.toString(16));
- }
- functionsetElementText(element,text){
- if(typeofelement=="undefined")return;
- if(typeofelement.textContent!="undefined")
- element.textContent=text;
- else(typeofelement.innerText!="undefined")
- element.innerText=text;
- }
- /*--
- 标题:可排序的表对象
- 设计:ZswangY37
- 博客:http://blog.youkuaiyun.com/zswang
- 日期:2008年10月19日
- --*/
- if(typeofnamespace=="undefined")namespace=[];
- namespace.push("ListView");
- functionListItem(listView,subItems){
- this.listView=listView;
- this.index=this.listView.items.length;
- this.row=listView.body.insertRow(-1);
- this.cells=[];
- for(vari=0;i<this.listView.columns.length;i++){
- varcell=this.row.insertCell(-1);
- cell.align=this.listView.columns[i].align;
- this.cells.push(cell);
- }
- }
- ListItem.prototype.doChange=function(){
- for(vari=0;i<this.listView.columns.length;i++)
- setElementText(this.cells[i],this.listView.ondisplay(
- this.listView.columns[i],this.listView.lines[this.index][i]));
- }
- functionListColumn(listView,caption,type,width,align){
- this.listView=listView;
- this.caption=caption;
- this.type=type;
- this.width=width;
- this.align=align;
- this.index=this.listView.columns.length;
- this.sortStyle="down";
- this.sorted=false;
- this.cell=listView.head.row.insertCell(-1);
- this.cell.align=align;
- this.cell.style.width=width+"px";
- this.a_caption=document.createElement("a");
- this.a_caption.href="javascript:void(0);";
- this.a_caption.listView=listView;
- this.a_caption.column=this;
- this.a_caption.οnclick=function(){
- if(this.listView.sortColumn==this.column)
- this.column.setSortStyle(this.column.sortStyle=="down"?"up":"down");
- elsethis.listView.setSortColumn(this.column);
- }
- this.cell.appendChild(this.a_caption);
- setElementText(this.a_caption,caption);
- this.a_button=document.createElement("a");
- this.a_button.href="javascript:void(0);";
- this.a_button.className="SortButton";
- this.a_button.style.display="none";
- this.a_button.listView=listView;
- this.a_button.column=this;
- this.a_button.οnclick=this.a_caption.onclick;
- this.cell.appendChild(this.a_button);
- }
- ListColumn.prototype.setSorted=function(sorted){
- if(this.sorted==sorted)return;
- this.sorted=sorted;
- this.doChange();
- }
- ListColumn.prototype.setSortStyle=function(sortStyle){
- if(this.sortStyle==sortStyle)return;
- this.sortStyle=sortStyle;
- this.doChange();
- this.listView.alphaSort();
- }
- ListColumn.prototype.doChange=function(){
- this.a_button.style.display=this.sorted?"":"none";
- setElementText(this.a_button,this.sortStyle=="down"?"▼":"▲");
- }
- functionListView(parent,width,height){
- this.parent=typeofparent=="object"?parent:document.body;
- this.width=width;
- this.height=height;
- this.ondisplay=function(column,value){
- switch(column.type){
- case"time":returndateFormat(value,"$1-$2-$3$4:$5:$6");
- case"date":returndateFormat(value,"$1-$2-$3");
- case"size":returnsizeFormat(value);
- default:returnvalue;
- }
- }
- this.table=document.createElement("table");
- this.table.className="ListView";
- this.table.cellPadding="0";
- this.table.cellSpacing="0";
- this.head=document.createElement("thead");
- this.body=document.createElement("tbody");
- this.parent.appendChild(this.table);
- this.table.appendChild(this.head);
- this.table.appendChild(this.body);
- this.columns=[];//表头列表
- this.items=[];//所有项
- this.lines=[];//所有数据
- this.sortColumn=null;
- this.head.row=this.head.insertRow(-1);
- this.table.style.width=this.width+"px";
- this.table.style.height=this.height+"px";
- }
- ListView.prototype.AddColumn=function(caption,type,width,align){
- varcolumn=newListColumn(this,caption,type,width,align);
- this.columns.push(column);
- }
- ListView.prototype.AddColumns=function(columns){
- for(vari=0;i<columns.length;i++)
- this.AddColumn(columns[i].caption,columns[i].type,columns[i].width,columns[i].align);
- }
- ListView.prototype.AddItem=function(subItems){
- varitem=newListItem(this,subItems);
- this.items.push(item);
- this.lines.push(subItems);
- item.doChange();
- }
- ListView.prototype.AddItems=function(items){
- for(vari=0;i<items.length;i++)
- this.AddItem(items[i]);
- }
- ListView.prototype.setSortColumn=function(column){
- if(column==this.sortColumn)return;
- if(this.sortColumn)this.sortColumn.setSorted(false);
- this.sortColumn=column;
- if(this.sortColumn)this.sortColumn.setSorted(true);
- this.alphaSort();
- }
- ListView.prototype.alphaSort=function(){
- if(this.sortColumn==null)return;
- varlistView=this;
- varsortIndex=listView.sortColumn.index;
- varsortStyle=listView.sortColumn.sortStyle=="up"?1:-1;
- this.lines.sort(function(a,b){
- returnsortStyle*(a[sortIndex]==b[sortIndex]?0:(a[sortIndex]>b[sortIndex]?-1:1));
- });
- for(vari=0;i<this.items.length;i++)
- this.items[i].doChange();
- }
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <headrunat="server">
- <title>ListView测试样例</title>
- <linkrel="Stylesheet"type="text/css"href="ListView.css?version=2008101701"/>
- </head>
- <scripttype="text/javascript"src="Common.js?version=2008101701"></script>
- <scripttype="text/javascript"src="ListView.js?version=2008101701"></script>
- <scripttype="text/javascript">
- functionBodyLoad(){
- varlistView=newListView(document.body,500,120);
- listView.AddColumns([
- {caption:"文件名",type:"string",width:200,align:"left"},
- {caption:"类型",type:"string",width:100,align:"left"},
- {caption:"日期",type:"time",width:130,align:"center"},
- {caption:"大小",type:"size",width:70,align:"right"}
- ]);
- listView.AddItems([
- ["new.rar","rar",1221180669000,433247],
- ["Scroller.js","js","2008/9/2311:26:57",2556],
- ["AlertBox.js","js","2008/9/2311:26:57",3565],
- ["1.htm","htm","2008/10/420:21:54",11394],
- ["4.htm","htm","2008/10/420:21:54",351],
- ["news.xml","htm","2008/10/420:24:11",14074],
- ["function.js","js","2008/10/420:24:11",2844],
- ["神秘园-Nocturne.mp3","mp3","2008/10/70:07:43",3111293],
- ["详细功略+剧情流程(一).doc","doc","2008/10/70:07:43",63488],
- ["详细功略+剧情流程(二).doc","doc","2008/10/70:07:43",164352],
- ["禁止文件预览功能.txt","txt","2008/10/70:07:58",860]
- ]);
- varlistView=newListView(document.body,500,120);
- listView.AddColumns([
- {caption:"ID",type:"int",width:100,align:"right"},
- {caption:"昵称",type:"string",width:200,align:"center"},
- {caption:"生日",type:"date",width:130,align:"center"},
- {caption:"城市",type:"string",width:70,align:"left"}
- ]);
- listView.AddItems([
- [1,"成龙","1961/2/1","香港"],
- [2,"章子怡","1970/12/13","上海"],
- [3,"那英","1976/8/8","北京"],
- [4,"陈坤","1980/12/30","南京"],
- [5,"黄晓明","1981/12/30","天津"],
- [6,"周杰伦","1980/11/11","台北"],
- [7,"莫文蔚","1973/3/17","香港"],
- [8,"黃品源","1980/7/18","拉萨"],
- [9,"張信哲","1975/7/21","高雄"],
- [10,"王力宏","1970/2/16","厦门"],
- [11,"張柏芝","1984/6/4","深圳"]
- ]);
- }
- </script>
- <bodyonload="BodyLoad();">
- </body>
- </html>