浏览 11768 次
锁定老帖子 主题:javascript页面表格排序
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-20
今天项目中需要页面点击表头,按升降排序,查找了各方面资料,根据网上实例,自己改写了一个简单的例子 说到排序,肯定少不了Array Methods 中的 sort(),简单的介绍一下. sort()方法可用来排列数组中的元素,语法是 arrayObject.sort(sortByRequest) 注释: 1.sortByRequeset是可选项,指定排列次序。必须是一个函数。 2.sort()默认是没有参数,函数按照字母大小排列。如果是数字按照默认情况排列,会出现错误(e.g:1,11,2,21) 3.当使用sort()后,array发生改变。 页面表格js排序,首先要得到具体哪个表格,这个不需要讲了吧! sTable = document.getElementById(tableId); 表格找到后必须对表格的内容进行应用,即得到表格tbodies的集合. var tbody = table.tBodies[0]; var colRows = tbody.rows; 得到tbodies集合以后放入Array里面 var aTrs = new Array; for (var i=0; i < colRows.length; i++) { aTrs[i] = colRows[i]; } 所有信息已经准备完毕,我们对array进行排序(也就是上面代码中的aTrs) aTrs.sort(compareEle()); 其中compareEle()是指定排列次序的函数。 当把数字(aTrs)排列完毕以后,需要重新生成表格 var oFragment = document.createDocumentFragment(); for(var i=0; i < aTrs.length; i++) { oFragment.appendChild(aTrs[i]); } tbody.appendChild(oFragment); 这样,基本的功能已经介绍已经完成。 如果要在项目中加入这项功能需要考虑以下基本内容 1.浏览器的类型 2.需要定位是对哪一列进行排列 3.需要排列的列的数据类型。 4.是否连续排序(eg:如果按照升序排列以后,再次点击,应该按照降序列) 所以最终详细设计 function ieOrFireFox(ob) { if (ob.textContent != null) return ob.textContent; var s = ob.innerText; return s.substring(0, s.length); } //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型 function sortAble(tableId, iCol, dataType) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var colRows = tbody.rows; var aTrs = new Array; //将将得到的列放入数组,备用 for (var i=0; i < colRows.length; i++) { aTrs[i] = colRows[i]; } //判断上一次排列的列和现在需要排列的是否同一个。 if (table.sortCol == iCol) { aTrs.reverse(); } else { //如果不是同一列,使用数组的sort方法,传进排序函数 aTrs.sort(compareEle(iCol, dataType)); } var oFragment = document.createDocumentFragment(); for (var i=0; i < aTrs.length; i++) { oFragment.appendChild(aTrs[i]); } tbody.appendChild(oFragment); //记录最后一次排序的列索引 table.sortCol = iCol; } //将列的类型转化成相应的可以排列的数据类型 function convert(sValue, dataType) { switch(dataType) { case "int": return parseInt(sValue); case "float": return parseFloat(sValue); case "date": return new Date(Date.parse(sValue)); default: return sValue.toString(); } } //排序函数,iCol表示列索引,dataType表示该列的数据类型 function compareEle(iCol, dataType) { return function (oTR1, oTR2) { var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType); var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType); if (vValue1 < vValue2) { return -1; } else if (vValue1 > vValue2) { return 1; } else { return 0; } }; } 具体使用: 将上述代码保存为 sortable.js,在同一目录下新建sortable.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <script src="sortable.js" type="text/javascript"></script> </HEAD> <BODY> <p>Sortable demo:</p> <table border="1" id="tableId"> <thead> <tr> <th onclick="sortAble('tableId', 0)" style="cursor:pointer">name</th> <th onclick="sortAble('tableId', 1, 'date')" style="cursor:pointer">Birthday</th> <th onclick="sortAble('tableId', 2, 'int')" style="cursor:pointer">Age</th> </tr> </thead> <tbody> <tr> <td>Ozone</td> <td>01/12/1982</td> <td>25</td> </tr> <tr> <td>OnlyBlue3</td> <td>10/24/1983</td> <td>23</td> </tr> <tr> <td>Momo</td> <td>10/14/1999</td> <td>8</td> </tr> </tbody> </table> </BODY> </HTML> 以上例子经过 ie6 和 firefox2.0.0.5调试通过 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-24
在项目使用当中,发现如果在页面中,本来表格中没有数据,通过js从其他地方添加到本页面时,无法进行排序,甚至连onclick事件都不触发。至于为什么,还没有研究明白。找了一种“偷懒方法”可以解决上述问题。即添加一个隐藏行。
<HTML> <HEAD> <TITLE> New Document </TITLE> <script src="sortable.js" type="text/javascript"></script> </HEAD> <BODY> <p>Sortable demo:</p> <table border="1" id="tableId"> <thead> <tr> <th onclick="sortAble('tableId', 0)" style="cursor:pointer">name</th> <th onclick="sortAble('tableId', 1, 'date')" style="cursor:pointer">Birthday</th> <th onclick="sortAble('tableId', 2, 'int')" style="cursor:pointer">Age</th> </tr> </thead> <tbody> <tr style="display:none"></tr> <tr> <td>Ozone</td> <td>01/12/1982</td> <td>25</td> </tr> <tr> <td>OnlyBlue3</td> <td>10/24/1983</td> <td>23</td> </tr> <tr> <td>Momo</td> <td>10/14/1999</td> <td>8</td> </tr> </tbody> </table> </BODY> </HTML> |
|
返回顶楼 | |
发表时间:2007-08-01
最近一直对以前的系统中的表格添加排序功能,发现系统中的表格并没有<thead></thead><tbody></tbody>这些标签,每次出了给表头添加点击事件,还要添加而外标签.为了减少工作量,把js做了个小小调整.
function ieOrFireFox(ob){ if (ob.textContent != null) return ob.textContent; var s = ob.innerText; return s.substring(0, s.length); } //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型 function sortAble(tableId, iCol, dataType){ var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var colRows = tbody.rows; var aTrs = new Array; //将将得到的列放入数组,备用 for (var i=0; i < colRows.length-1; i++) { aTrs[i] = colRows[i+1]; } //判断上一次排列的列和现在需要排列的是否同一个。 if (table.sortCol == iCol) { aTrs.reverse(); } else { //如果不是同一列,使用数组的sort方法,传进排序函数 aTrs.sort(compareEle(iCol, dataType)); } var oFragment = document.createDocumentFragment(); for (var i=0; i < aTrs.length; i++) { oFragment.appendChild(aTrs[i]); } tbody.appendChild(oFragment); //记录最后一次排序的列索引 table.sortCol = iCol; } //将列的类型转化成相应的可以排列的数据类型 function convert(sValue, dataType) { switch(dataType) { case "int": return parseInt(sValue); case "float": return parseFloat(sValue); case "date": return new Date(Date.parse(sValue)); default: return sValue.toString(); } } //排序函数,iCol表示列索引,dataType表示该列的数据类型 function compareEle(iCol, dataType) { return function (oTR1, oTR2) { var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType); var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType); if (vValue1 < vValue2) { return -1; } else if (vValue1 > vValue2) { return 1; } else { return 0; } }; } |
|
返回顶楼 | |
发表时间:2007-08-01
这样在html文件中,可以去掉<thead></thead><tbody></tbody>标签了!
|
|
返回顶楼 | |
发表时间:2007-08-05
要对表格进行各种操作建议用DhtmlGrid,功能很全面不仅包括对表格排序还可以编辑,拖拉宽度,选定等等.
|
|
返回顶楼 | |
发表时间:2007-08-29
Ozone 写道 //排序函数,iCol表示列索引,dataType表示该列的数据类型
function compareEle(iCol, dataType) { return function (oTR1, oTR2) { var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType); var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType); if (vValue1 < vValue2) { return -1; } else if (vValue1 > vValue2) { return 1; } else { return 0; } }; 这里的oTR1, oTR2的值是怎么获得的?为什么会有值? |
|
返回顶楼 | |