/modules/shortcodes/js/recipes-printthis.js
https://github.com/danielbachhuber/jetpack · JavaScript · 170 lines · 95 code · 23 blank · 52 comment · 18 complexity · b357051cf00625f373e114f0e47999e2 MD5 · raw file
- /*
- * printThis v1.3
- * @desc Printing plug-in for jQuery
- * @author Jason Day
- *
- * Resources (based on) :
- * jPrintArea: http://plugins.jquery.com/project/jPrintArea
- * jqPrint: https://github.com/permanenttourist/jquery.jqprint
- * Ben Nadal: http://www.bennadel.com/blog/1591-Ask-Ben-Print-Part-Of-A-Web-Page-With-jQuery.htm
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * (c) Jason Day 2013
- *
- * Usage:
- *
- * $("#mySelector").printThis({
- * debug: false, * show the iframe for debugging
- * importCSS: true, * import page CSS
- * printContainer: true, * grab outer container as well as the contents of the selector
- * loadCSS: "path/to/my.css", * path to additional css file
- * pageTitle: "", * add title to print page
- * removeInline: false, * remove all inline styles from print elements
- * printDelay: 333, * variable print delay S. Vance
- * header: null * prefix to html
- * });
- *
- * Notes:
- * - the loadCSS will load additional css (with or without @media print) into the iframe, adjusting layout
- */
- /* jshint onevar: false, smarttabs: true, devel: true */
- ;(function ($) {
- var opt;
- $.fn.printThis = function (options) {
- opt = $.extend({}, $.fn.printThis.defaults, options);
- var $element = this instanceof jQuery ? this : $(this);
- var strFrameName = 'printThis-' + (new Date()).getTime();
- if(window.location.hostname !== document.domain && navigator.userAgent.match(/msie/i)){
- // Ugly IE hacks due to IE not inheriting document.domain from parent
- // checks if document.domain is set by comparing the host name against document.domain
- var iframeContents = '<head><script>document.domain=\\\'' + document.domain + '\\\';</script></head><body></body>';
- var iframeSrc = 'data:text/html;charset=utf-8,' + encodeURI(iframeContents);
- var printI= document.createElement('iframe');
- printI.name = 'printIframe';
- printI.id = strFrameName;
- printI.className = 'MSIE';
- document.body.appendChild(printI);
- printI.src = iframeSrc;
- } else {
- // other browsers inherit document.domain, and IE works if document.domain is not explicitly set
- var $frame = $('<iframe id="' + strFrameName +'" name="printIframe" />');
- $frame.appendTo('body');
- }
- var $iframe = $('#' + strFrameName);
- // show frame if in debug mode
- if (!opt.debug) {
- $iframe.css({
- position: 'absolute',
- width: '0px',
- height: '0px',
- left: '-600px',
- top: '-600px'
- });
- }
- // $iframe.ready() and $iframe.load were inconsistent between browsers
- setTimeout ( function () {
- var $doc = $iframe.contents();
- // import page stylesheets
- if (opt.importCSS) {
- $('link[rel=stylesheet]').each(function () {
- var href = $(this).attr('href');
- if (href) {
- var media = $(this).attr('media') || 'all';
- $doc.find('head').append('<link type="text/css" rel="stylesheet" href="' + href + '" media="' + media + '">');
- }
- });
- }
- //add title of the page
- if (opt.pageTitle) {
- $doc.find('head').append('<title>' + opt.pageTitle + '</title>');
- }
- // import additional stylesheet
- if (opt.loadCSS) {
- $doc.find('head').append('<link type="text/css" rel="stylesheet" href="' + opt.loadCSS + '">');
- }
- // print header
- if (opt.header) {
- $doc.find('body').append(opt.header);
- }
- // grab $.selector as container
- if (opt.printContainer) {
- $doc.find('body').append($element.outer());
- }
- // otherwise just print interior elements of container
- else {
- $element.each(function () {
- $doc.find('body').append($(this).html());
- });
- }
- // remove inline styles
- if (opt.removeInline) {
- // $.removeAttr available jQuery 1.7+
- if ($.isFunction($.removeAttr)) {
- $doc.find('body *').removeAttr('style');
- } else {
- $doc.find('body *').attr('style', '');
- }
- }
- setTimeout(function () {
- if($iframe.hasClass('MSIE')){
- // check if the iframe was created with the ugly hack
- // and perform another ugly hack out of neccessity
- window.frames.printIframe.focus();
- $doc.find('head').append('<script> window.print(); </script>');
- } else {
- // proper method
- $iframe[0].contentWindow.focus();
- $iframe[0].contentWindow.print();
- }
- $element.trigger( 'done');
- //remove iframe after print
- if (!opt.debug) {
- setTimeout(function () {
- $iframe.remove();
- }, 1000);
- }
- }, opt.printDelay);
- }, 333 );
- };
- // defaults
- $.fn.printThis.defaults = {
- debug: false, // show the iframe for debugging
- importCSS: false, // import parent page css
- printContainer: true, // print outer container/$.selector
- loadCSS: '', // load an additional css file
- pageTitle: '', // add title to print page
- removeInline: false, // remove all inline styles
- printDelay: 333, // variable print delay S. Vance
- header: null // prefix to html
- };
- // $.selector container
- jQuery.fn.outer = function () {
- return $($('<div></div>').html(this.clone())).html();
- };
- })(jQuery);