diff --git a/js/jquery.printarea.js b/js/jquery.printarea.js index 9713ea3..4d6673c 100644 --- a/js/jquery.printarea.js +++ b/js/jquery.printarea.js @@ -40,10 +40,14 @@ popClose : false, extraCss : '', extraHead : '', + onPrintStart: function() {}, retainAttr : ["id","class","style"] }; var settings = {};//global settings + var triggerTimer = null; + var PrintAreaWindow = null; + $.fn.printArea = function( options ) { $.extend( settings, defaults, options ); @@ -56,14 +60,28 @@ var $printSource = $(this); - var PrintAreaWindow = PrintArea.getPrintWindow(); + PrintAreaWindow = PrintArea.getPrintWindow(); - PrintArea.write( PrintAreaWindow.doc, $printSource ); + // if `PrintArea.write` consume time for more then 1s, the print result will be a white page, + // so, use `window.postMessage` to let `window` knows `write` is over. + if (window.parent.postMessage) { + window.removeEventListener("message", PrintArea.onMessage ); + window.addEventListener("message", PrintArea.onMessage ); + } else { + triggerTimer = setTimeout( function () { PrintArea.print( PrintAreaWindow ); }, 1000 ); + } - setTimeout( function () { PrintArea.print( PrintAreaWindow ); }, 1000 ); + PrintArea.write( PrintAreaWindow.doc, $printSource ); }; var PrintArea = { + onMessage: function (e) { + if (!e || !e.data || !e.data.printOk || !PrintAreaWindow) return; + console.log('trigger print'); + triggerTimer && clearTimeout(triggerTimer); + PrintArea.print( PrintAreaWindow ); + settings.onPrintStart && settings.onPrintStart(); + }, print : function( PAWindow ) { var paWindow = PAWindow.win; @@ -128,7 +146,9 @@ htm += '
' + $(ele).html() + '
'; }); - return "" + htm + ""; + var script = ``; + + return '' + htm + script + ''; }, getFormData : function ( ele ) { var copy = ele.clone();