/*! * Print button for Buttons and DataTables. * 2015 SpryMedia Ltd - datatables.net/license */ (function($, DataTable) { "use strict"; var _link = document.createElement( 'a' ); /** * Convert a `link` tag's URL from a relative to an absolute address so it will * work correctly in the popup window which has no base URL. * * @param {node} el Element to convert */ var _relToAbs = function( el ) { var url; var clone = $(el).clone()[0]; var linkHost; if ( clone.nodeName.toLowerCase() === 'link' ) { _link.href = clone.href; linkHost = _link.host; // IE doesn't have a trailing slash on the host // Chrome has it on the pathname if ( linkHost.indexOf('/') === -1 && _link.pathname.indexOf('/') !== 0) { linkHost += '/'; } clone.href = _link.protocol+"//"+linkHost+_link.pathname+_link.search; } return clone.outerHTML; }; DataTable.ext.buttons.print = { className: 'buttons-print', text: function ( dt ) { return dt.i18n( 'buttons.print', 'Print' ); }, action: function ( e, dt, button, config ) { var data = dt.buttons.exportData( config.exportOptions ); var addRow = function ( d, tag ) { var str = ''; for ( var i=0, ien=d.length ; i'+d[i]+''; } return str + ''; }; // Construct a table for printing var html = ''; if ( config.header ) { html += ''+ addRow( data.header, 'th' ) +''; } html += ''; for ( var i=0, ien=data.body.length ; i'; } // Open a new window for the printable table var win = window.open( '', '' ); var title = config.title.replace( '*', $('title').text() ); win.document.close(); // Inject the title and also a copy of the style and link tags from this // document so the table can retain its base styling. Note that we have // to use string manipulation as IE won't allow elements to be created // in the host document and then appended to the new window. var head = ''+title+''; $('style, link').each( function () { head += _relToAbs( this ); } ); $(win.document.head).html( head ); // Inject the table and other surrounding information $(win.document.body).html( '

'+title+'

'+ '
'+config.message+'
'+ html ); if ( config.customize ) { config.customize( win ); } setTimeout( function () { if ( config.autoPrint ) { win.print(); // blocking - so close will not win.close(); // execute until this is done } }, 250 ); }, title: '*', message: '', exportOptions: {}, header: true, footer: false, autoPrint: true, customize: null }; })(jQuery, jQuery.fn.dataTable);