JAVASCRIPT   32

jQuery.print.js

Guest on 22nd July 2021 09:54:07 AM

  1. /* @license
  2.  * jQuery.print, version 1.3.3
  3.  *  (c) Sathvik Ponangi, Doers' Guild
  4.  * Licence: CC-By (http://creativecommons.org/licenses/by/3.0/)
  5.  *--------------------------------------------------------------------------*/
  6. (function ($) {
  7.     "use strict";
  8.     // A nice closure for our definitions
  9.     function getjQueryObject(string) {
  10.         // Make string a vaild jQuery thing
  11.         var jqObj = $("");
  12.         try {
  13.             jqObj = $(string)
  14.                 .clone();
  15.         } catch (e) {
  16.             jqObj = $("<span />")
  17.                 .html(string);
  18.         }
  19.         return jqObj;
  20.     }
  21.  
  22.     function printFrame(frameWindow, timeout) {
  23.         // Print the selected window/iframe
  24.         var def = $.Deferred();
  25.         try {
  26.             setTimeout(function () {
  27.                 // Fix for IE : Allow it to render the iframe
  28.                 frameWindow.focus();
  29.                 try {
  30.                     // Fix for IE11 - printng the whole page instead of the iframe content
  31.                     if (!frameWindow.document.execCommand('print', false, null)) {
  32.                         // document.execCommand returns false if it failed -http://stackoverflow.com/a/21336448/937891
  33.                         frameWindow.print();
  34.                     }
  35.                 } catch (e) {
  36.                     frameWindow.print();
  37.                 }
  38.                 frameWindow.close();
  39.                 def.resolve();
  40.             }, timeout);
  41.         } catch (err) {
  42.             def.reject(err);
  43.         }
  44.         return def;
  45.     }
  46.  
  47.     function printContentInNewWindow(content, timeout,autoprint) {
  48.         // Open a new window and print selected content
  49.         var w = window.open();
  50.         w.document.write(content);
  51.         w.document.close();
  52.        if (autoprint){
  53.                   return printFrame(w, timeout);
  54.        }
  55.  
  56.     }
  57.  
  58.     function isNode(o) {
  59.         /* http://stackoverflow.com/a/384380/937891 */
  60.         return !!(typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string");
  61.     }
  62.     $.print = $.fn.print = function () {
  63.         // Print a given set of elements
  64.         var options, $this, self = this;
  65.         // console.log("Printing", this, arguments);
  66.         if (self instanceof $) {
  67.             // Get the node if it is a jQuery object
  68.             self = self.get(0);
  69.         }
  70.         if (isNode(self)) {
  71.             // If `this` is a HTML element, i.e. for
  72.             // $(selector).print()
  73.             $this = $(self);
  74.             if (arguments.length > 0) {
  75.                 options = arguments[0];
  76.             }
  77.         } else {
  78.             if (arguments.length > 0) {
  79.                 // $.print(selector,options)
  80.                 $this = $(arguments[0]);
  81.                 if (isNode($this[0])) {
  82.                     if (arguments.length > 1) {
  83.                         options = arguments[1];
  84.                     }
  85.                 } else {
  86.                     // $.print(options)
  87.                     options = arguments[0];
  88.                     $this = $("html");
  89.                 }
  90.             } else {
  91.                 // $.print()
  92.                 $this = $("html");
  93.             }
  94.         }
  95.         // Default options
  96.         var defaults = {
  97.             globalStyles: true,
  98.             mediaPrint: false,
  99.             stylesheet: null,
  100.             noPrintSelector: ".no-print",
  101.             iframe: true,
  102.             append: null,
  103.             prepend: null,
  104.             manuallyCopyFormValues: true,
  105.             deferred: $.Deferred(),
  106.             timeout: 250,
  107.             autoprint: false
  108.         };
  109.         // Merge with user-options
  110.         options = $.extend({}, defaults, (options || {}));
  111.         var $styles = $("");
  112.         if (options.globalStyles) {
  113.             // Apply the stlyes from the current sheet to the printed page
  114.             $styles = $("style, link, meta, title");
  115.         } else if (options.mediaPrint) {
  116.             // Apply the media-print stylesheet
  117.             $styles = $("link[media=print]");
  118.         }
  119.         if (options.stylesheet) {
  120.             // Add a custom stylesheet if given
  121.             $styles = $.merge($styles, $('<link rel="stylesheet" href="' + options.stylesheet + '">'));
  122.         }
  123.         // Create a copy of the element to print
  124.         var copy = $this.clone();
  125.         // Wrap it in a span to get the HTML markup string
  126.         copy = $("<span/>")
  127.             .append(copy);
  128.         // Remove unwanted elements
  129.         copy.find(options.noPrintSelector)
  130.             .remove();
  131.         // Add in the styles
  132.         copy.append($styles.clone());
  133.         // Appedned content
  134.         copy.append(getjQueryObject(options.append));
  135.         // Prepended content
  136.         copy.prepend(getjQueryObject(options.prepend));
  137.         if (options.manuallyCopyFormValues) {
  138.             // Manually copy form values into the HTML for printing user-modified input fields
  139.             // http://stackoverflow.com/a/26707753
  140.             copy.find("input")
  141.                 .each(function () {
  142.                     var $field = $(this);
  143.                     if ($field.is("[type='radio']") || $field.is("[type='checkbox']")) {
  144.                         if ($field.prop("checked")) {
  145.                             $field.attr("checked", "checked");
  146.                         }
  147.                     } else {
  148.                         $field.attr("value", $field.val());
  149.                     }
  150.                 });
  151.             copy.find("select").each(function () {
  152.                 var $field = $(this);
  153.                 $field.find(":selected").attr("selected", "selected");
  154.             });
  155.             copy.find("textarea").each(function () {
  156.                 // Fix for https://github.com/DoersGuild/jQuery.print/issues/18#issuecomment-96451589
  157.                 var $field = $(this);
  158.                 $field.text($field.val());
  159.             });
  160.         }
  161.         // Get the HTML markup string
  162.         var content = copy.html();
  163.         // Notify with generated markup & cloned elements - useful for logging, etc
  164.         try {
  165.             options.deferred.notify('generated_markup', content, copy);
  166.         } catch (err) {
  167.             console.warn('Error notifying deferred', err);
  168.         }
  169.         // Destroy the copy
  170.         copy.remove();
  171.         if (options.iframe) {
  172.             // Use an iframe for printing
  173.             try {
  174.                 var $iframe = $(options.iframe + "");
  175.                 var iframeCount = $iframe.length;
  176.                 if (iframeCount === 0) {
  177.                     // Create a new iFrame if none is given
  178.                     $iframe = $('<iframe height="0" width="0" border="0" wmode="Opaque"/>')
  179.                         .prependTo('body')
  180.                         .css({
  181.                             "position": "absolute",
  182.                             "top": -999,
  183.                             "left": -999
  184.                         });
  185.                 }
  186.                 var w, wdoc;
  187.                 w = $iframe.get(0);
  188.                 w = w.contentWindow || w.contentDocument || w;
  189.                 wdoc = w.document || w.contentDocument || w;
  190.                 wdoc.open();
  191.                 wdoc.write(content);
  192.                 wdoc.close();
  193.                 printFrame(w, options.timeout)
  194.                     .done(function () {
  195.                         // Success
  196.                         setTimeout(function () {
  197.                             // Wait for IE
  198.                             if (iframeCount === 0) {
  199.                                 // Destroy the iframe if created here
  200.                                 $iframe.remove();
  201.                             }
  202.                         }, 100);
  203.                     })
  204.                     .fail(function (err) {
  205.                         // Use the pop-up method if iframe fails for some reason
  206.                         console.error("Failed to print from iframe", err);
  207.                         printContentInNewWindow(content, options.timeout, options.autoprint);
  208.                     })
  209.                     .always(function () {
  210.                         try {
  211.                             options.deferred.resolve();
  212.                         } catch (err) {
  213.                             console.warn('Error notifying deferred', err);
  214.                         }
  215.                     });
  216.             } catch (e) {
  217.                 // Use the pop-up method if iframe fails for some reason
  218.                 console.error("Failed to print from iframe", e.stack, e.message);
  219.                 printContentInNewWindow(content, options.timeout, options.autoprint)
  220.                     .always(function () {
  221.                         try {
  222.                             options.deferred.resolve();
  223.                         } catch (err) {
  224.                             console.warn('Error notifying deferred', err);
  225.                         }
  226.                     });
  227.             }
  228.         } else {
  229.             // Use a new window for printing
  230.             printContentInNewWindow(content, options.timeout, options.autoprint)
  231.                 .always(function () {
  232.                     try {
  233.                         options.deferred.resolve();
  234.                     } catch (err) {
  235.                         console.warn('Error notifying deferred', err);
  236.                     }
  237.                 });
  238.         }
  239.         return this;
  240.     };
  241. })(jQuery);

Raw Paste


Login or Register to edit or fork this paste. It's free.