DataTables 仅打印选定的选项

Posted

技术标签:

【中文标题】DataTables 仅打印选定的选项【英文标题】:DataTables print only selected option 【发布时间】:2019-11-20 00:07:04 【问题描述】:

我有一个带有选择输入和打印按钮的数据表,在打印时我得到了所有选择选项标签文本。如何打印只有选定选项可见的表格?

【问题讨论】:

【参考方案1】:

对我来说,更深入地修改 DOM(添加额外隐藏的 <span> 节点,使其内容保持最新,并在打印时切换具有原始 <select> 节点的内容的可见性)而不是使用实际的 DataTables 数据是远离 DataTables API。

我可能建议改为通过extending 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());  
);

您可以在下面找到此方法的完整演示(由于实时 sn-p 安全策略,它无法打开打印窗口,您可以参考此codepen 或将 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());	
	);
)
&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt;&lt;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" /&gt;&lt;script type="application/javascript" src="https://code.jquery.com/jquery-3.3.1.min.js"&gt;&lt;/script&gt;&lt;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"&gt;&lt;/script&gt;&lt;script src="https://cdn.datatables.net/buttons/1.5.6/js/dataTables.buttons.min.js"&gt;&lt;/script&gt;&lt;script src="https://cdn.datatables.net/buttons/1.5.6/js/buttons.print.min.js"&gt;&lt;/script&gt; &lt;/head&gt;&lt;body&gt;&lt;table&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;

ps我无法建议相关代码,因为您没有发布任何代码,但是,我想这个概念听起来很清楚,所以您可以轻松地将其部署到您的项目中 p>

【讨论】:

【参考方案2】:

首先浏览器不要尝试打印选择选项,而只打印选择的选项,这意味着您的打印 CSS 有问题,或者您没有使用本机功能。

如果您不想解决上述问题,下面的帖子提供了一种处理您的问题的方法。

How to use print.css to make a select look like normal text

在坚果壳中:

第 1 步:在 select 旁边创建一个 span 元素 第 2 步:在变量发生变化时保持 span 对象的更新 第 3 步:在您的打印 css 中保持选择隐藏。仅使用@media 打印 第 4 步:在你的屏幕 css 中保持 span 隐藏。仅使用@media 屏幕

享受并请阅读原始答案。

谢谢

【讨论】:

【参考方案3】:

方法一:

尝试保持选择框的默认值为空白。

方法二:

您可以保留与select-box 值绑定的隐藏text-box,并使用媒体查询在打印时显示和隐藏文本框。

@media print 

   input.hiddendisplay:block;
   select.language-boxdisplay:none;

方法三:

还有这个可能有帮助的活动

<body onbeforeprint="myFunction()">

虽然对这个事件的支持并不明确。 https://www.w3schools.com/tags/ev_onbeforeprint.asp

希望能回答你的问题:)

【讨论】:

以上是关于DataTables 仅打印选定的选项的主要内容,如果未能解决你的问题,请参考以下文章

PHP DataTables 隐藏多列

如何仅为选定的打印机自定义 ReportViewer printDialog

jQuery DataTables 获取选定的行值

如何从 DataTables 中的选定数据中获取数据

如何使用 jquery 从 asp.net 列表框中仅获取当前选定的选项

奇淫怪巧之给Delphi的PrintDialog增加一个页码选定范围打印的Edit 转