?? syjsort.js
字號:
if (syj == null) var syj = {};
/*
表格排序 author 孫鈺佳 2008/02/24 sunyujia@yahoo.cn
漢字按拼音排序需要qswhGB2312.js拼音庫的支持,此拼音庫支持的漢字范圍為GB2312精簡出自qiushuiwuhen
動態構建的table同樣可以排序,只需指定TD的sortObject屬性指向待取值的對象(例如input控件)的引用 例cell.sortObject=動態構建出的input對象
在頁面加載時執行如下腳本即可
var sorter=new syj.Sort('mainTable');
sorter.bindCell(0,'NUMBER');
sorter.bindCell(1,'STRING_EN',false);如果列表已經有序指定順序false正序
sorter.bindCell(2,'STRING_CH');
sorter.bindCell(3,'DATE');
*/
var table
//tbName待排序的表名start起始tr下標默認1,end結束tr下標默認0
syj.Sort =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="▼";//占位用
}
//指定待排序的列cellIdx列號下標,desc如果列表已經有序true為倒序false為正序,null為無序,type類型支持類型有DATE,NUMBER,STRING_EN,STRING_CH
syj.Sort.prototype.bindCell=function(cellIdx,type,desc){
var c=this.heads[cellIdx],o=this;
c.style.cursor='hand';
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對象的狀態
syj.Sort.prototype.sortCell=function(cell,type){
var ips = this.table.all.tags("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)>0)
row1.swapNode(row2);
}
}
cell.updateSymbol();
while(cks.length > 0)cks.shift().checked = cks.shift();
}
//數字比較算法
syj.Sort.prototype.CMP_NUMBER=function(x,y,cell){
var r="/[^d|.|-]/g";
x=x.replace(r,"");
y=y.replace(r,"");
return this.compare(x*1,y*1,cell);
}
//時間比較算法
syj.Sort.prototype.CMP_DATE=function(x,y,cell){
var d='1900-01-01';
var x=this.strToDate(x==''?d:x);
var y=this.strToDate(y==''?d:y);
var z=x-y;
return cell.desc?z*(-1):z;
}
//英文字符串算法
syj.Sort.prototype.CMP_STRING_EN=function(x,y,cell){
x=this.getFirstChar(x);
y=this.getFirstChar(y);
return this.compare(x,y,cell);
}
//中文字符串算法
syj.Sort.prototype.CMP_STRING_CH=function(x,y,cell){
x=x==""?"":getGB2312Spell(this.getFirstChar(x));
y=y==""?"":getGB2312Spell(this.getFirstChar(y));
return this.compare(x,y,cell);
}
//簡單值比較算法
syj.Sort.prototype.compare=function(x,y,cell){
if(x>y) return cell.desc?-1:1;
else if(x<y) return cell.desc?1:-1;
else return 0;
}
//取字符串的第一個字符
syj.Sort.prototype.getFirstChar=function(s){
if(s=="")return "";
return (s+"").substr(0,1);
}
//字符串轉成日期類型 格式 MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd
syj.Sort.prototype.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中的值
syj.Sort.prototype.getValue=function(cell){
var v;
if(cell.sortObject!=null) v= cell.sortObject.value!=null?cell.sortObject.value:cell.sortObject.innerText;
else v= cell.innerText;
return v.replace(/(^s*)|(s*$)/g,"");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -