多页面打印--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*print\s+start\s*--\>(.|\n)*\<\!--\s*print\s+end\s*--\>/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下载

 

 

转载于:https://www.cnblogs.com/qd4world/p/3214666.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值