【问题标题】:jquery plugin Datatable :using rowspan in tbody causes wrongjquery插件Datatable:在tbody中使用rowspan会导致错误
【发布时间】:2011-08-07 07:51:16
【问题描述】:
我正在使用一个名为DataTables的jQuery插件:
http://www.datatables.net/
插件不支持 tbody 中的行跨度
<tr class="colorrow">
<td id="greater" rowspan="3">TMMS</td>
<td>Case Volume</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
还有其他解决办法吗?
【问题讨论】:
标签:
jquery
datatables
html-table
【解决方案1】:
试试这个。只需应用 css "display:none;"您要应用行跨度的位置。
<table id="example">
<tr class="colorrow">
<td id="greater" rowspan="3">TMMS</td>
<td>Case Volume</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
<tr class="colorrow">
<td style="display: none;">TMMS</td>
<td>Case Volume</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
<tr class="colorrow">
<td style="display: none;">TMMS</td>
<td>Case Volume</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
</table>
为数据表放置相同的脚本。
<script type="text/javascript">
$(document).ready(function() {
$('#example').DataTable();
});
</script>
【解决方案3】:
datatables.net 网站上的 fnFakeRowspan 函数对我来说效果不佳。相反,我写了一个新版本:
https://gist.github.com/4155754
要使用它,请将 data-rowspan="XXX" 和 data-hide="true" 属性添加到您的单元格中,如下所示:
<table id="table">
<tr>
<td data-rowspan="2">-</td>
</tr>
<tr>
<td data-hide="true">-</td>
</tr>
</table>
理想情况下,此脚本会自动计算要隐藏的单元格,但我已经有了该信息,所以没有将其写入此脚本。
然后照常调用:
$('#table').dataTable().fnFakeRowspan();
【解决方案4】:
重绘表格后可以隐藏单元格并添加rowspan属性
在配置中添加参数drawCallback:
"drawCallback": function ( settings ) {
drawCallback(this.api());
}
然后暴露回调函数
/**
* drawCallback
* launch after search
*
* @param {Object} api - dataTable().api()
* @param {bool} isMobile
*
**/
function drawCallback(api) {
var rows = api.rows( {page:'current'} ).nodes(),
settings = {
"COLUMN_THEME" : 1,
"COLUMN_SUBTHEME" : 3
};
$("#myTable").find('td').show();
mergeCells(rows, settings.COLUMN_THEME);
mergeCells(rows, settings.COLUMN_SUBTHEME);
}
}
然后是折叠的函数
/**
* mergeCells
* Merges cells with the same wording
*
* @param {Object} api - dataTable().api()
* @param {Array} rows - array of selected TR element
* @param {Number} rowIndex - index of column
*
**/
function mergeCells(rows, rowIndex) {
var last = null,
currentRow = null,
k = null,
gNum = 0,
refLine = null;
rows.each( function (line, i) {
currentRow = line.childNodes[rowIndex];
if ( last === currentRow.innerText ) {
currentRow.setAttribute('style', 'display: none');
++k;
return; //leave early
}
last = currentRow.innerText;
if ( i > 0 ) {
rows[refLine].childNodes[rowIndex].rowSpan = ++k;
++gNum;
}
k = 0; refLine = i;
});
// for the last group
rows[refLine].childNodes[rowIndex].rowSpan = ++k;
}