• 多页面打印--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下载

  • 相关阅读:
    表示数值的字符串(C++描述)
    单链表是否有环及环入口点
    医院信息运维系统-信息科专用运维系统
    c# List 按类的指定字段排序
    运维系统说明
    更新库下载
    mysql数据库备份
    网络编程基础
    面向对象和过程,一样的价格,不一样的口味
    模块的导入顺序细节
  • 原文地址:https://www.cnblogs.com/qd4world/p/3214666.html
Copyright © 2020-2023  润新知