• js灵活打印web页面区域内容的通用方法


    
    

           我们做网站,经常需要打印页面指定区域的内容,而网上关于这块的说法很多,各种各样的打印控件也不少。但许多打印方案都不怎么好,至少我不喜欢,要么封装复杂,要么难以维护。正好现在的项目也需要用到页面打印,于是在网上找了一个最简洁的打印插件,在它的基础上自己写了一个通用的打印方法,可以直观的修改样式。现在把代码贴出来,留置后用,也可以给大家一些参考。

           通过这次试水,才知道,原来html中,media元素大有用途,这里正好小用一把,去掉超链接的url显示


    1.网上找的js打印插件

    /*
     *  Version 2.4.0 Copyright (C) 2013
     *  Tested in IE 11, FF 28.0 and Chrome 33.0.1750.154
     *  No official support for other browsers, but will TRY to accommodate challenges in other browsers.
     *  Example:
     *      Print Button: <div id="print_button">Print</div>
     *      Print Area  : <div class="PrintArea" id="MyId" class="MyClass"> ... html ... </div>
     *      Javascript  : <script>
     *                       $("div#print_button").click(function(){
     *                           $("div.PrintArea").printArea( [OPTIONS] );
     *                       });
     *                     </script>
     *  options are passed as json (example: {mode: "popup", popClose: false})
     *
     *  {OPTIONS}   | [type]     | (default), values      | Explanation
     *  ---------   | ---------  | ---------------------- | -----------
     *  @mode       | [string]   | (iframe),popup         | printable window is either iframe or browser popup
     *  @popHt      | [number]   | (500)                  | popup window height
     *  @popWd      | [number]   | (400)                  | popup window width
     *  @popX       | [number]   | (500)                  | popup window screen X position
     *  @popY       | [number]   | (500)                  | popup window screen Y position
     *  @popTitle   | [string]   | ('')                   | popup window title element
     *  @popClose   | [boolean]  | (false),true           | popup window close after printing
     *  @extraCss   | [string]   | ('')                   | comma separated list of extra css to include
     *  @retainAttr | [string[]] | ["id","class","style"] | string array of attributes to retain for the containment area. (ie: id, style, class)
     *  @standard   | [string]   | strict, loose, (html5) | Only for popup. For html 4.01, strict or loose document standard, or html 5 standard
     *  @extraHead  | [string]   | ('')                   | comma separated list of extra elements to be appended to the head tag
     */
    (function($) {
        var counter = 0;
        var modes = { iframe : "iframe", popup : "popup" };
        var standards = { strict : "strict", loose : "loose", html5 : "html5" };
        var defaults = {
            mode      : modes.iframe,
            standard  : standards.html5,
            popHt     : 500,
            popWd     : 400,
            popX      : 200,
            popY      : 200,
            popTitle  : '',
            popClose  : false,
            extraCss  : '',
            extraHead : '',
            retainAttr: ["id", "class", "style"]
        };
        var settings = {};//global settings
        $.fn.printArea = function( options )
        {
            $.extend( settings, defaults, options );
            counter++;
            var idPrefix = "printArea_";
            $( "[id^=" + idPrefix + "]" ).remove();
            settings.id = idPrefix + counter;
            var $printSource = $(this);
            var PrintAreaWindow = PrintArea.getPrintWindow();
            PrintArea.write( PrintAreaWindow.doc, $printSource );
            setTimeout( function () { PrintArea.print( PrintAreaWindow ); }, 1000 );
        };
    
        var PrintArea = {
            print : function( PAWindow ) {
                var paWindow = PAWindow.win;
                $(PAWindow.doc).ready(function(){
                    paWindow.focus();
                    paWindow.print();
                    if ( settings.mode == modes.popup && settings.popClose )
                        setTimeout(function() { paWindow.close(); }, 2000);
                });
            },
            write : function ( PADocument, $ele ) {
                PADocument.open();
                PADocument.write( PrintArea.docType() + "<html>" + PrintArea.getHead() + PrintArea.getBody( $ele ) + "</html>" );
                PADocument.close();
            },
            docType : function() {
                if ( settings.mode == modes.iframe ) return "";
    
                if ( settings.standard == standards.html5 ) return "<!DOCTYPE html>";
    
                var transitional = settings.standard == standards.loose ? " Transitional" : "";
                var dtd = settings.standard == standards.loose ? "loose" : "strict";
                return '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01' + transitional + '//EN" "http://www.w3.org/TR/html4/' + dtd +  '.dtd">';
            },
            getHead : function() {
                var extraHead = "";
                var links = "";
                var styles = '';
    
                if ( settings.extraHead ) settings.extraHead.replace( /([^,]+)/g, function(m){ extraHead += m });
                $(document).find("link")
                    .filter(function () { // Requirement: <link> element MUST have rel="stylesheet" to be considered in print document
                        var relAttr = $(this).attr("rel");
                        return ($.type(relAttr) === 'undefined') == false && relAttr.toLowerCase() == 'stylesheet';
                    })
                    .filter(function () { // Include if media is undefined, empty, print or all                    
                        var mediaAttr = $(this).attr("media");
                        return $.type(mediaAttr) === 'undefined' || mediaAttr == "" || mediaAttr.toLowerCase() == 'print' || mediaAttr.toLowerCase() == 'all'
                    })
                    .each(function () {
                        links += '<link type="text/css" rel="stylesheet" media="print" href="' + $(this).attr("href") + '" />';
                        styles += '@import url("' + $(this).attr("href") + '") print;';
                    });
                if ( settings.extraCss ) settings.extraCss.replace( /([^,s]+)/g, function(m){ links += '<link type="text/css" rel="stylesheet" href="' + m + '">' });
                return '<head><title>' + settings.popTitle + '</title>' + extraHead + links + '<style type="text/css"> @media print{a:link:after {content: ""}}</style></head>';
                //return "<head><title>" + settings.popTitle + "</title>" + extraHead + links + "</head>";
            },
            getBody : function ( elements ) {
                var htm = "";
                var attrs = settings.retainAttr;
                elements.each(function() {
                    var ele = PrintArea.getFormData( $(this) );
                    var attributes = ""
                    for ( var x = 0; x < attrs.length; x++ )
                    {
                        var eleAttr = $(ele).attr( attrs[x] );
                        if ( eleAttr ) attributes += (attributes.length > 0 ? " ":"") + attrs[x] + "='" + eleAttr + "'";
                    }
                    htm += '<div ' + attributes + '>' + $(ele).html() + '</div>';
                });
                return "<body>" + htm + "</body>";
            },
            getFormData : function ( ele ) {
                var copy = ele.clone();
                var copiedInputs = $("input,select,textarea", copy);
                $("input,select,textarea", ele).each(function( i ){
                    var typeInput = $(this).attr("type");
                    if ($.type(typeInput) === 'undefined') typeInput = $(this).is("select") ? "select" : $(this).is("textarea") ? "textarea" : "";
                    var copiedInput = copiedInputs.eq( i );
                    if ( typeInput == "radio" || typeInput == "checkbox" ) copiedInput.attr( "checked", $(this).is(":checked") );
                    else if ( typeInput == "text" ) copiedInput.attr( "value", $(this).val() );
                    else if ( typeInput == "select" )
                        $(this).find( "option" ).each( function( i ) {
                            if ( $(this).is(":selected") ) $("option", copiedInput).eq( i ).attr( "selected", true );
                        });
                    else if ( typeInput == "textarea" ) copiedInput.text( $(this).val() );
                });
                return copy;
            },
            getPrintWindow : function () {
                switch ( settings.mode )
                {
                    case modes.iframe :
                        var f = new PrintArea.Iframe();
                        return { win : f.contentWindow || f, doc : f.doc };
                    case modes.popup :
                        var p = new PrintArea.Popup();
                        return { win : p, doc : p.doc };
                }
            },
            Iframe : function () {
                var frameId = settings.id;
                var iframeStyle = 'border:0;position:absolute;0px;height:0px;right:0px;top:0px;';
                var iframe;
                try
                {
                    iframe = document.createElement('iframe');
                    document.body.appendChild(iframe);
                    $(iframe).attr({ style: iframeStyle, id: frameId, src: "#" + new Date().getTime() });
                    iframe.doc = null;
                    iframe.doc = iframe.contentDocument ? iframe.contentDocument : ( iframe.contentWindow ? iframe.contentWindow.document : iframe.document);
                }
                catch( e ) { throw e + ". iframes may not be supported in this browser."; }
                if ( iframe.doc == null ) throw "Cannot find document.";
                return iframe;
            },
            Popup : function () {
                var windowAttr = "location=yes,statusbar=no,directories=no,menubar=no,titlebar=no,toolbar=no,dependent=no";
                windowAttr += ",width=" + settings.popWd + ",height=" + settings.popHt;
                windowAttr += ",resizable=yes,screenX=" + settings.popX + ",screenY=" + settings.popY + ",personalbar=no,scrollbars=yes";
                var newWin = window.open( "", "_blank",  windowAttr );
                newWin.doc = newWin.document;
                return newWin;
            }
        };
    })(jQuery);


    2. 我的调用方法

    function printArticle(areaId) {
        var styles = ".PrintStyleBtn{border:none;100%;;height:40px;line-height:40px;background-color:#eee;} .PrintStyleBtn input{ border-radius:5px;background-color:#999;color:#fff;float:right;margin:8px;height:24px;line-height:16px;padding:0px 5px;}.selected{background-color:#ccc;} .PrintStyleBtn span{margin:3px 0px;display:inline-block;border-radius:3px;height:24px;line-height:20px;padding:2px 5px;}.PrintStyleBtn span:hover{background-color:#999;} .print_content{border:1px solid #ddd;800px;height:auto;padding:20px;margin:50px auto;}";
        insertStyleSheet(styles, "PrintStyle");
        var printFrameHtml =
        '<div id="PrintFrame" style="border:none;100%;height:100%;position:absolute;top:0;left:0;background-color:#fff;">'
        + '<div class="PrintStyleBtn" style="">'
        + '    Font size:'
        + '    <span name="size">Small</span> |'
        + '    <span name="size" class="selected">Medium</span> |'
        + '    <span name="size">Large</span>    '
        + '    Line spacing:'
        + '    <span name="space">Compact</span> |'
        + '    <span name="space" class="selected">Normal</span>    '
        + '    Image:'
        + '    <span name="image" class="selected">Yes</span> |'
        + '    <span name="image">No</span>    '
        + '    <input id="btnCancel" type="button" value="Cancel"/>'
        + '    <input id="btnPrint"  type="button" value="Print" />'
        + '</div>'
        + '<div class="print_content">' + $('#' + areaId).html() + '</div></div>';
        $("body").append(printFrameHtml);
        $('.print_content').find(".viva-content-edit").remove();
        $('.PrintStyleBtn').find('span').on('click', function () {
            var obj = $(this),
                name = obj.attr('name'),
                value = obj.html();
            $('.PrintStyleBtn').find('span[name="' + name + '"]').removeClass('selected');
            obj.addClass('selected');
            if (name == 'size')
                $('.print_content').css('font-size', value == 'Small' ? 'small' : value == 'Medium' ? 'medium' : 'large' );
            if (name == 'space')
                $('.print_content').css('line-height', value == 'Compact' ? '1' : 'normal');
            if (name == 'image') {
                if (value == "Yes") {
                    $('.print_content').find("img").show();
                } else {
                    $('.print_content').find("img").hide();
                }
            }
        });
        $('.PrintStyleBtn').find('input').on('click', function () {
            if (this.value == 'Print') {
                $('.print_content').printArea();
            } 
            $('#PrintFrame').remove();
        });
    }

    3.附带页面sample

    <input type="button" onclick="printArticle('articleRight');" value='Print' />
    <div id="articleRight">
        <div class="article-title">Test Article Tilte</div>    
        <div class="article-content">Test Article Content</div>
    </div>



  • 相关阅读:
    字符串中的空格
    魔方阵的构造
    程序填空题(一)
    程序填空题(二)
    QTP 自动化测试--点滴 等待
    QTP 自动化测试--点滴 获取datatable数值/dafault文件位置
    fiddler 笔记-重定向
    fiddler 笔记-设置断点
    QTP 自动货测试桌面程序-笔记-运行结果中添加截图
    Fiddler 学习笔记---命令、断点
  • 原文地址:https://www.cnblogs.com/foren/p/6009083.html
Copyright © 2020-2023  润新知