print-preView.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. ;
  2. (function($) {
  3. // Private functions
  4. var modal, size, printFrame, printModal, printControls;
  5. var printOption = {};
  6. var printPreview = {
  7. defaults: { //printPreview默认配置
  8. printBody: 'body',
  9. modalWidth: 794,
  10. cssUrl: null,
  11. printCssUrl: null,
  12. screenCssUrl: null,
  13. watermark: null //水印,1.0版本暂不支持
  14. },
  15. loadPrintPreview: function(options) {
  16. printOption = $.extend({}, printPreview.defaults, options);
  17. printModal = $('<div id="print-modal"></div>');
  18. printControls = $('<div id="print-modal-controls">' +
  19. '<a href="#" class="print btn" title="打印页面">打印页面</a>' +
  20. '<a href="#" class="close btn" title="关闭预览">关闭预览</a>').hide();
  21. printFrame =
  22. $('<iframe id="print-modal-content" scrolling="no" border="0" frameborder="0" name="print-frame" />');
  23. // Raise print preview window from the dead, zooooooombies
  24. printModal.hide().append(printControls).append(printFrame).appendTo('body');
  25. // The frame lives
  26. var printFrameRef;
  27. for (var i = 0; i < window.frames.length; i++) {
  28. if (window.frames[i].name === "print-frame") {
  29. printFrameRef = window.frames[i].document;
  30. break;
  31. }
  32. }
  33. printFrameRef.open();
  34. printFrameRef.write(
  35. '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">' +
  36. '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">' +
  37. '<head><title>' +
  38. document.title +
  39. '</title></head>' +
  40. '<body></body>' +
  41. '</html>');
  42. printFrameRef.close();
  43. // Grab contents and apply stylesheet
  44. var $iframeHead = $('head link[media*=print], head link[media=all]').clone();
  45. //$iframeHead = $('head link').clone();
  46. var $iframeBody = $(printOption.printBody + ' > *:not(#print-modal):not(script)').clone();
  47. $iframeHead.each(function() {
  48. $(this).attr('media', 'all');
  49. });
  50. //if (!$.browser.msie && !($.browser.version < 7)) {
  51. // $('head', printFrameRef).append($iframeHead);
  52. // $('body', printFrameRef).append($iframeBody);
  53. //} else {
  54. // $('body > *:not(#print-modal):not(script)').clone().each(function() {
  55. // $('body', printFrameRef).append(this.outerHTML);
  56. // });
  57. // $('head link[media*=print], head link[media=all]').each(function() {
  58. // $('head', printFrameRef).append($(this).clone().attr('media', 'all')[0].outerHTML);
  59. // });
  60. //}
  61. $('head', printFrameRef).append($iframeHead);
  62. // Introduce print styles
  63. $('head', printFrameRef)
  64. .append(
  65. '<style type="text/css">* {color: ##000# !important;margin: 0;padding: 0;}@media print{/* -- Print Preview --*/#print-modal-mask,#print-modal {display: none !important;}}</style><style media="print">@page{size:A4;margin: 0mm;margin-left: 15mm;margin-right: 15mm;}body{margin-top:25mm;}</style>');
  66. var arr;
  67. if (printOption.cssUrl !== null) {
  68. arr = printOption.cssUrl.split(",");
  69. for (var j = 0; j < arr.length; j++) {
  70. if (arr[j] !== "") {
  71. $('head', printFrameRef)
  72. .append('<link type="text/css" rel="stylesheet" href="' + arr[j] + '"/>');
  73. }
  74. }
  75. }
  76. if (printOption.printCssUrl !== null) {
  77. arr = printOption.printCssUrl.split(",");
  78. for (var h = 0; h < arr.length; h++) {
  79. if (arr[h] !== "") {
  80. $('head', printFrameRef).append('<link type="text/css" rel="stylesheet" href="' +
  81. arr[h] +
  82. '" media="print" />');
  83. }
  84. }
  85. }
  86. if (printOption.screenCssUrl !== null) {
  87. arr = printOption.screenCssUrl.split(",");
  88. for (var k = 0; k < arr.length; k++) {
  89. if (arr[k] !== "") {
  90. $('head', printFrameRef).append('<link type="text/css" rel="stylesheet" href="' +
  91. arr[k] +
  92. '" media="screen" />');
  93. }
  94. }
  95. }
  96. $('body', printFrameRef).append($iframeBody);
  97. // Disable scrolling
  98. //$('#print-modal-content').css({ overflowY: 'hidden', height: "100%" });
  99. // Disable all links
  100. $('a', printFrameRef).bind('click.printPreview', function(e) { e.preventDefault(); });
  101. // Load mask
  102. printPreview.loadModal();
  103. // Position modal
  104. var startingPosition = $(window).height() + $(window).scrollTop();
  105. var width = printOption.modalWidth+10;
  106. var left = $(window).width() - width - 140;
  107. left = left < 0 ? 0 : left / 2;
  108. var css = {
  109. top: startingPosition,
  110. height: 'auto',
  111. overflowY: 'auto',
  112. zIndex: 10000,
  113. display: 'block',
  114. width: width + 'px',
  115. left: left + 'px'
  116. };
  117. printModal.css(css).animate({ top: $(window).scrollTop() },
  118. 400,
  119. 'linear',
  120. function() {
  121. printControls.fadeIn('slow').focus();
  122. });
  123. // Bind closure
  124. $('a', printControls).bind('click',
  125. function(e) {
  126. e.preventDefault();
  127. if ($(this).hasClass('print')) {
  128. printFrame[0].contentWindow.print();
  129. } else {
  130. printPreview.distroyPrintPreview();
  131. }
  132. });
  133. },
  134. distroyPrintPreview: function() {
  135. printControls.fadeOut(100);
  136. printModal.animate({ top: $(window).scrollTop() - $(window).height(), opacity: 1 },
  137. 400,
  138. 'linear',
  139. function() {
  140. printModal.remove();
  141. $('body').css({ overflowY: 'auto', height: 'auto' });
  142. });
  143. modal.fadeOut('slow',
  144. function() {
  145. modal.remove();
  146. });
  147. $(document).unbind("keydown.printPreview.mask");
  148. modal.unbind("click.printPreview.mask");
  149. $(window).unbind("resize.printPreview.mask");
  150. },
  151. /* -- Modal Functions --*/
  152. loadModal: function() {
  153. size = printPreview.sizeUpModal();
  154. modal = $('<div id="print-modal-mask" class="modal-backdrop" />').appendTo($('body'));
  155. //modal.css({
  156. // position: 'absolute',
  157. // top: 0,
  158. // left: 0,
  159. // width: size[0],
  160. // height: size[1],
  161. // display: 'none',
  162. // opacity: 0,
  163. // zIndex: 9999,
  164. // backgroundColor: '#000'
  165. //});
  166. modal.css({ display: 'block' }).fadeTo('400', 0.75,
  167. function() {
  168. printPreview.setIframeHeight(document.getElementById('print-modal-content'));
  169. });
  170. $(window).bind("resize.printPreview.mask",
  171. function() {
  172. printPreview.updateModalSize();
  173. });
  174. modal.bind("click.printPreview.mask",
  175. function() {
  176. printPreview.distroyPrintPreview();
  177. });
  178. $(document).bind("keydown.printPreview.mask",
  179. function(e) {
  180. if (e.keyCode === 27) {
  181. printPreview.distroyPrintPreview();
  182. }
  183. });
  184. },
  185. sizeUpModal: function() {
  186. //if ($.browser.msie) {
  187. // // if there are no scrollbars then use window.height
  188. // var d = $(document).height(), w = $(window).height();
  189. // return [
  190. // window.innerWidth || // ie7+
  191. // document.documentElement.clientWidth || // ie6
  192. // document.body.clientWidth, // ie6 quirks mode
  193. // d - w < 20 ? w : d
  194. // ];
  195. //} else {
  196. // return [$(document).width(), $(document).height()];
  197. //}
  198. return [$(document).width(), $(document).height()];
  199. },
  200. updateModalSize: function () {
  201. var size = printPreview.sizeUpModal();
  202. modal.css({ width: size[0], height: size[1] });
  203. },
  204. setIframeHeight(iframe) {
  205. if (iframe) {
  206. var iframeWin = iframe.contentWindow || iframe.contentDocument.parentWindow;
  207. if (iframeWin.document.body) {
  208. iframe.height = iframeWin.document.documentElement.scrollHeight ||
  209. iframeWin.document.body.scrollHeight;
  210. }
  211. }
  212. }
  213. };
  214. // Initialization
  215. $.fn.printPreview = function (options) {
  216. this.each(function () {
  217. $(this).bind('click', function (e) {
  218. e.preventDefault();
  219. if (!$('#print-modal').length) {
  220. printPreview.loadPrintPreview(options);
  221. }
  222. });
  223. });
  224. return this;
  225. };
  226. })(jQuery);