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

原理:通过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下载

多页面打印--web print的更多相关文章

  1. 关于页面打印window.print()的样式问题

    当我们打印网页的时候.有时候会发现.打印出来的.跟网页上看到的样式的差别有点大.这其中可能有的问题是.样式问题. 当调用打印(window.print())方法时.打印机会在网页的样式中查找 @med ...

  2. css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”

    一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...

  3. js打印WEB页面内容代码大全

    第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="tex ...

  4. Web系统页面打印技术实现与分析

    1 Web页面打印概述应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于WEB的应用,客户端的规则很简单,容易学习,容易维护,容易发布.在WEB系统中,打印的确是个烦人的问题 ...

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

      我们做网站,经常需要打印页面指定区域的内容,而网上关于这块的说法很多,各种各样的打印控件也不少.但许多打印方案都不怎么好,至少我不喜欢,要么封装复杂,要么难以维护.正好现在的项目也需要用到 ...

  6. JSP 页面打印

    <HTML><HEAD><TITLE>javascript打印-打印页面设置-打印预览代码</TITLE> <META http-equiv=Co ...

  7. .net开发---自定义页面打印区域

    自定义页面打印区域 有3种办法: 办法一:将不需要打印的部位隐藏掉 Examp: <%-- (1)使用css样式,定义一个.noprint的class,将不打印的内容放入这个class内. -- ...

  8. javascript之页面打印

    WebBrowser组件是IE内置的浏览器控件,使用时,首先要在<body>标签的下面用<object>...</object>标记声明WebBrowser组件,代 ...

  9. android网页打印,安卓网页打印,h5页面打印,浏览器打印,js打印工具

    Android设备打印比较麻烦,一般设备厂商都提供原生app开发的SDK,我们web开发者为难了,不会原生开发啊 给大家提供一个思路,实现web加壳,利用打印浏览器实现 简单来说就是把我们的web页面 ...

随机推荐

  1. vimium

    安装在chrome上的一个插件,可以实现chrome无鼠标无键盘操作. 事实上vimium就是提供了一系列的快捷键列表,所以只要熟悉了这些快捷键就可以方便使用了. 要查看快捷键列表,打开chrome, ...

  2. [SSH服务]——一个SSH无密码登陆实验

    实验拓扑图 实验描述 机房内有两台服务器: (1)B服务器10.0.10.158,充当Web服务器,有普通用户user_00 (2)C服务器10.0.10.191,充当Mysql服务器,有普通用户us ...

  3. c 计算 语句 执行 时间

    当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:   #include “stdio.h” #include “stdlib.h” #include “tim ...

  4. 四则运算2+psp0级表格

    四则运算2 一.题目和要求 题目:写一个能自动生成小学四则运算题目的程序,要求一次输出不少于30道,只能是整数100以内的四则运算(四则运算1升级版) 要求: 1.题目避免重复 2.可定制(数量/打印 ...

  5. 老陈 ASP.NET封装

    第一个页面 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  6. poj 1470 Closest Common Ancestors LCA

    题目链接:http://poj.org/problem?id=1470 Write a program that takes as input a rooted tree and a list of ...

  7. 2014ACM/ICPC亚洲区西安站 复旦命题

    http://codeforces.com/gym/100548 A 签到 问一个序列是不是yes,yes的序列满足每个数都是3的倍数. #include<cstdio> int main ...

  8. destoon使用中的一些心得

    //**************************index首页相关参数**************************************// //全局变量 {if $seo_titl ...

  9. href=#与href=javascriptvoid(0)的区别

    #"包含了一个位置信息 默认的锚点是#top 也就是网页的上端 而javascript:void(0)  仅仅表示一个死链接 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首 而 ...

  10. 解决Flash和html在多标签浏览器中互访问题

    在Flash播放器运行时,将不同来源的资源划分到独立的沙箱(sandbox)内,不同沙箱之间不能 彼此操作数据(除非目标沙箱做过一些设置,授权其他沙箱可访问),这就是Flash的跨沙箱问题.当Flas ...