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

原理:通过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. MVC4.0 实现单一Action返回多种结果

    在开发过程中,我们往往会遇到这种情况.例如:展示学生的详细信息页面,加载学生的详细信息局部视图,异步请求学生的详细信息Json数据等等. 一般情况下,我们会写三个不同的action来支撑前台数据的调用 ...

  2. 1.总结---tr()和QTextCodec对象

    1. 关于Qt 中的tr()函数-------http://tscsh.blog.163.com/blog/static/200320103201310213312518/ 在论坛中漂,经常遇到有人遇 ...

  3. JavaScript设计模式与开发实践——JavaScript的多态

    “多态”一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不 ...

  4. 用cmd命令合并N个文件

    今天早上朋友发我一篇小说(42个TXT文件),让我给他合并为一个文件.我首先想到的是“Copy”命令,它可以复制文件,也可以合并文件. 例如:合并1.txt和2.txt到12.txt(其为ASCII文 ...

  5. SqlServer正在执行的sql语句

    SELECT [Spid] = session_Id ,ecid ,[Database] = DB_NAME(sp.dbid) ,[User] = nt_username ,[Status] = er ...

  6. “我爱淘”冲刺阶段Scrum站立会议8

    完成任务: 今天最大的成功就是解决了昨天的问题,可以将xml文件的内容解析出来显示到软件中. 计划任务: 可以通过webservice将数据库中的内容解析出来,通过查询可以得到想要的内容. 遇到问题: ...

  7. Python科学计算(二)windows下开发环境搭建(当用pip安装出现Unable to find vcvarsall.bat)

    用于科学计算Python语言真的是amazing! 方法一:直接安装集成好的软件 刚开始使用numpy.scipy这些模块的时候,图个方便直接使用了一个叫做Enthought的软件.Enthought ...

  8. Jquery获取选中的checkbox的值

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  9. 【Permutations II】cpp

    题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...

  10. Netsharp快速入门(之9) 基础档案(工作区3 添加商品菜单,以及在产品中打开商品界面)

    作者:秋时 杨昶   时间:2014-02-15  转载须说明出处 3.5.2  添加导航菜单 1.打开平台工具,插件和资源节点,选择创建导航菜单,打开创建向导 2.选择所属插件 3.选择在哪个分类下 ...