本文所实现的表格排序大致可以分为以下几个步骤:
1、取得要排序的所有行,将其引用push到一个数组中
2、根据要排序的行的情况编写数组排序时使用的比较函数
3、对包含所有行引用的数组进行排序
4、将排序后的数组按照指定的顺序把数组所引用的行重新写回DOM
如果您对使用DOM操作表格还不太熟悉,您可以参考一下《使用DOM编写浏览器兼容的Table操作》,如果您对数组的排序还不太熟悉,可以参考一下《数组排序以及在汉字排序中localeCompare()方法的使用》,因为使用DOM操作表格和数组排序是表格排序的基础。
先看一下我们示例用的代码,本文会按照上面提到的步骤一步一步的分析:
1 var asc = true;
2 var arrayTr = []; //存放所有要排序的行引用的容器
3 function sortTable(){
4 //取得所有要排序的行
5 var oTable = document.getElementById("oTable");
6 var oTBody = oTable.tBodies[0];
7 var allTr = oTBody.rows;
8 //将要排序的行放入数组以排序
9 for(var i=0;i<allTr.length;i++){
10 arrayTr.push(allTr[i]);
11 }
12 //如果是升序
13 if(asc){
14 arrayTr.sort(compareFunc);
15 oTable.rows[0].title = "点击降序排列表格";
16 asc = false;
17 } else {
18 //如果是降序
19 arrayTr.reverse();
20 oTable.rows[0].title = "点击升序排列表格";
21 asc = true;
22 }
23 //将排过续的行按照数序重写回DOM
24 var oFragment = document.createDocumentFragment();
25 for(var j =0; j < arrayTr.length;j++){
26 oFragment.appendChild(arrayTr[j]);
27 }
28 oTBody.appendChild(oFragment);
29 }
程序的5--11行实现了我们所说的第一步,这里有两个需要说明的地方,一是我们在HTML中使用了<thead/>和<tbody />标签用于分割表格的标题本分以及要排序的部分,碍于篇幅HTML代码不再展示,二是《JavaScript高级程序设计》说Table的 tBodies属性是一个JS中的集合,而不是数组,没有sort()方法,所以不能用来直接排序,关于JS集合的概念还需要我们好好研究啊,不过这不是本文的重点,这里我们想说明的重点是,tBodies不能拿来直接排序。
程序的13--22行实现了第三步,这里我们隐藏了第二步的具体实现(在后面的部分会详细说明)我们认为这样可以更好的说明我们的思路,而不会让自己纠缠于具体的方法实现导致对程序没有一个总体的认识。还要说明的是程序中我们使用了一个全局性的容器来装载排序行,所以函数执行后,arrayTr总会包含最后一次排序的行引用顺序,这时如果我们想进行倒序的话只需调用reverse()方法,而不再需要对数组进行逆向排序。
程序的24行使用了document.createDocumentFragment()可以得到一个文档碎片,documentFragment是一个不完整的document对象,主要用于存放暂时没有加入dom树的Element。作为js操作dom的缓存,十分好用,他会一次性的将改动在DOM中呈现,而不是每次操作DOM都要是客户端重绘。
下面看用于实现我们第二步的函数的具体实现:
1 /**
2 * 比较函数
3 * @param {Object} param1 要比较的行1
4 * @param {Object} param2 要比较的行2
5 * @return {Number} 如果param1 > param2 返回 1
6 * 如果param1 == param2 返回 0
7 * 如果param1 < param2 返回 -1
8 */
9 function compareFunc(oTr1,oTr2){
10 var param1 = oTr1.cells[0].childNodes[0].nodeValue;
11 var param2 = oTr2.cells[0].childNodes[0].nodeValue;
12 //如果两个参数均为字符串类型
13 if(isNaN(param1) && isNaN(param2)){
14 return param1.localeCompare(param2);
15 }
16 //如果参数1为数字,参数2为字符串
17 if(!isNaN(param1) && isNaN(param2)){
18 return -1;
19 }
20 //如果参数1为字符串,参数2为数字
21 if(isNaN(param1) && !isNaN(param2)){
22 return 1;
23 }
24 //如果两个参数均为数字
25 if(!isNaN(param1) && !isNaN(param2)){
26 if(Number(param1) > Number(param2)) return 1;
27 if(Number(param1) == Number(param2)) return 0;
28 if(Number(param1) < Number(param2)) return -1;
29 }
30 }
对于上述代码的具体解释,请参考《数组排序以及在汉字排序中localeCompare()方法的使用》,因为我们只在10行、11行改变了取数据的方式而已。
以上我们说明了单列表格的排序思路及方法,有了这些思路我们可以很容易的扩展我们的程序,实现具有更多功能的表格排序。
分享到:
相关推荐
这次的例子,只是把Nicholas C .Zakas的例子理解了一下,代码是在学习表格排序时的Demo. 单个数据类型的排序比较简单,他这个例子的特别之处在于能兼容多种数据类型的排序。例子 很简单,但 排序的主方法,有三个...
本资源“Table表格排序显示jQuery代码.zip”包含了一个使用jQuery实现的表格排序功能,这对于数据展示和用户交互至关重要。下面将详细解释这个项目中涉及的关键知识点。 1. **jQuery基础**: jQuery的核心是选择器...
这份“十几万字前端学习笔记.pdf”文件中的内容,涵盖了前端开发的核心知识点,主要围绕HTML、CSS、JavaScript等基础技术,以及现代前端技术栈中的工具和框架,如Vue.js和Webpack。此外,还涉及了一些前端工程实践...
Grid组件是一种强大的数据展示工具,能够以表格的形式呈现数据集合,支持排序、分页、筛选等功能,非常适合展示大量结构化数据。 #### 实例分析 同样,在`function test123()`中,我们看到了Grid组件的创建和配置...
3. **表格排序**:表格的排序功能通常是通过JavaScript事件监听实现的。用户点击列头时,JS会捕获这个事件,根据用户选择的排序方式(升序或降序)对数据进行排序,然后更新表格。排序可能基于服务器返回的数据,也...
这个学习笔记主要围绕“jqGrid学习笔记1”展开,内容来源于jqGrid的英文PDF文档,结合了源码解析和实用工具的介绍。 首先,jqGrid支持多种数据源,包括JSON、XML、HTML、CSV等,这使得它能灵活地与各种后端服务进行...
《jQuery动态表格数据分页检索排序代码》 在网页开发中,动态表格数据的分页、检索和排序功能是常见的需求,特别是在数据量较大的情况下,为了提高用户体验,这些功能尤为重要。jQuery作为一个轻量级的JavaScript库...
**jQuery学习笔记 jQuery API** jQuery,作为一款广泛使用的JavaScript库,极大地简化了DOM操作、事件处理、动画制作和Ajax交互。本笔记旨在帮助开发者快速上手并深入理解jQuery的核心概念和API。 ### 1. jQuery...
3. **表格组件**:`datagrid`(数据网格)提供了数据的展示、排序、分页等功能,可以结合后台进行数据交互。 4. **菜单组件**:包括`menu`(菜单)、`menubutton`(菜单按钮),用于构建应用程序的导航结构。 5. **...
在本篇JQueryEasyUI的学习笔记中,我们将深入探讨如何利用这个强大的JavaScript库来实现一些常见的数据操作功能,包括批量删除、行内编辑以及自定义编辑器方法。JQueryEasyUI是一个基于jQuery的UI框架,它提供了一...
以下是对EXT学习笔记中涉及的关键知识点的详细说明: 1. **EXT Form**: EXT中的表单组件是构建用户交互界面的重要部分。它们允许用户输入数据并将其提交到服务器。EXT Form支持多种字段类型,如文本框、选择框、...
### Angular学习笔记 #### 1. 验证电子邮件地址 在Angular中,可以使用表单验证功能来检查用户输入的电子邮件地址是否有效。例如,在模板中可以添加一个`<span>`标签,用于显示错误消息,如果电子邮件格式不正确,...
- **数据筛选与排序**:在表格或列表中,用户筛选或排序数据时,Ajax可以快速更新显示结果。 ### 4. jQuery和Ajax库 为了简化Ajax的使用,许多库如jQuery提供了更友好的API。例如,使用jQuery的$.ajax()、$.get()...
在本篇学习笔记中,我们将深入探讨EXTJS中最基本的Grid的构建和配置。 首先,EXTJS的Grid由多个组件构成,其中最重要的是`ColumnModel`,它负责定义Grid中的列属性。在示例代码中,我们创建了一个`ColumnModel`对象...
开发者可以通过研究这些文件,学习如何结合Bootstrap和其他技术来创建自己的响应式表格。 总结来说,响应式表格是利用Bootstrap等框架和工具,为适应不同设备和屏幕尺寸而设计的数据展示方式。这种技术不仅提高了...
### ExtJS 学习笔记概览 #### 一、ExtJS 入门 **1.1 ExtJS 构成及如何引用** ExtJS 是一款基于 JavaScript 的开源框架,专为 Web 应用程序的前端界面设计。其核心优势在于提供了一套丰富的 UI 组件和强大的数据...
`datagrid` 是 EasyUI 提供的一个核心组件,它用于展示表格数据,并提供了丰富的功能,如排序、分页、过滤、编辑等。在源码中,`datagrid` 的实现涉及到多个 JavaScript 文件和 CSS 样式表,这些文件共同协作来提供...
在实际应用中,还可以结合JavaScript插件,如DataTables,进一步增强表格的功能,如排序、搜索和分页等。 总之,Bootstrap3的表格设计考虑了现代Web开发的需求,提供了丰富的样式选择,使开发者能够快速创建出符合...
4. 图片标签`<img>`:引入图像,通过`src`属性指定图像路径,可设置宽度`width`、高度`height`、标题`title`(鼠标悬停时显示)和备用文本`alt`(图片加载失败时显示)。 5. 超链接标签`<a>`:链接到其他资源,`...
4. **columns**:定义Grid的列,每个列都有自己的属性,如`text`(列标题)、`sortable`(是否可排序)、`renderer`(值渲染函数)、`dataIndex`(对应ArrayStore中字段的名字)、`type`(如特殊列类型`actioncolumn...