合并table相同单元格的jquery插件分享(很精简)


Posted in Javascript onJune 20, 2011

效果如下

原表格:

col0 col1 col2 col3
SuZhou 11111 22222 SuZhouCity
SuZhou 33333 44444 SuZhouCity
SuZhou 55555 66666 SuZhouCity
ShangHai 77777 88888 ShangHaiCity
ShangHai uuuuu hhhhh ShangHaiCity
ShangHai ggggg ccccc ShangHaiCity
GuangZhou ttttt eeeee GuangZhouCity
GuangZhou ppppp qqqqq GuangZhouCity

处理之后的样子:

col0 col1 col2 col3
SuZhou 11111 22222 SuZhouCity
33333 44444
55555 66666
ShangHai 77777 88888 ShangHaiCity
uuuuu hhhhh
ggggg ccccc
GuangZhou ttttt eeeee GuangZhouCity
ppppp qqqqq

效果出来, 看上去比较简单, 下面先看下页面

<table id="process" cellpadding="2" cellspacing="0" border="1"> 
<thead> 
<tr > 
<td>col0</td> 
<td>col1</td> 
<td>col2</td> 
<td>col3</td> 
</tr> 
</thead> 
<tbody> 
<tr> 
<td>SuZhou</td> 
<td>11111</td> 
<td>22222</td> 
<td>SuZhouCity</td> 
</tr> 
<tr> 
<td>SuZhou</td> 
<td>33333</td> 
<td>44444</td> 
<td>SuZhouCity</td> 
</tr> 
<tr> 
<td>SuZhou</td> 
<td>55555</td> 
<td>66666</td> 
<td>SuZhouCity</td> 
</tr> 
<tr> 
<td>ShangHai</td> 
<td>77777</td> 
<td>88888</td> 
<td>ShangHaiCity</td> 
</tr> 
<tr> 
<td>ShangHai</td> 
<td>uuuuu</td> 
<td>hhhhh</td> 
<td>ShangHaiCity</td> 
</tr> 
<tr> 
<td>ShangHai</td> 
<td>ggggg</td> 
<td>ccccc</td> 
<td>ShangHaiCity</td> 
</tr> 
<tr> 
<td>GuangZhou</td> 
<td>ttttt</td> 
<td>eeeee</td> 
<td>GuangZhouCity</td> 
</tr> 
<tr> 
<td>GuangZhou</td> 
<td>ppppp</td> 
<td>qqqqq</td> 
<td>GuangZhouCity</td> 
</tr> 
</tbody> 
</table>

// 这里写成了一个jquery插件的形式 
$('#process').mergeCell({ 
// 目前只有cols这么一个配置项, 用数组表示列的索引,从0开始 
// 然后根据指定列来处理(合并)相同内容单元格 
cols: [0, 3] 
});

