liuxiaolong
2019-05-09 0d1d88cdb668e75ea8609417ac18ae19947e9525
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*!
 * 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 = '<tr>';
 
            for ( var i=0, ien=d.length ; i<ien ; i++ ) {
                str += '<'+tag+'>'+d[i]+'</'+tag+'>';
            }
 
            return str + '</tr>';
        };
 
        // Construct a table for printing
        var html = '<table class="'+dt.table().node().className+'">';
 
        if ( config.header ) {
            html += '<thead>'+ addRow( data.header, 'th' ) +'</thead>';
        }
 
        html += '<tbody>';
        for ( var i=0, ien=data.body.length ; i<ien ; i++ ) {
            html += addRow( data.body[i], 'td' );
        }
        html += '</tbody>';
 
        if ( config.footer ) {
            html += '<thead>'+ addRow( data.footer, 'th' ) +'</thead>';
        }
 
        // 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>'+title+'</title>';
        $('style, link').each( function () {
            head += _relToAbs( this );
        } );
 
        $(win.document.head).html( head );
 
        // Inject the table and other surrounding information
        $(win.document.body).html(
            '<h1>'+title+'</h1>'+
            '<div>'+config.message+'</div>'+
            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);