欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2011年06月20日 20:02:55   作者:  
正好項(xiàng)目中有個(gè)小需求, 要求把表格指定列中內(nèi)容相同的單元格進(jìn)行合并,本質(zhì)上涉及的就是td的rowspan屬性, 數(shù)出含相同內(nèi)容單元格的個(gè)數(shù), 然后給第一個(gè)與上一行內(nèi)容不同的td其rowspan屬性附上正確的值即可, 為了能直觀的理解
效果如下

原表格:

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

效果出來, 看上去比較簡單, 下面先看下頁面

復(fù)制代碼 代碼如下:

<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>

復(fù)制代碼 代碼如下:

// 這里寫成了一個(gè)jquery插件的形式
$('#process').mergeCell({
// 目前只有cols這么一個(gè)配置項(xiàng), 用數(shù)組表示列的索引,從0開始
// 然后根據(jù)指定列來處理(合并)相同內(nèi)容單元格
cols: [0, 3]
});

下面看看這個(gè)小插件的完整代碼:
復(fù)制代碼 代碼如下:

;(function($) {
// 看過jquery源碼就可以發(fā)現(xiàn)$.fn就是$.prototype, 只是為了兼容早期版本的插件
// 才保留了jQuery.prototype這個(gè)形式
$.fn.mergeCell = function(options) {
return this.each(function() {
var cols = options.cols;
for ( var i = cols.length - 1; cols[i] != undefined; i--) {
// fixbug console調(diào)試
// console.debug(cols[i]);
mergeCell($(this), cols[i]);
}
dispose($(this));
});
};
// 如果對(duì)javascript的closure和scope概念比較清楚, 這是個(gè)插件內(nèi)部使用的private方法
// 具體可以參考本人前一篇隨筆里介紹的那本書
function mergeCell($table, colIndex) {
$table.data('col-content', ''); // 存放單元格內(nèi)容
$table.data('col-rowspan', 1); // 存放計(jì)算的rowspan值 默認(rèn)為1
$table.data('col-td', $()); // 存放發(fā)現(xiàn)的第一個(gè)與前一行比較結(jié)果不同td(jQuery封裝過的), 默認(rèn)一個(gè)"空"的jquery對(duì)象
$table.data('trNum', $('tbody tr', $table).length); // 要處理表格的總行數(shù), 用于最后一行做特殊處理時(shí)進(jìn)行判斷之用
// 我們對(duì)每一行數(shù)據(jù)進(jìn)行"掃面"處理 關(guān)鍵是定位col-td, 和其對(duì)應(yīng)的rowspan
$('tbody tr', $table).each(function(index) {
// td:eq中的colIndex即列索引
var $td = $('td:eq(' + colIndex + ')', this);
// 取出單元格的當(dāng)前內(nèi)容
var currentContent = $td.html();
// 第一次時(shí)走此分支
if ($table.data('col-content') == '') {
$table.data('col-content', currentContent);
$table.data('col-td', $td);
} else {
// 上一行與當(dāng)前行內(nèi)容相同
if ($table.data('col-content') == currentContent) {
// 上一行與當(dāng)前行內(nèi)容相同則col-rowspan累加, 保存新值
var rowspan = $table.data('col-rowspan') + 1;
$table.data('col-rowspan', rowspan);
// 值得注意的是 如果用了$td.remove()就會(huì)對(duì)其他列的處理造成影響
$td.hide();
// 最后一行的情況比較特殊一點(diǎn)
// 比如最后2行 td中的內(nèi)容是一樣的, 那么到最后一行就應(yīng)該把此時(shí)的col-td里保存的td設(shè)置rowspan
if (++index == $table.data('trNum'))
$table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
} else { // 上一行與當(dāng)前行內(nèi)容不同
// col-rowspan默認(rèn)為1, 如果統(tǒng)計(jì)出的col-rowspan沒有變化, 不處理
if ($table.data('col-rowspan') != 1) {
$table.data('col-td').attr('rowspan', $table.data('col-rowspan'));
}
// 保存第一次出現(xiàn)不同內(nèi)容的td, 和其內(nèi)容, 重置col-rowspan
$table.data('col-td', $td);
$table.data('col-content', $td.html());
$table.data('col-rowspan', 1);
}
}
});
}
// 同樣是個(gè)private函數(shù) 清理內(nèi)存之用
function dispose($table) {
$table.removeData();
}
})(jQuery);

主要的說明在注釋里應(yīng)該都有了, 代碼的確比較簡單, 像有些地方還值得改進(jìn)
處理的table內(nèi)容是從tbody開始查找的, 如果沒有tbody, 那應(yīng)該給出個(gè)更通用化的方案
for ( var i = cols.length - 1; cols[i] != undefined; i--)...如果表格數(shù)據(jù)量大, 處理的列也比較多, 這里不進(jìn)行優(yōu)化會(huì)有造成瀏覽器線程阻塞的風(fēng)險(xiǎn), 可以考慮用setTimeout
其他什么值得改進(jìn)的, 我想應(yīng)該會(huì)不少的

相關(guān)文章

最新評(píng)論