DataTables中render返回node在Responsive模式下失效如何解决?
解决DataTables 2.0中Responsive模式下返回DOM节点渲染失效的问题
针对你遇到的问题——使用columns.render返回DOM节点(node类型)时,列被Responsive隐藏后重新显示仅渲染文本而非节点,除了返回HTML字符串外,还有以下几种可行方案:
方案1:监听Responsive事件手动重渲染
利用DataTables Responsive扩展提供的responsive-display事件,在列被显示时重新生成并插入DOM节点:
$('#example').on('responsive-display', function(e, datatable, row, showHide, update) { // 仅处理列显示的场景 if (showHide) { row.cells().every(function() { var colDef = this.column().settings()[0].aoColumns[this.column().index()]; // 检查当前列是否使用了返回DOM节点的render函数 if (colDef.render && typeof colDef.render === 'function') { var data = this.data(); // 重新调用render生成DOM节点 var node = colDef.render(data, 'display', {}, {}); // 替换单元格内容 if (node instanceof Node) { this.node().innerHTML = ''; this.node().appendChild(node); } } }); } });
方案2:自定义Responsive的内容处理逻辑
重写Responsive扩展中处理单元格内容的方法,使其能识别DOM节点并直接插入:
// 保存原始的细节显示方法 var originalDetailsDisplay = $.fn.dataTable.Responsive.prototype._detailsDisplay; // 重写方法适配DOM节点渲染 $.fn.dataTable.Responsive.prototype._detailsDisplay = function(cell, rowIdx, showHide) { var result = originalDetailsDisplay.apply(this, arguments); var colDef = cell.column().settings()[0].aoColumns[cell.column().index()]; if (colDef.render && typeof colDef.render === 'function') { var node = colDef.render(cell.data(), 'display', {}, {}); if (node instanceof Node) { // 找到Responsive生成的对应内容元素并替换 var detailElement = this.$details.find('[data-column="' + cell.column().index() + '"]'); if (detailElement.length) { detailElement.html(''); detailElement.append(node); } } } return result; };
方案3:使用columns.createdCell替代部分渲染逻辑
将DOM节点的创建逻辑移至columns.createdCell回调,确保单元格初始化时就生成正确的DOM结构,Responsive显示时直接复用:
$('#example').DataTable({ columns: [ { data: 'yourData', createdCell: function(cell, cellData, rowData, rowIndex, colIndex) { // 在这里创建并插入自定义DOM节点 var customNode = document.createElement('div'); customNode.className = 'custom-tag'; customNode.textContent = cellData; cell.appendChild(customNode); }, // 非display类型仍返回原始数据 render: function(data, type) { return type !== 'display' ? data : ''; } } ], responsive: true });
三种方案各有特点:
- 方案1侵入性低,适合快速修复现有代码;
- 方案2属于全局扩展修改,适合统一处理多个表格的同类问题;
- 方案3更贴合DataTables的设计逻辑,推荐用于新开发的表格场景。
内容的提问来源于stack exchange,提问作者murison
相关产品推荐
相关产品推荐

