it's efficient to sort a table in HTML with Javascript.
to solve it. the focus is keep the event itself.
I do it for non-IE and IE with respective js code
first, let's build up the test html environment
<html>
<head>
<title>demo table sort</title>
<script src="js/SortUtil.js" type="text/javascript"></script>
<style>
#t {
border-collapse: collapse;
}
#t td {
text-align: center;
border: 1px solid #ccc;
}
#t tr:nth-child(odd){
background-color: #eee;
}
#t tr:first-child {
font-weight: bold;
background-color: #ddd;
}
.divText span {
width: 150px;
display: inline-block;
}
</style>
<script>
var $=function(id){
return document.getElementById(id);
}
window.onload=function(){
}
var asc=1;
function sort(){
var startRow=$("startRow").value;
var sortIndex=$("sortIndex").value;
var sortKey=$("sortKey").value;
var asc=($("rad1").checked)?1:0;
asc=(1==asc)?0:1;
var reg=/explorer/i;
var isIE=reg.test(navigator.appName);
// SortUtil.sortTable($("t"), startRow, sortIndex);
SortUtil.sortTable($("t"), startRow, sortIndex, sortKey, asc, isIE);
}
</script>
</head>
<body>
<table id="t">
<tr>
<td>title1</td><td>title2</td><td>title3</td><td>title4</td>
</tr>
<tr>
<td sortvalue="9">1</td><td>a</td><td>a</td><td>12</td>
</tr>
<tr>
<td sortvalue="8">2</td><td>b</td><td>b</td><td>22</td>
</tr>
<tr>
<td sortvalue="7">3</td><td>c</td><td>c</td><td>23</td>
</tr>
<tr>
<td sortvalue="6">4</td><td>d</td><td>a</td><td>4</td>
</tr>
<tr>
<td sortvalue="5">05</td><td>e</td><td>b</td><td>8</td>
</tr>
<tr>
<td sortvalue="4">6</td><td>f</td><td>c</td><td>6</td>
</tr>
<tr>
<td sortvalue="3">17</td><td>g</td><td>a</td><td>16</td>
</tr>
<tr>
<td sortvalue="2">08</td><td>h</td><td>b</td><td>12</td>
</tr>
<tr>
<td sortvalue="1">12</td><td>i</td><td>c</td><td>20</td>
</tr>
</table>
<hr />
<div class="divText">
<span>sort row start at:</span><input type="text" id="startRow" value="1" /><br />
<span>sortcolumn:</span><input type="text" id="sortIndex" value="0" /><br />
<span>sortproperty:</span><input type="text" id="sortKey" value="0" /><br />
<span>order by:</span><input id="rad1" name="sortOrder" type="radio" value="1" checked="checked" /><label for="rad1">DESC</label><input type="radio" id="rad2" name="sortOrder" style="margin-left: 20px" value="0" /><label for="rad2">ASC</label><br />
<input type="button" style="width:80;" value="sort" onclick="sort()" />
</div>
</body>
</html>
the GUI as below
second, coding js
(function(){
var array;
var table;
var startRow=1;
var sortIndex=0;
var sortKey;
var asc=1;
var isIE=false;
var SortUtil=function(){
return SortUtil;
}
this.SortUtil=SortUtil;
SortUtil.sortTable=function(_table, _startRow, _sortIndex, _sortKey, _asc, _isIE){
table=_table;
startRow=_startRow;
sortIndex=(undefined==_sortIndex || null==_sortIndex)?0:_sortIndex;
sortKey=(undefined==_sortKey || null==_sortKey)?"":_sortKey;
asc=(undefined==_asc || null==_asc)?1:_asc;
isIE=(undefined==_isIE || null==_isIE)?false:_isIE;
(isIE)?readData_IE():readData();
sortData();
writeData();
}
function readData(){
array=new Array();
try{
var len=table.rows.length;
for(var i=0;i<len-startRow;i++){
array.push(table.rows[len-i-1]);
table.deleteRow(-1);
}
}catch(err){
alert("read data: "+err);
}
}
function readData_IE(){
array=new Array();
try{
var len=table.rows.length;
for(var i=0;i<len-startRow;i++){
array.push(table.rows[len-i-1].cloneNode(true));
table.deleteRow(-1);
}
}catch(err){
alert("read data: "+err);
}
}
function sortData(){
try{
var sortMethod=(isIE)?sortArithmetic_IE:sortArithmetic;
array.sort(sortMethod);
}catch(err){
alert("sort data: "+err);
}
}
function writeData(){
try{
var len=array.length;
for(var i=0;i<len;i++){
table.tBodies[0].appendChild(array[i]);
// table.appendChild(array[i]);
}
}catch(err){
alert("write data: "+err);
}
}
function sortArithmetic(a, b){
var x, y, flag;
x=a.cells[sortIndex].getAttribute(sortKey);
y=b.cells[sortIndex].getAttribute(sortKey);
if(null==x)
x=a.cells[sortIndex].innerHTML;
if(null==y)
y=b.cells[sortIndex].innerHTML;
if(isNaN(x) || isNaN(y)){
flag=(1==asc)?compareText(x, y):compareText(y, x);
}else{
flag=(1==asc)?x-y:y-x;
}
if(NaN==flag)
flag=0;
return flag;
}
function sortArithmetic_IE(a, b){
var x, y, flag;
x=a.childNodes[sortIndex].getAttribute(sortKey);
y=b.childNodes[sortIndex].getAttribute(sortKey);
if(null==x)
x=a.childNodes[sortIndex].innerHTML;
if(null==y)
y=b.childNodes[sortIndex].innerHTML;
if(isNaN(x) || isNaN(y)){
flag=(1==asc)?compareText(x, y):compareText(y, x);
}else{
flag=(1==asc)?x-y:y-x;
}
if(NaN==flag)
flag=0;
return flag;
}
function compareText(a, b){
var arrayA=new Array();
var arrayB=new Array();
for(var i=0;i<a.length;i++){
arrayA.push(a.charCodeAt(i));
}
for(var i=0;i<b.length;i++){
arrayB.push(b.charCodeAt(i));
}
var len=(arrayA.length>=arrayB.length)?arrayA.length:arrayB.length;
for(var i=0;i<len;i++){
var x=arrayA[i];
var y=arrayB[i];
var flag=x-y;
if(flag!=0)
return flag;
}
}
})();
save to "images/SortUtil.js" to linked by html
now, it's done.
---------------------------
note:
1.in sort arithmetic method, as per tr have been removed from table, so it's not support to access cell node by method: tr.cells[?] in IE, but it's support by FF, Chrome. so we use childNode to instead for access cell node.
2.in IE, it's forbidden to (tr) appendChild to table directly. it muse appendChild to tBodies[0]. the issue is not exist in FF, Chrome also.
- 大小: 17.3 KB
分享到:
相关推荐
排序算法可能包括冒泡排序、快速排序或者更高效的库如`lodash`的`sortBy`方法。同时,为了提供良好的用户体验,排序状态(如箭头指示当前排序方式)需要同步更新到表头。 `index.html`是网页的主文件,它定义了页面...
- `Array.prototype.sort()`函数是JavaScript中进行数组排序的基础,可以用于表格数据的排序。 - 自定义排序函数可以用来处理特定类型的排序逻辑,比如日期、数字或字符串。 3. **jQuery插件**: - 插件如...
首先,我们需要引入 Bootstrap Table 所需的 CSS 和 JS 文件,如在描述中所示,包括 Bootstrap 的基础样式和 JavaScript 库,以及 Bootstrap Table 自身的 CSS 和 JS 文件。确保这些资源已经正确地添加到项目中,...
例如,使用jQuery库的`$.fn.dataTable`插件或者原生JavaScript的`Array.sort()`配合DOM操作,可以轻松实现表格排序功能。 3. **后端实现**:在服务器端,数据库查询通常支持排序功能,如SQL中的`ORDER BY`语句。...
$query->orderBy($request->input('sort'), $request->input('order')); } $data = $query->get(); return response()->json($data); } ``` 在前端,你需要配置 mks-smart-table,使其向这个 API 发送请求,...
在本文中,我们将深入探讨如何使用AngularJS来创建一个功能丰富的数据表,其中包括排序(Sort)、搜索(Search)和分页(Limit)等基本操作。AngularJS是一个强大的前端JavaScript框架,它提供了双向数据绑定、模块...
Bootstrap Table 是一个强大的JavaScript组件,用于展示数据并提供了多种功能,如单选、复选、排序、分页、列显示/隐藏、固定标题滚动、响应式设计、Ajax数据加载、点击列排序以及卡片视图等。这个组件轻量且功能...
Finally, we will round off by learning how to differentiate between various searching and sorting algorithms such as sequential search, binary search, quick sort, bubble sort, and so on, and how to ...
query.OrderBy(sort) : query.OrderByDescending(sort); } var total = query.Count(); var data = query.Skip(offset).Take(limit).ToList(); return Json(new { total = total, rows = data }); } ``` 这...
在JavaScript(JS)中,跨域访问是一个常见的问题,它涉及到浏览器的安全策略,因为默认情况下,浏览器禁止一个源(域名)的脚本访问另一个源的数据,以防止恶意网站窃取数据。解决跨域问题通常有以下几种方法: 1....
Java 9 Programming By Example by Peter Verhas English | 26 Apr. 2017 | ASIN: B01KOG6SWI | 504 Pages | AZW3 | 4.1 MB Key Features We bridge the gap between “learning” and “doing” by providing ...
例如,使用 Underscore.js 的 `_.find` 或 `_.where` 可以查找符合特定属性的学生,而 `_.sortBy` 则可以按姓名或成绩对学生进行排序。 HTML 是构建用户界面的基础,用于定义页面结构和内容。在这个项目中,HTML ...
ry-vue-v3.8.6数据库设计是基于Vue.js框架的数据库设计方案,本设计方案主要涉及到三个表格:gen_table、gen_table_column和qrtz_blob_triggers。下面将详细介绍这三个表格的设计理念和知识点。 gen_table表 gen_...
在JavaScript(JS)中,实现统计表排序功能是一项常见的任务,尤其在开发数据密集型的Web应用时。这里我们将深入探讨如何使用纯JS或者利用库如jQuery或Lodash来实现这一功能。 首先,理解基本概念。统计表通常由...
Meteor 是一个全栈JavaScript框架,它将数据库实时同步到客户端,使得Web应用可以实现双向数据绑定。Angular-Meteor-Smart-Table 将 AngularJS 的智能表模块与 Meteor 的实时数据同步特性相结合,使前端表格能够实时...
通过设置`ng-model`和`sort-by`属性,你可以控制排序的字段和顺序: ```html <th><a href ng-click="collection.sort('name')">Name</a></th> ``` ### 3. 前端排序 对于小规模数据或不涉及后端交互的情况,`...
DataTables.js是一个强大的JavaScript库,它提供了丰富的功能,如表格排序、搜索、分页等。本文将深入探讨如何在C#后端与.NET环境中集成DataTables.js,以便利用其排序功能。 首先,了解DataTables.js的基本概念。...
### XSL简明教程(5): 使用Order-by属性进行排序 在XML与XSL的世界里,数据处理变得异常灵活和强大。本章节我们将探讨如何利用XSL中的`order-by`属性来对XML文档进行排序,这在实际应用中非常有用,尤其是在需要根据...
完全支持 SELECT FROM INNER OUTER JOIN WHERE GROUP BY HAVING SORT BY 和子查询 索引连接 在浏览器和 node.js 上运行 向 Web 用户提供 SQL shell 的安全方式 构建说明 安装依赖项( make deps ) 编译解析器和...