多页面打印--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页面 ...
随机推荐
- dubbox使用
1.命令行下 git clone https://github.com/dangdangdotcom/dubbox 2.mvn install -Dmaven.test.skip=true 跳过测试编 ...
- springboot常见应用属性
# ===================================================================# COMMON SPRING BOOT PROPERTIES ...
- 基于.net mvc的校友录(六、codefirst的使用以及班级模块的关键部分实现)
通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.Begin ...
- 字符串流sstream[part3/使用字符串流进行安全的类型转换]
参考: http://blog.163.com/zhuandi_h/blog/static/180270288201291710222975/ http://www.cnblogs.com/games ...
- 命令行连接wifi
ubuntu没有图形界面,插入无线网卡后启动不能连接无线. 看这个帖子 http://askubuntu.com/questions/138472/how-do-i-connect-to-a-wpa- ...
- 移动端 js touch事件
随着智能手机和平板电脑的普及, 越来越多的人用移动设备浏览网页,我们平时在pc浏览器上用的鼠标事件,比如:click, mouseover等, 已经无法满足移动设备触摸屏的特点,触摸时代的到来,离不开 ...
- source insight 完全卸载和重装
Source insight的卸载不干净,会影响之后的安装 切入正题,完美卸载source insight的方法: 一.在pc的控制面板—>程序—>卸载程序 找到source insigh ...
- HDU 5795 博弈
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5795 A Simple Nim Time Limit: 2000/1000 MS (Java/Oth ...
- 【BZOJ】【4027】【HEOI2015】兔子与樱花
贪心 树上贪心问题……跟APIO2015练习赛的C很像啊…… 我的思路是:从叶子向上考虑,令a[x]表示x这个节点上樱花数量与儿子个数的和(即对于任意的x,都有$a[x]\leq m$)每次从儿子的a ...
- 项目前端技术-learn
赶鸭子上架 之 前端学习 目前项目中的前端用到的技术主要是:1. bootstrap框架; 2. 基于javscript的jQuery, jQuery ui; 3. dust前端模板引型.