下面看看这个小插件的完整代码:
;(function($) { 
// 看过jquery源码就可以发现$.fn就是$.prototype, 只是为了兼容早期版本的插件 
// 才保留了jQuery.prototype这个形式 
$.fn.mergeCell = function(options) { 
return this.each(function() { 
var cols = options.cols; 
for ( var i = cols.length - 1; cols[i] != undefined; i--) { 
// fixbug console调试 
// console.debug(cols[i]); 
mergeCell($(this), cols[i]); 
} 
dispose($(this)); 
}); 
}; 
// 如果对javascript的closure和scope概念比较清楚, 这是个插件内部使用的private方法 
// 具体可以参考本人前一篇随笔里介绍的那本书 
function mergeCell($table, colIndex) { 
$table.data('col-content', ''); // 存放单元格内容 
$table.data('col-rowspan', 1); // 存放计算的rowspan值 默认为1 
$table.data('col-td', $()); // 存放发现的第一个与前一行比较结果不同td(jQuery封装过的), 默认一个"空"的jquery对象 
$table.data('trNum', $('tbody tr', $table).length); // 要处理表格的总行数, 用于最后一行做特殊处理时进行判断之用 
// 我们对每一行数据进行"扫面"处理 关键是定位col-td, 和其对应的rowspan 
$('tbody tr', $table).each(function(index) { 
// td:eq中的colIndex即列索引 
var $td = $('td:eq(' + colIndex + ')', this); 
// 取出单元格的当前内容 
var currentContent = $td.html(); 
// 第一次时走此分支 
if ($table.data('col-content') == '') { 
$table.data('col-content', currentContent); 
$table.data('col-td', $td); 
} else { 
// 上一行与当前行内容相同 
if ($table.data('col-content') == currentContent) { 
// 上一行与当前行内容相同则col-rowspan累加, 保存新值 
var rowspan = $table.data('col-rowspan') + 1; 
$table.data('col-rowspan', rowspan); 
// 值得注意的是 如果用了$td.remove()就会对其他列的处理造成影响 
$td.hide(); 
// 最后一行的情况比较特殊一点 
// 比如最后2行 td中的内容是一样的, 那么到最后一行就应该把此时的col-td里保存的td设置rowspan 
if (++index == $table.data('trNum')) 
$table.data('col-td').attr('rowspan', $table.data('col-rowspan')); 
} else { // 上一行与当前行内容不同 
// col-rowspan默认为1, 如果统计出的col-rowspan没有变化, 不处理 
if ($table.data('col-rowspan') != 1) { 
$table.data('col-td').attr('rowspan', $table.data('col-rowspan')); 
} 
// 保存第一次出现不同内容的td, 和其内容, 重置col-rowspan 
$table.data('col-td', $td); 
$table.data('col-content', $td.html()); 
$table.data('col-rowspan', 1); 
} 
} 
}); 
} 
// 同样是个private函数 清理内存之用 
function dispose($table) { 
$table.removeData(); 
} 
})(jQuery);

主要的说明在注释里应该都有了, 代码的确比较简单, 像有些地方还值得改进
处理的table内容是从tbody开始查找的, 如果没有tbody, 那应该给出个更通用化的方案
for ( var i = cols.length - 1; cols[i] != undefined; i--)...如果表格数据量大, 处理的列也比较多, 这里不进行优化会有造成浏览器线程阻塞的风险, 可以考虑用setTimeout
其他什么值得改进的, 我想应该会不少的
Javascript 相关文章推荐
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
Jan 24 Javascript
九种js弹出对话框的方法总结
Mar 12 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
Apr 21 Javascript
YUI模块开发原理详解
Nov 18 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
Sep 24 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
Sep 05 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
Feb 22 Javascript
javascript完美实现给定日期返回上月日期的方法
Jun 15 Javascript
bootstrap paginator分页前后台用法示例
Jun 17 Javascript
vue使用自定义指令实现拖拽
Jan 29 Javascript
vue图片上传组件使用详解
Dec 23 Javascript
修改vue源码实现动态路由缓存的方法
Jan 21 Javascript
functional继承模式 摘自javascript:the good parts
Jun 20 #Javascript
jQuery数组处理方法汇总
Jun 20 #Javascript
jQuery UI AutoComplete 使用说明
Jun 20 #Javascript
jQuery 源码分析笔记(3) Deferred机制
Jun 19 #Javascript
jQuery 源码分析笔记(7) Queue
Jun 19 #Javascript
jQuery 源码分析笔记(5) jQuery.support
Jun 19 #Javascript
jQuery调用WebService的实现代码
Jun 19 #Javascript
You might like
PHP也可以?成Shell Script
2006/10/09 PHP
php下实现农历日历的代码
2007/03/07 PHP
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
PHP引用的调用方法分析
2016/04/25 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
详解Vue整合axios的实例代码
2017/06/21 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
vue-cli3 热更新配置操作
2020/09/18 Javascript
Python读大数据txt
2016/03/28 Python
python ansible服务及剧本编写
2017/12/29 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
python跳出双层for循环的解决方法
2019/06/24 Python
详解python列表(list)的使用技巧及高级操作
2019/08/15 Python
Python-openCV开运算实例
2020/07/05 Python
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
.NET笔试题(20个问题)
2016/02/02 面试题
就职演讲稿范文
2014/05/19 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
搞笑老公保证书
2015/02/26 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL