📄 sunrise_tablesort.js
字号:
/** * @author ghost */
(function(){ //tbName待排序的表名start起始tr下标默认1,end结束tr下标默认0 SunRise.TableSort =function(tbName,start,end){ this.tbName=tbName;//表名 this.table=document.getElementById(tbName);//表对象 this.start=start==null?1:start;//起始tr如果值为1则第一行不参与排序 this.end=end==null?0:end;//结束tr如果值为2则最后两行不参与排序 this.heads=this.table.rows[0].cells; this.spanSrc=document.createElement("span"); this.spanSrc.innerHTML="▼";//占位用 } SunRise.TableSort.prototype = { //指定待排序的列cellIdx列号下标,desc如果列表已经有序true为倒序false为正序,null为无序,type类型支持类型有DATE,NUMBER,STRING_EN,STRING_CH bindCell : function(cellIdx,type,desc){ var c=this.heads[cellIdx],o=this; c.style.cursor='pointer'; c.onclick=function(){ o.sortCell(this,type); if(o.onclickExt!=null)o.onclickExt(this);//执行扩展的onclickExt事件 } var f=this.spanSrc.cloneNode(true); f.style.visibility='hidden'; c.updateSymbol=function(){ if(c.desc) f.innerHTML="▼";else f.innerHTML="▲";} c.desc=desc; if(c.desc!=null)c.updateSymbol(); c.onmouseover=function(){if(c.desc!=null)f.style.visibility='visible';} c.onmouseout=function(){f.style.visibility='hidden';} c.appendChild(f); c.style.textIndent=f.offsetWidth; }, //核心排序方法,采用冒泡排序,使用dom交换数据,不影响内存中cell对象的状态 sortCell : function(cell,type){ var ips = this.table.getElementsByTagName("INPUT"),cks = [];//排序字段 解决交换tr时checkbox的IE bug for(var i=0; i < ips.length; i++){if(ips[i].type == "checkbox") cks.push(ips[i], ips[i].checked);} if(cell.desc==null) cell.desc=false;else cell.desc=!cell.desc; var funcName='CMP_'+type;//根据类型匹配算法的函数名称 if(this[funcName]==null){alert("类型错误,合法的类型为DATE,NUMBER,STRING_EN,STRING_CH");return ;} for (var i = this.start,cIdx=cell.cellIndex,rows=this.table.rows,size = rows.length - this.end; i < size; i++) { for (var k = this.start; k < size - 1 - i + this.start; k++) { var row1=rows[k],row2=rows[k + 1]; var x=this.getValue(row1.cells[cIdx]),y=this.getValue(row2.cells[cIdx]); if (this[funcName](x,y,cell.desc)>0){ this.swapNode(row1,row2); } } } cell.updateSymbol(); while(cks.length > 0)cks.shift().checked = cks.shift(); }, //数字比较算法 CMP_NUMBER : function(x,y,desc){ var r="/[^d|.|-]/g"; x=x.replace(r,""); y=y.replace(r,""); return this.compare(x*1,y*1,desc); }, //时间比较算法 CMP_DATE : function(x,y,desc){ var d='1900-01-01'; var x=this.strToDate(x==''?d:x); var y=this.strToDate(y==''?d:y); var z=x-y; return desc?z*(-1):z; }, //英文字符串算法 CMP_STRING_EN : function(x,y,desc){ x=this.getFirstChar(x); y=this.getFirstChar(y); return this.compare(x,y,desc); }, //中文字符串算法 CMP_STRING_CH : function(x,y,desc){ x=x==""?"":SunRiseGB2Spell.getGB2312Spell(this.getFirstChar(x)); y=y==""?"":SunRiseGB2Spell.getGB2312Spell(this.getFirstChar(y)); return this.compare(x,y,desc); }, //简单值比较算法 compare : function(x,y,desc){ if(x>y) return desc?-1:1; else if(x<y) return desc?1:-1; else return 0; }, //取字符串的第一个字符 getFirstChar : function(s){ if(s=="")return ""; return (s+"").substr(0,1); }, //字符串转成日期类型 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd strToDate : function(ds){ var d = new Date(Date.parse(ds)); if (isNaN(d)){ var arys= ds.split('-'); d = new Date(arys[0],arys[1]-1,arys[2]); } return d; }, //取TD中的值 getValue : function(cell){ var v; if(cell.sortObject!=null) v= cell.sortObject.value!=null?cell.sortObject.value:cell.sortObject.innerHTML; else v= cell.innerHTML; return v.replace(/(^s*)|(s*$)/g,""); }, swapNode : function(node1,node2){ var parent = node1.parentNode;//父节点 var t1 = node1.nextSibling;//两节点的相对位置 var t2 = node2.nextSibling; if (t1) { parent.insertBefore(node2, t1); } else { parent.appendChild(node2); } if (t2) { parent.insertBefore(node1, t2); } else { parent.appendChild(node1); } } } })();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -