• 多页面打印--web print


    背景:项目中要求做在一个页面中通过选择网址来打印多个页面的内容的功能

    原理:通过iframe把各网址的页面内容加载进来,通过iframe.contentWindow拿到iframe的window对象,把所有网址页面内容整合至一个里面,再通过样式page-break-after实现分页打印。iframe通过监听load事件确定页面加载结束,在load中再加载下一个页面,来确保加载的顺序进行。

    输入:字符串或者数组

    输出:弹出打印框,接着打印操作。

    实现:使用构造函数保存实例自己的属性,通过原型保存方法。

    属性:urls:传入的网址数组,len:页面加载剩余个数,printHTML:保存所有打印内容的字符串,mainIframe:最终用于打印的iframe对象

    方法:createIframe:生成iframe对象,addIframe:把iframe加入当前页面,deleteIframe:删除iframe,getHTML:得到想要的html字符串内容,print:mainIframe打印操作,scan:递归加载iframe页面。

    兼容:ie7-9,ff,chrome,opera,safari

    代码:

    ;
    (function (win, doc) {
        var REG = /<!--s*prints+starts*-->(.|
    )*<!--s*prints+ends*-->/ig;
    
        //add into window
        win.iframeprint = function (urls) {
            new IframePrint(urls);
        }
        //function
        function IframePrint(urls) {
            this.urls = typeof urls === "string" ? [].push(urls) : (urls instanceof Array ? urls : []);
            this.len = this.urls.length;
            if (this.len <= 0) {
                //this = null;  //赋值左侧无效
                alert("传入参数必须为string或者array。");
                return;
            }
            this.printHTML = '';
            this.mainIframe = this.createIframe(this.urls[0]);
    
            this.init();
        }
        //prototype
        IframePrint.prototype = {
            constructor : IframePrint,
            createIframe : function (url) {
                var iframe = doc.createElement("iframe"),
                style = iframe.style; ;
                style.zIndex = -100;
                style.width = 0;
                style.height = 0;
                style.border = "none";
                style.background = "none";
                iframe.src = url;
                return iframe;
            },
            addIframe : function (iframe) {
                doc.getElementsByTagName("body")[0].appendChild(iframe);
            },
            deleteIframe : function (iframe) {
                iframe.parentNode.removeChild(iframe);
            },
            getHTML : function (iframe) {
                var html = iframe.contentWindow.document.getElementsByTagName("body")[0].innerHTML;
                return html.match(REG).join("");
            },
            print : function () {
                var ifmWin = this.mainIframe.contentWindow;
                ifmWin.document.getElementsByTagName("body")[0].innerHTML = this.printHTML;
    
                //log
                console.log(new Date());
                console.log(this.printHTML);
    
                ifmWin.focus();
                ifmWin.print();
            },
            scan : function () {
                var iframe = this.createIframe(this.urls[this.urls.length - this.len]),
                _this = this,
                _callee = arguments.callee;
                iframe.onload = function () {
                    var _html = _this.getHTML(this);
                    if (_this.len <= 1) {
                        _this.printHTML += _html;
                        _this.print();
                        _this.deleteIframe(_this.mainIframe);
                    } else {
                        _this.len--;
                        _this.printHTML += _html + '<p style="page-break-after:always; border:none; background:none;margin:0;padding:0;"></p>';
                        _callee.call(_this);
                        //log
                        console.log(">1");
                    }
                    this.onload = null;
                    _this.deleteIframe(this);
                };
                this.addIframe(iframe);
            },
            init : function () {
                this.addIframe(this.mainIframe);
                this.scan();
                //不使用此方法
                /* while (this.len > 0) {
                    this.scanBody();
                    this.len--;
                } */
            }
        };
    })(window, document);

    缺点:这里加载的页面不能ajax动态数据,那样打印不出来相应的数据。

    demo下载

  • 相关阅读:
    Java第九次作业
    Java第八次作业
    Java第七次作业
    Java第六次作业
    Java第五次作业
    Java第四次作业
    Java第三次作业
    Java第二次作业
    Java第一次作业
    高级工程师和初级工程师之间的一道坎
  • 原文地址:https://www.cnblogs.com/qd4world/p/3214666.html
Copyright © 2020-2023  润新知