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

原理:通过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. linux下操作

    一.没有正确安装GNOME电源管理器的默认配置 二.oracle启停 1. linux下启动oraclesu - oraclesqlplus /nologconn /as sysdbastartupe ...

  2. Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案

    #Python运行Google App Engineer时出现的UnicodeDecodeError错误解决方案   ##问题描述 使用Python2.7.x运行GAE时有时会报这个错误 ```py ...

  3. linux 简单的DMA例程

    一个简单的使用DMA 例子 示例:下面是一个简单的使用DMA进行传输的驱动程序,它是一个假想的设备,只列出DMA相关的部分来说明驱动程序中如何使用DMA的. 函数dad_transfer是设置DMA对 ...

  4. DSP28335的SPI发送

    #include "DSP2833x_Device.h"#include "DSP2833x_Examples.h"unsigned char table[]= ...

  5. DSP280x的数模转换使用

    /*****************************************************************************Copyright: 2013File na ...

  6. 软件工程课后作业——用JAVA编写的随机产生30道四则运算

    package com.java.sizeyunsuan; public class lianxi { String f() { int i=(int)(Math.random()*10); int ...

  7. Careercup - Microsoft面试题 - 5718181884723200

    2014-05-11 05:55 题目链接 原题: difference between thread and process. 题目:请描述进程和线程的区别. 解法:操作系统理论题.标准答案在恐龙书 ...

  8. python-操作mssql数据库

    准备工作: cmd 命令行下安装pymssql: pip install pymssql 查询的数据库如下: 代码如下: #coding=utf-8 import pymssql class MSSQ ...

  9. PHP中如何连接数据库基本语句

    只是后端修改页面,不需要在前端显示的可以删除原有代码只输入<?php 开始编写语言即可,后面的?>也可以省略 //造一个连接$connect = @mysql_connect(" ...

  10. 1565: [NOI2009]植物大战僵尸 - BZOJ

    Description Input Output仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何攻击,这样能源收入为0.Sample Input3 210 020 0-10 0 ...