JavaScript 单击标题排序
注:本文章摘选于网络资源并非原创!
例1.点击Table的表头进行一列的升序与倒序的排列。
1 <script type="text/javascript"> 2 var k=0; 3 /**//************************************************************************** 4 排序的主方法,有三个形参,STableTd,iCol,sDataType分别为需要排序的表格ID, 5 需要排序的表格列号,所在列的数据类型(支持int,float,date,string四种数据类型) 6 **************************************************************************/ 7 function sortTable(sTableId,iCol,sDataType) 8 { 9 var oTable=document.getElementById(sTableId);//获取表格的ID 10 var oTbody=oTable.tBodies[0]; //获取表格的tbody 11 var colDataRows=oTbody.rows; //获取tbody里的所有行的引用 12 13 var aTRs=new Array(); //定义aTRs数组用于存放tbody里的行 14 for(var i=0;i<colDataRows.length;i++) //依次把所有行放如aTRs数组 15 { 16 aTRs.push(colDataRows[i]); 17 } 18 /**//*********************************************************************** 19 sortCol属性是额外给table添加的属性,用于作顺反两种顺序排序时的判断,区分 20 首次排序和后面的有序反转 21 ************************************************************************/ 22 if(oTable.sortCol==iCol) //非首次排序 23 { 24 aTRs.reverse(); 25 } 26 else //首次排序 27 { 28 if(k%2==0) //升序 29 { 30 aTRs.sort(generateCompareTRs(iCol,sDataType)); 31 } 32 else if(k%2==1) //降序 33 { 34 aTRs.sort(generateCompareTRs1(iCol,sDataType)); 35 } 36 } 37 38 var oFragment=document.createDocumentFragment(); //创建文档碎片 39 for(var i=0;i<aTRs.length;i++) //把排序过的aTRs数组成员依次添加到文档碎片 40 { 41 oFragment.appendChild(aTRs[i]); 42 } 43 oTbody.appendChild(oFragment); //把文档碎片添加到tbody,完成排序后的显示更新 44 oTable.sortCol=iCol; //把当前列号赋值给sortCol,以此来区分首次排序和非首次排序,//sortCol的默认值为-1 45 }; 46 47 //比较函数,用于两项之间的排序 48 //升序 49 function generateCompareTRs(iCol,sDataType) 50 { 51 return function compareTRs(oTR1,oTR2) 52 { 53 var vValue1=convert(oTR1.cells[iCol].firstChild.nodeValue,sDataType); 54 var vValue2=convert(oTR2.cells[iCol].firstChild.nodeValue,sDataType); 55 if(vValue1<vValue2) 56 { 57 return -1; 58 } 59 else if(vValue1>vValue2) 60 { 61 return 1; 62 } 63 else 64 { 65 return 0; 66 } 67 }; 68 }; 69 70 //降序 71 function generateCompareTRs1(iCol,sDataType) 72 { 73 return function compareTRs(oTR1,oTR2) 74 { 75 var vValue1=convert(oTR1.cells[iCol].firstChild.nodeValue,sDataType); 76 var vValue2=convert(oTR2.cells[iCol].firstChild.nodeValue,sDataType); 77 if(vValue1>vValue2) 78 { 79 return -1; 80 } 81 else if(vValue1<vValue2) 82 { 83 return 1; 84 } 85 else 86 { 87 return 0; 88 } 89 }; 90 }; 91 92 //数据类型转换函数 93 function convert(sValue,sDataType) 94 { 95 switch(sDataType) 96 { 97 case "int":return parseInt(sValue); 98 case "float": return parseFloat(sValue); 99 case "date":return new Date(Date.parse(sValue)); 100 default:return sValue.toString(); 101 } 102 }; 103 104 </script>
例1.的HTML页面代码:
1 <html> 2 <head> 3 <title>SortTable2</title> 4 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 5 6 </head> 7 <body> 8 <form name="f1" id="f1" action="" method="post"> 9 <table border="1" id="tblSort" sortCol="-1"> 10 <thead> 11 <tr> 12 <th onClick="sortTable('tblSort',0);" style="cursor:pointer">Last Name</th> 13 <th onClick="sortTable('tblSort',1)" style="cursor:pointer">First Name</th> 14 <th onClick="sortTable('tblSort',2,'date')" style="cursor:pointer">Birthday</th> 15 <th onClick="sortTable('tblSort',3,'int')" style="cursor:pointer">Silbings</th> 16 </tr> 17 </thead> 18 <tbody> 19 <tr> 20 <td>Simth</td> 21 <td>John</td> 22 <td>7/12/1978</td> 23 <td>2</td> 24 </tr> 25 <tr> 26 <td>Johnson</td> 27 <td>Betty</td> 28 <td>5/12/1965</td> 29 <td>5</td> 30 </tr> 31 <tr> 32 <td>Henderson</td> 33 <td>Nathan</td> 34 <td>10/15/1977</td> 35 <td>3</td> 36 </tr> 37 <tr> 38 <td>Willianms</td> 39 <td>James</td> 40 <td>2/25/1949</td> 41 <td>1</td> 42 </tr> 43 <tr> 44 <td>Gilliam</td> 45 <td>Michael</td> 46 <td>7/8/1980</td> 47 <td>4</td> 48 </tr> 49 <tr> 50 <td>Walker</td> 51 <td>Matthew</td> 52 <td>6/18/1981</td> 53 <td>3</td> 54 </tr> 55 </tbody> 56 </table> 57 </form> 58 </body> 59 </html>
例2.根据中文字符串排序功能:
1 * 比较函数 2 * @param {Object} param1 要比较的参数1 3 * @param {Object} param2 要比较的参数2 4 * @return {Number} 如果param1 > param2 返回 1 5 * 如果param1 == param2 返回 0 6 * 如果param1 < param2 返回 -1 7 */ 8 function compareFunc(param1,param2){ 9 //如果两个参数均为字符串类型 10 if(typeof param1 == "string" && typeof param2 == "string"){ 11 return param1.localeCompare(param2); 12 } 13 //如果参数1为数字,参数2为字符串 14 if(typeof param1 == "number" && typeof param2 == "string"){ 15 return -1; 16 } 17 //如果参数1为字符串,参数2为数字 18 if(typeof param1 == "string" && typeof param2 == "number"){ 19 return 1; 20 } 21 //如果两个参数均为数字 22 if(typeof param1 == "number" && typeof param2 == "number"){ 23 if(param1 > param2) return 1; 24 if(param1 == param2) return 0; 25 if(param1 < param2) return -1; 26 } 27 }
这些东西都是在工作中碰到的一些问题,在网上查找的一些资料,分享一下,希望对大家有所帮助!
浙公网安备 33010602011771号