多页面打印--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动态数据,那样打印不出来相应的数据。
多页面打印--web print的更多相关文章
- 关于页面打印window.print()的样式问题
当我们打印网页的时候.有时候会发现.打印出来的.跟网页上看到的样式的差别有点大.这其中可能有的问题是.样式问题. 当调用打印(window.print())方法时.打印机会在网页的样式中查找 @med ...
- css技术之用最高和最宽的限制“max-height和max-width”做图片同比例缩放,达到图片不变形目的,做出批量打印图片功能,页面打印“window.print()”
一.简介 他们是为流而生的,像width/height这种定死的砖头式布局,min-width/max-width就没有存在的意义 ,min-width/max-width一定是自适应布局或流体布局中 ...
- js打印WEB页面内容代码大全
第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="tex ...
- Web系统页面打印技术实现与分析
1 Web页面打印概述应用WEB化,不论对开发商,还是对用户来说,实在是一种很经济的选择,因为基于WEB的应用,客户端的规则很简单,容易学习,容易维护,容易发布.在WEB系统中,打印的确是个烦人的问题 ...
- js灵活打印web页面区域内容的通用方法
我们做网站,经常需要打印页面指定区域的内容,而网上关于这块的说法很多,各种各样的打印控件也不少.但许多打印方案都不怎么好,至少我不喜欢,要么封装复杂,要么难以维护.正好现在的项目也需要用到 ...
- JSP 页面打印
<HTML><HEAD><TITLE>javascript打印-打印页面设置-打印预览代码</TITLE> <META http-equiv=Co ...
- .net开发---自定义页面打印区域
自定义页面打印区域 有3种办法: 办法一:将不需要打印的部位隐藏掉 Examp: <%-- (1)使用css样式,定义一个.noprint的class,将不打印的内容放入这个class内. -- ...
- javascript之页面打印
WebBrowser组件是IE内置的浏览器控件,使用时,首先要在<body>标签的下面用<object>...</object>标记声明WebBrowser组件,代 ...
- android网页打印,安卓网页打印,h5页面打印,浏览器打印,js打印工具
Android设备打印比较麻烦,一般设备厂商都提供原生app开发的SDK,我们web开发者为难了,不会原生开发啊 给大家提供一个思路,实现web加壳,利用打印浏览器实现 简单来说就是把我们的web页面 ...
随机推荐
- 三,samba
转载:http://www.cnblogs.com/phinecos/archive/2009/06/06/1497717.html 一. samba的安装: sudo apt-get insall ...
- CAD字体显示错乱问题解决方案
最近这两天一直在画竣工图,用CAD用得挺多的,所以老是发现一些问题.今天在打开别人发过来的图纸时,我看到竟然还有钢筋符号无法显示…… 像这种问题的解决,据我所知就两种方法: 一.替换使用的字体 首先选 ...
- SecureCRT的SFTP在Windows与Linux之间传输文件
使用SecureCRT软件ssh连接到Linux虚拟机.然后在SecureCRT上面打开SFTP会话
- 团队作业week3 团队成员规划
划分角色:PM:黄剑锟 Dev:顾泽鹏 周辰光 孙时 Test:龚少波 赵骞 彭佟 团队贡献分的分配方法:设定两个考察方面,分别为工作量和任务难度,每个人的个人单次得分为该次任务的 工作量(最高10分 ...
- C#如何设置Listview的行高-高度
Winform窗口中,控件listview是无法设置行高的. 以加入一个imagelist(图片列表控件)实现行高的设置. ImageList imageList = new ImageList(); ...
- mobiscroll 控件的使用(手机端日历控件)
先上一张图吧: 控件的下载地址:http://www.kuitao8.com/20140604/2615.shtml 文档API地址:http://docs.mobiscroll.com/2-13-2 ...
- Dotfuscator可以实现混淆代码、变量名修改、字符串加密
C#编写的代码如果不进行一定程度的混淆和加密,那么是非常容易被反编译进行破解的,特别是对于一些商业用途的C#软件来说,因为盯着的人多,更是极易被攻破.使用VS自带的Dotfuscator可以实现混淆代 ...
- bzoj 3039 悬线法求最大01子矩阵
首先预处理每个F点左右,下一共有多少个F点,然后 对于每个为0的点(R),从这个点开始,一直到这个点 下面第一个R点,这一区间中的min(左),min(右)更新答案. ps:我估计这道题数据有的格式不 ...
- C++ Template之非类型模板参数
非类型模板参数是通过基本变量类型引入,例如int,在使用时必须显式自定值,不能通过推断. 非类型模板参数的限制:不能是浮点数(在vc6.0上测试可以为浮点型),对象以及指向内部链接对象的指针. #in ...
- 【BZOJ】【1293】【SCOI2009】生日礼物
二分/堆 求一个最小的区间使得包含所有的颜色(并不一定只出现一次)$n\leq 10^6$ 我想的做法是:二分这个最小的长度(满足单调性……好久才想到QAQ),然后O(n)判断是否有可行的区间,这一步 ...