251 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", {
 | 
						|
  value: true
 | 
						|
});
 | 
						|
 | 
						|
var _assign = require('babel-runtime/core-js/object/assign');
 | 
						|
 | 
						|
var _assign2 = _interopRequireDefault(_assign);
 | 
						|
 | 
						|
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
 | 
						|
 | 
						|
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
 | 
						|
 | 
						|
var _createClass2 = require('babel-runtime/helpers/createClass');
 | 
						|
 | 
						|
var _createClass3 = _interopRequireDefault(_createClass2);
 | 
						|
 | 
						|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
						|
 | 
						|
var _class = function () {
 | 
						|
  function _class(option) {
 | 
						|
    (0, _classCallCheck3.default)(this, _class);
 | 
						|
 | 
						|
    this.standards = {
 | 
						|
      strict: 'strict',
 | 
						|
      loose: 'loose',
 | 
						|
      html5: 'html5'
 | 
						|
    };
 | 
						|
    this.counter = 0;
 | 
						|
    this.settings = {
 | 
						|
      standard: this.standards.html5,
 | 
						|
      extraHead: '',
 | 
						|
      extraCss: '',
 | 
						|
      popTitle: '',
 | 
						|
      endCallback: null,
 | 
						|
      el: '' };
 | 
						|
    (0, _assign2.default)(this.settings, option);
 | 
						|
    this.init();
 | 
						|
  }
 | 
						|
 | 
						|
  (0, _createClass3.default)(_class, [{
 | 
						|
    key: 'init',
 | 
						|
    value: function init() {
 | 
						|
      this.counter++;
 | 
						|
      this.settings.id = 'printArea_' + this.counter;
 | 
						|
      var box = document.getElementById(this.settings.id);
 | 
						|
      if (box) {
 | 
						|
        box.parentNode.removeChild(box);
 | 
						|
      }
 | 
						|
      var PrintAreaWindow = this.getPrintWindow();
 | 
						|
      this.write(PrintAreaWindow.doc);
 | 
						|
      this.settings.endCallback();
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'print',
 | 
						|
    value: function print(PAWindow) {
 | 
						|
      var paWindow = PAWindow;
 | 
						|
      console.log('---调用打印 focus-----');
 | 
						|
      paWindow.focus();
 | 
						|
      paWindow.print();
 | 
						|
      console.log('---调用打印 print-----');
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'write',
 | 
						|
    value: function write(PADocument, $ele) {
 | 
						|
      PADocument.open();
 | 
						|
      PADocument.write(this.docType() + '<html>' + this.getHead() + this.getBody() + '</html>');
 | 
						|
      PADocument.close();
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'docType',
 | 
						|
    value: function docType() {
 | 
						|
      if (this.settings.standard === this.standards.html5) {
 | 
						|
        return '<!DOCTYPE html>';
 | 
						|
      }
 | 
						|
      var transitional = this.settings.standard === this.standards.loose ? ' Transitional' : '';
 | 
						|
      var dtd = this.settings.standard === this.standards.loose ? 'loose' : 'strict';
 | 
						|
 | 
						|
      return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01' + transitional + '//EN" "http://www.w3.org/TR/html4/' + dtd + '.dtd">';
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'getHead',
 | 
						|
    value: function getHead() {
 | 
						|
      var extraHead = '';
 | 
						|
      var links = '';
 | 
						|
      var style = '';
 | 
						|
      if (this.settings.extraHead) {
 | 
						|
        this.settings.extraHead.replace(/([^,]+)/g, function (m) {
 | 
						|
          extraHead += m;
 | 
						|
        });
 | 
						|
      }
 | 
						|
      [].forEach.call(document.querySelectorAll('link'), function (item, i) {
 | 
						|
        if (item.href.indexOf('.css') >= 0) {
 | 
						|
          links += '<link type="text/css" rel="stylesheet" href="' + item.href + '" >';
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      for (var i = 0; i < document.styleSheets.length; i++) {
 | 
						|
        if (document.styleSheets[i].cssRules || document.styleSheets[i].rules) {
 | 
						|
          var rules = document.styleSheets[i].cssRules || document.styleSheets[i].rules;
 | 
						|
          for (var b = 0; b < rules.length; b++) {
 | 
						|
            try {
 | 
						|
              style += rules[b].cssText;
 | 
						|
            } catch (err) {}
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if (this.settings.extraCss) {
 | 
						|
        this.settings.extraCss.replace(/([^,\s]+)/g, function (m) {
 | 
						|
          links += '<link type="text/css" rel="stylesheet" href="' + m + '">';
 | 
						|
        });
 | 
						|
      }
 | 
						|
 | 
						|
      return '<head><title>' + this.settings.popTitle + '</title>' + extraHead + links + '<style type="text/css">' + style + '</style></head>';
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'getBody',
 | 
						|
    value: function getBody() {
 | 
						|
      var ele = this.getFormData(document.querySelector(this.settings.el));
 | 
						|
      var htm = ele.outerHTML;
 | 
						|
      console.log('htm', htm);
 | 
						|
      return '<body>' + htm + '</body>';
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'getFormData',
 | 
						|
    value: function getFormData(ele) {
 | 
						|
      var that = this;
 | 
						|
      var copy = ele.cloneNode(true);
 | 
						|
 | 
						|
      var allElements = copy.querySelectorAll('*');
 | 
						|
      [].forEach.call(allElements, function (item) {
 | 
						|
        var attr = item.getAttribute('ignore-print');
 | 
						|
        attr = attr == null ? item.getAttribute('ignoreprint') : attr;
 | 
						|
        if (attr != null && attr.toString() === 'true') {
 | 
						|
          item.outerHTML = '';
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
 | 
						|
      var copiedInputs = copy.querySelectorAll('input,select,textarea');
 | 
						|
      [].forEach.call(copiedInputs, function (item, i) {
 | 
						|
        var typeInput = item.getAttribute('type');
 | 
						|
        var copiedInput = copiedInputs[i];
 | 
						|
 | 
						|
        if (typeInput == null) {
 | 
						|
          typeInput = item.tagName === 'SELECT' ? 'select' : item.tagName === 'TEXTAREA' ? 'textarea' : '';
 | 
						|
        }
 | 
						|
        if (typeInput === 'radio' || typeInput === 'checkbox') {
 | 
						|
 | 
						|
          item.checked && copiedInput.setAttribute('checked', item.checked);
 | 
						|
        } else if (typeInput === 'select') {
 | 
						|
          [].forEach.call(copiedInput.querySelectorAll('option'), function (op, b) {
 | 
						|
            if (op.selected) {
 | 
						|
              op.setAttribute('selected', true);
 | 
						|
            }
 | 
						|
          });
 | 
						|
        } else if (typeInput === 'textarea') {
 | 
						|
          copiedInput.innerHTML = item.value;
 | 
						|
        } else {
 | 
						|
          copiedInput.value = item.value;
 | 
						|
          copiedInput.setAttribute('value', item.value);
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
      var sourceCanvas = ele.querySelectorAll('canvas');
 | 
						|
      var copyCanvas = copy.querySelectorAll('canvas');
 | 
						|
 | 
						|
      [].forEach.call(copyCanvas, function (item, i) {
 | 
						|
        if (that.isECharts(item)) {
 | 
						|
          if (item.parentElement.style.width) {
 | 
						|
            item.parentElement.style.width = '100%';
 | 
						|
            item.parentElement.style.height = 'auto';
 | 
						|
          }
 | 
						|
          if (item.parentElement.parentElement.style.width) {
 | 
						|
            item.parentElement.parentElement.style.width = '100%';
 | 
						|
            item.parentElement.parentElement.style.height = 'auto';
 | 
						|
          }
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        var url = sourceCanvas[i].toDataURL();
 | 
						|
 | 
						|
        item.outerHTML = '<img src="' + url + '" style="width:100%;"/>';
 | 
						|
      });
 | 
						|
 | 
						|
 | 
						|
      return copy;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'isECharts',
 | 
						|
    value: function isECharts(item) {
 | 
						|
      var attrName = '_echarts_instance_';
 | 
						|
      var parent = item.parentElement;
 | 
						|
      if (parent.getAttribute(attrName) != null) {
 | 
						|
        return true;
 | 
						|
      }
 | 
						|
      if (parent.parentElement) {
 | 
						|
        return parent.parentElement.getAttribute(attrName) != null;
 | 
						|
      }
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'getPrintWindow',
 | 
						|
    value: function getPrintWindow() {
 | 
						|
      var f = this.Iframe();
 | 
						|
      return {
 | 
						|
        win: f.contentWindow || f,
 | 
						|
        doc: f.doc
 | 
						|
      };
 | 
						|
    }
 | 
						|
  }, {
 | 
						|
    key: 'Iframe',
 | 
						|
    value: function Iframe() {
 | 
						|
      var frameId = this.settings.id;
 | 
						|
      var iframe = void 0;
 | 
						|
      var that = this;
 | 
						|
      try {
 | 
						|
        iframe = document.createElement('iframe');
 | 
						|
        document.body.appendChild(iframe);
 | 
						|
        iframe.style.border = '0px';
 | 
						|
        iframe.style.position = 'absolute';
 | 
						|
        iframe.style.width = '0px';
 | 
						|
        iframe.style.height = '0px';
 | 
						|
        iframe.style.right = '0px';
 | 
						|
        iframe.style.top = '0px';
 | 
						|
        iframe.setAttribute('id', frameId);
 | 
						|
        iframe.setAttribute('src', new Date().getTime());
 | 
						|
        iframe.doc = null;
 | 
						|
        iframe.onload = function () {
 | 
						|
          var win = iframe.contentWindow || iframe;
 | 
						|
          that.print(win);
 | 
						|
        };
 | 
						|
        iframe.doc = iframe.contentDocument ? iframe.contentDocument : iframe.contentWindow ? iframe.contentWindow.document : iframe.document;
 | 
						|
      } catch (e) {
 | 
						|
        throw new Error(e + '. iframes may not be supported in this browser.');
 | 
						|
      }
 | 
						|
 | 
						|
      if (iframe.doc == null) {
 | 
						|
        throw new Error('Cannot find document.');
 | 
						|
      }
 | 
						|
 | 
						|
      return iframe;
 | 
						|
    }
 | 
						|
  }]);
 | 
						|
  return _class;
 | 
						|
}();
 | 
						|
 | 
						|
exports.default = _class;
 | 
						|
; |