javascript - DataTables 仅打印选定的选项
解决方案
对我来说,深入修改 DOM(添加额外的隐藏<span>
节点、保持其内容最新并<select>
在打印时切换具有原始节点的节点的可见性)而不是使用实际的 DataTables 数据是远离 DataTables API 的方式。
我可能建议的是通过扩展按钮的默认行为来自定义打印窗口Print:
$('table').DataTable({
...
buttons: [
...
{
extend: 'print',
customize: function(win){
/* prepare whatever printing page you like */
}
}
]
})
在customize
选项回调中,您可以将表格的数据抓取到变量中,并在打印窗口 ( ) 中创建另一个DataTable()
适合打印的数据。win
此处适合打印是指您可以剥离交互式元素(搜索栏、按钮、分页控件等)并替换用户输入元素,例如<select>
或<input>
用它们对应的值。例如,可打印版本设置可能包含:
$('table').DataTable({
...
dom: 't',
paging: false,
order: []
})
您应该记住的一件事是,每当用户与<select>
原始表中的元素进行交互时,您必须将这些更改提交到基础数据(稍后将用于打印),例如:
$('table').on('change', 'tbody select', function(e){
dataTable.cell($(this).closest('td')).data($(this).val());
});
您可以在下面找到此方法的完整演示(由于实时代码段安全策略,它无法打开打印窗口,您可以参考此代码笔或将 JS 和 HTML 克隆到本地环境)。
$(document).ready(() => {
const dataTable = $('table').DataTable({
dom: 'Bt',
data: [{opt: '', val: 'valueA'}, {opt: '', val: 'valueB'}, {opt: '', val: 'valueC'}],
columns: [{
title: 'Options',
data: 'opt',
render: data => '<select>'+['','Option1','Option2','Option3'].reduce((options,option) => options+=`<option value="${option}" ${option == data ? 'selected' : ''}>${option}</option>`,'')+'</select>'
}, {
title: 'Value',
data: 'val'
}
],
buttons: [{
extend:'print',
customize: function(win){
const tableData = $('table').DataTable().data();
$(win.document.body).html('<table></table>');
$(win.document).ready(() => {
$(win.document.body).find('table').DataTable({
dom: 't',
data: tableData,
paging: 'false',
order: [],
columns: [
{title: 'Options', data: 'opt'},
{title: 'Value', data: 'val'}
]
})
})
}
}]
});
$('table').on('change', 'tbody select', function(e){
dataTable.cell($(this).closest('td')).data($(this).val());
});
})
<!doctype html><html><head><link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/jq-3.3.1/dt-1.10.18/rg-1.1.0/datatables.min.css" /><script type="application/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"></script><script type="text/javascript" src="https://cdn.datatables.net/v/dt/jq-3.3.1/dt-1.10.18/rg-1.1.0/datatables.min.js"></script><script src="https://cdn.datatables.net/buttons/1.5.6/js/dataTables.buttons.min.js"></script><script src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.print.min.js"></script> </head><body><table></table></body></html>
ps我无法建议相关代码,因为您没有发布任何代码,但是,我想这个概念听起来很清楚,因此您可以轻松地将其部署到您的项目中
推荐阅读
- node.js - Twilio Whatsapp:发送多媒体消息
- c++ - 前向打包在模板类中不起作用
- java-7 - 在 ubuntu 中更改 jdeveloper 11g(11.2) 的 JDK 版本
- java - 使用 Java 8 重构多态性
- javascript - 深度嵌套对象中未定义变量的默认值
- laravel - Laravel - 仅应发布请求的混合内容
- reactjs - 在哪种生命周期方法中,我必须调用我的操作创建者来检查用户是否经过身份验证?
- angular - 找不到“AppModule”ngx-rocket metronic 主题的 NgModule 元数据中的错误
- kaggle - Kaggle - Image.open OSError:无法识别图像文件
- c++ - 如果用户不小心给出了不正确的数据类型,cin 如何工作?