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

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

【问题讨论】:

    标签: javascript jquery datatables


    【解决方案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.hidden{display:block;}
           select.language-box{display:none;}
        }
        

        方法三:

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

        <body onbeforeprint="myFunction()">
        

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

        希望能回答你的问题:)

        【讨论】:

          猜你喜欢
          • 2012-04-08
          • 2018-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多