Blame | Letzte Änderung | Log anzeigen | RSS feed
/* @license* jQuery.print, version 1.3.0* (c) Sathvik Ponangi, Doers' Guild* Licence: CC-By (http://creativecommons.org/licenses/by/3.0/)*--------------------------------------------------------------------------*/(function ($) {"use strict";// A nice closure for our definitionsfunction getjQueryObject(string) {// Make string a vaild jQuery thingvar jqObj = $("");try {jqObj = $(string).clone();} catch (e) {jqObj = $("<span />").html(string);}return jqObj;}function printFrame(frameWindow) {// Print the selected window/iframevar def = $.Deferred();try {setTimeout(function () {// Fix for IE : Allow it to render the iframeframeWindow.focus();try {// Fix for IE11 - printng the whole page instead of the iframe contentif (!frameWindow.document.execCommand('print', false, null)) {// document.execCommand returns false if it failed -http://stackoverflow.com/a/21336448/937891frameWindow.print();}} catch (e) {frameWindow.print();}frameWindow.close();deferred.resolve();}, 250);} catch (err) {def.reject(err);}return def;}function printContentInNewWindow(content) {// Open a new window and print selected contentvar w = window.open();w.document.write(content);w.document.close();return printFrame(w);}function isNode(o) {/* http://stackoverflow.com/a/384380/937891 */return !!(typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string");}$.print = $.fn.print = function () {// Print a given set of elementsvar options, $this, self = this;// console.log("Printing", this, arguments);if (self instanceof $) {// Get the node if it is a jQuery objectself = self.get(0);}if (isNode(self)) {// If `this` is a HTML element, i.e. for// $(selector).print()$this = $(self);if (arguments.length > 0) {options = arguments[0];}} else {if (arguments.length > 0) {// $.print(selector,options)$this = $(arguments[0]);if (isNode($this[0])) {if (arguments.length > 1) {options = arguments[1];}} else {// $.print(options)options = arguments[0];$this = $("html");}} else {// $.print()$this = $("html");}}// Default optionsvar defaults = {globalStyles: true,mediaPrint: false,stylesheet: null,noPrintSelector: ".no-print",iframe: true,append: null,prepend: null,manuallyCopyFormValues: true,deferred: $.Deferred()};// Merge with user-optionsoptions = $.extend({}, defaults, (options || {}));var $styles = $("");if (options.globalStyles) {// Apply the stlyes from the current sheet to the printed page$styles = $("style, link, meta, title");} else if (options.mediaPrint) {// Apply the media-print stylesheet$styles = $("link[media=print]");}if (options.stylesheet) {// Add a custom stylesheet if given$styles = $.merge($styles, $('<link rel="stylesheet" href="' + options.stylesheet + '">'));}// Create a copy of the element to printvar copy = $this.clone();// Wrap it in a span to get the HTML markup stringcopy = $("<span/>").append(copy);// Remove unwanted elementscopy.find(options.noPrintSelector).remove();// Add in the stylescopy.append($styles.clone());// Appedned contentcopy.append(getjQueryObject(options.append));// Prepended contentcopy.prepend(getjQueryObject(options.prepend));if (options.manuallyCopyFormValues) {// Manually copy form values into the HTML for printing user-modified input fields// http://stackoverflow.com/a/26707753copy.find("input, select, textarea").each(function () {var $field = $(this);if ($field.is("[type='radio']") || $field.is("[type='checkbox']")) {if ($field.prop("checked")) {$field.attr("checked", "checked");}} else if ($field.is("select")) {$field.find(":selected").attr("selected", "selected");} else {$field.attr("value", $field.val());}});}// Get the HTML markup stringvar content = copy.html();// Notify with generated markup & cloned elements - useful for logging, etctry {options.deferred.notify('generated_markup', content, copy);} catch (err) {console.warn('Error notifying deferred', err);}// Destroy the copycopy.remove();if (options.iframe) {// Use an iframe for printingtry {var $iframe = $(options.iframe + "");var iframeCount = $iframe.length;if (iframeCount === 0) {// Create a new iFrame if none is given$iframe = $('<iframe height="0" width="0" border="0" wmode="Opaque"/>').prependTo('body').css({"position": "absolute","top": -999,"left": -999});}var w, wdoc;w = $iframe.get(0);w = w.contentWindow || w.contentDocument || w;wdoc = w.document || w.contentDocument || w;wdoc.open();wdoc.write(content);wdoc.close();printFrame(w).done(function () {// SuccesssetTimeout(function () {// Wait for IEif (iframeCount === 0) {// Destroy the iframe if created here$iframe.remove();}}, 100);}).fail(function () {// Use the pop-up method if iframe fails for some reasonconsole.error("Failed to print from iframe", e.stack, e.message);printContentInNewWindow(content);}).always(function () {try {options.deferred.resolve();} catch (err) {console.warn('Error notifying deferred', err);}});} catch (e) {// Use the pop-up method if iframe fails for some reasonconsole.error("Failed to print from iframe", e.stack, e.message);printContentInNewWindow(content).always(function () {try {options.deferred.resolve();} catch (err) {console.warn('Error notifying deferred', err);}});}} else {// Use a new window for printingprintContentInNewWindow(content).always(function () {try {options.deferred.resolve();} catch (err) {console.warn('Error notifying deferred', err);}});}return this;};})(jQuery);