⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syjsort.js

📁 JavaScript排序_包括中文拼音排序
💻 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 + -