`
javawebsoa
  • 浏览: 424317 次
社区版块
存档分类
最新评论

IE6.0打印机制解析

 
阅读更多

摘自 http://www.cjsdn.net/post/view?bid=29&id=98728&sty=1&tpg=1&age=0

网页打印,可以通过浏览器的"打印"功能实现,但"打印模板"机制,却是 IE 5.5 /6.0 以及 Netscape 6.0 所独有的;准确一点, IE 5.5 只是一个机制雏形,在 IE 6.0 中才得以完全体现。IE 6.0 的打印功能模块,在精确控制页面边界,文本间隔,以及打印的统一性上,功能更为完备。
通过创建打印模板,你可以精确控制:

网页打印及预览时的页面风格与内容编排风格;
打印属性,如自动为打印的页面添加卷标或编号;
精确控制打印预览界面的各个元素与变量。

通过打印模板,你可以:

自动为所有打印页面添加固定内容,如公司标识,版权申明,或者指定广告;
自定义页面标头与尾注等元素,比如页码或卷标;
指定打印历史与任务;
书本化奇偶分页映射打印......

打印模板机制是建立在动态 HTML 语言基础上的,涉及到主要两个行为:DeviceRect, LayoutRect ,下面我们就这两个行为深入地探讨 IE 6.0 的打印机制。

另外需要说明的是,DHTML (动态超文本标识语言)的行为跟其他语言的"行为"一样,都是一种应用编程接口,初始状态下有自己的默认属性,在一定的事件下,由用户决定调用其承认的功能模块,从而产生相对应的"行为"。而且,"行为"可以自己编写,不过得以".htc"为其扩展名以供调用。

一.DeviceRect ,定义打印总体风格:

打印总体风格,包括为打印页面添加如公司标识的固定内容(网页上不一定有,只体现在打印纸张上或预览页面上,后同);打印页面的颜色风格;打印页面的边缘属性或图案;等等。

在进行 DeviceRect 引用前,先得确定页面风格,方法是用<style>进行设置。

例一:我们来定制如下的打印模板
8.5 inch 宽
11 inch 高
黄色背景
1 pixel 宽的黑色实心左边界
1 pixel 宽的黑色实心上边界
4 pixels 宽的黑色实心右边界
4 pixels 宽的黑色实心下边界
所有边界与纸张边缘为 10 pixels 的距离

现在我们用 style 进行设定,假设这个 style 名为 Mystyle1:

<style TYPE="text/css">
.Mystyle1
{
width:8.5in;
height:11in;
background:#FFFF99;
border-left:1 solid black;
border-top:1 solid black;
border-right:4 solid black;
border-bottom:4 solid black;
margin:10px;
}
</style>

下面我们给出 DeviceRect 引用的完全页面代码,

<HTML XMLNS:IE>
<HEAD>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style TYPE="text/css">
.Mystyle1
{
width:8.5in;
height:11in;
background:#FFFF99;
border-left:1 solid black;
border-top:1 solid black;
border-right:4 solid black;
border-bottom:4 solid black;
margin:10px;
}
</style>
</HEAD>
<BODY>

<IE:DEVICERECT ID="page1" CLASS="Mystyle1" MEDIA="print">
</IE:DEVICERECT>

<IE:DEVICERECT ID="page2" CLASS="Mystyle1" MEDIA="print">
</IE:DEVICERECT>

</BODY>
</HTML>

在这个页面中,共进行了两个 DeviceRect 引用。作为一种规则,每一个单独的打印页面,必须有一个相对应的 DeviceRect 标记,如果有 1000 个页面,那就得有 1000 个 DeviceRect 标记!吓住了?别担心,后面我们会教你一个方法,让所有的 DeviceRect 标记自动完成!

在上面的代码中,ID 是标志属性,不同的页面必须有自己不同的标识;CLASS 引用了 style 属性;MEDIA 属性则指明了本页面的最终用途是进行打印;<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">这句话则是指输入默认的行为,它们分别是 DeviceRect, LayoutRect。

二.LayoutRect ,定义页面内容风格:

跟 DeviceRect 一样,不同的页面,要进行 LayoutRect 引用时都需要添加 LayoutRect 标记,其智能添加方法将在后面介绍; LayoutRect 与 DeviceRect 如果在同一个页面中同时出现,则前者需放在后者之内;另外, LayoutRect 对内容风格的设定,也通过 style 得以实现。

例二:我们来定制如下的内容风格的打印模板:

5.5 inches 宽
8 inches 高
与打印纸张边缘,四边保持 1 inch 的宽度(加上页面本身的边缘宽度,为实际的打印边缘宽度)
白色背景
1 inch 宽的虚线边界

先定制名为 contentstyle 的风格:

<style TYPE="text/css">
.contentstyle
{
width:5.5in;
height:8in;
margin:1in;
background:white;
border:1 dashed gray;
}
</style>

然后下面是进行引用的完整网页代码:

<HTML>
<HEAD>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style TYPE="text/css">
.contentstyle
{
width:5.5in;
height:8in;
margin:1in;
background:white;
border:1 dashed gray;
}
</style>
</HEAD>

<BODY>
<IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/>

<IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/>
</BODY>
</HTML>

跟例一中的源代码相比,例二中只是以 LayoutRect 代替了原来的 DeviceRect 标记;DeviceRect 定制的是模板整体风格,而 LayoutRect 定制的是具体内容的版面风格;LayoutRect 的 ID 属性也具有唯一性; CONTENTSRC 属性则指明了具体的将起作用网页文件;CLASS 指明了风格的引用对象;跟 DeviceRect 不同,在进行 LayoutRect 引用时,必须在每个页面指定 NEXTREC ,即依次排列的下一个内容风格,这里的"下一个内容"用其页面的相应 ID 进行标识,如本例中的 LayoutRect2 。

三.DeviceRect 与 LayoutRect 的协同作战:

上面我们分别讨论了 DeviceRect 与 LayoutRect 的作用与引用方法,现在我们来看一下,如何在同一个打印模板中进行定制与引用。

在每一个打印模板上,必然包含两方面的内容,一个是整体的模板风格(DeviceRect),另一个是内容风格(LayoutRect);第一个打印页面跟其他页面是不同的,因为第一个页面中必须指明 CONTENTSRC 属性,而同一打印任务中的其他页面不再需要进行 CONTENTSRC 的指定。

例三:

下面是第一个页面中的 DeviceRect 代码:

<IE:DEVICERECT ID="page1" CLASS="masterstyle" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/>
</IE:DEVICERECT>

下面是其他页面中的 DeviceRect 代码:

<IE:DEVICERECT ID="page2" CLASS="masterstyle" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/>
</IE:DEVICERECT>

下面我们将 DeviceRect 与 LayoutRect 结合起来使用,其源代码如下:

<HTML XMLNS:IE>
<HEAD>
<?IMPORT NAMESPACE="IE" IMPLEMENTATION="#default">
<style TYPE="text/css">
.contentstyle
{
width:5.5in;
height:8in;
margin:1in;
background:white;
border:1 dashed gray;
}
.Mystyle1
{
width:8.5in;
height:11in;
background:#FFFF99;
border-left:1 solid black;
border-top:1 solid black;
border-right:4 solid black;
border-bottom:4 solid black;
margin:10px;
}
</style>
</HEAD>

<BODY>
<IE:DEVICERECT ID="page1" CLASS="Mystyle1" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect1" CONTENTSRC="2.html" CLASS="contentstyle" NEXTRECT="layoutrect2"/>
</IE:DEVICERECT>

<IE:DEVICERECT ID="page2" CLASS="Mystyle1" MEDIA="print">
<IE:LAYOUTRECT ID="layoutrect2" CLASS="contentstyle"/>
</IE:DEVICERECT>

</BODY>
</HTML>

四.DeviceRect 与 LayoutRect 标记的动态自动添加:

前面我们说到,每个单独的打印页面都需要各自的 DeviceRect 与 LayoutRect 标记,那么,如果我们有 1000 个页面需要打印,是否就要在每个页面上重复繁琐的 Copy & Paste 操作?

答案是否定的,我们完全可以通过 JavaScript 脚本来完成这一繁琐的工作。

要实现 HTML 声明的动态创建,关键在于 <DIV> 标记的定义,下面是其定义规则。

<DIV ID="devicecontainer">
......
</DIV>

<DIV>与</DIV>之间,采用 insertAdjacentHTML() 方式,并主要利用了其 afterBegin 与 BeforeEnd 两个变量,现在我们将第一个页面"插入"到<DIV></DIV>之间:

devicecontainer.insertAdjacentHTML("afterBegin", newHTML);

具有继承属性的后续页面,调用 beforeEnd 变量:

devicecontainer.insertAdjacentHTML("beforeEnd", newHTML);

要装载 devicecontainer 页面,还需在 <Body>中添加:

<BODY ONLOAD="addFirstPage()">

现在我们在 JavaScript 中添加包含前面详细介绍的 LayoutRect 与 DeviceRect 元素,用到的命令是 addFirstPage() 。需要注意的是,newHTML 标记后使用的是双引号,而 LayoutRect 与 DeviceRect 标记后的变量使用单引号。如下:

function addFirstPage() {
newHTML = "<IE:DEVICERECT ID='devicerect1' MEDIA='print' CLASS='mystyle1'>";
newHTML += "<IE:LAYOUTRECT ID='layoutrect1' CONTENTSRC='2.html'" + "ONLAYOUTCOMPLETE='onPageComplete()' NEXTRECT='layoutrect2'" + "CLASS='contentstyle'/>";
newHTML += "</IE:DEVICERECT>";

devicecontainer.insertAdjacentHTML("afterBegin", newHTML);
}

细心的读者一定会发现,LayoutRect 后出现了一个新的属性:LayoutRect:onLayoutComplete ,这个属性主要指定了 LayoutRect 停止响应的后续事件,如系统资源消耗殆尽而停止响应,或者 LayoutRect 指定的变量溢出。

好了,有了上面的原理,下面我们来编写具有自动"插入"功能的 JavaScript 代码:

function onPageComplete() {
if (event.contentOverflow) {
newHTML = "<IE:DEVICERECT ID='devicerect" + (lastPage + 1) + "' MEDIA='print' CLASS='mystyle1'>";
newHTML += "<IE:LAYOUTRECT ID='layoutrect" + (lastPage + 1) + "' ONLAYOUTCOMPLETE='onPageComplete()' NEXTRECT='layoutrect" + (lastPage + 2) + "' CLASS='contentstyle'/>";
newHTML += "</IE:DEVICERECT>";

devicecontainer.insertAdjacentHTML("beforeEnd", newHTML);
lastPage++;
}

在上面的代码中,contentOverflow 代表的是由于页面信息过长,本页的 LayoutRect 停止响应,则直接跳到下一个页面,让 LayoutRect 重新定义下一个页面的版面;onPageComplete() 则不管页面是否过长,LayoutRect 是否停止响应,只要到了页面尾部则自动跳到下一页,这也是最常见的情况。

在编写本脚本时,关键处在于保持清醒,不能让任意一个变量出错。其中,ID 不仅针对 DeviceRect 与 LayoutRect ,还为 NextRect 所引用,页面指向不能出错;当前页面的页码应该是 lastPage+1 ,下一个页面的页码应该是 lastPage+2 ;NextRect 标记需要下一个页面的 LayoutRect 属性支持,因此它的值应该为 "layoutRect"+(lastPage+2);打开第一个页面时,这个 LastPage 初始值为 1

分享到:
评论

相关推荐

    IE6.0sp1-KB823353-x86-CHS.rar_IE6.0S_IE6.0升级包_IE6.X_ie6 X86_ie6.

    标签中的“ie6.0s”可能是指IE6的某个特定版本或服务包,“ie6.0升级包”明确了这是一个针对IE6的升级程序,“ie6.x”可能是指包括IE6所有版本的统称,“ie6_x86”强调了这适用于32位系统,“ie6.0sp1”则直接对应了...

    IE6.0安装程序

    Internet Explorer(IE)是由微软公司开发的一款经典的网络浏览器,IE6.0是其第六个主要版本,发布于2001年。这个标题暗示了在某些情况下,用户可能需要重新安装此版本的浏览器,可能是为了兼容老旧的系统或应用,...

    绿色版IE6.0

    **绿色版IE6.0详解** 在互联网发展的早期阶段,微软的Internet Explorer 6.0(简称IE6)是一款非常流行的网页浏览器。它在2001年发布,以其先进的功能和兼容性赢得了广大用户的喜爱。然而,随着时间的推移,技术和...

    绿色单文件版IE6.0,原版XP提取,完美版,绝对好用,支持win7、win8

    标题中的“绿色单文件版IE6.0”指的是一个便携式的、独立的Internet Explorer 6.0浏览器版本,它不需要安装,用户可以直接运行提供的可执行文件(VirtIE6.exe)来启动浏览器。这种设计使得它易于在不同电脑间携带和...

    IE6.0浏览器绿色版

    **IE6.0浏览器绿色版** 是一个无需安装即可使用的版本,主要针对那些希望快速启动并使用Internet Explorer 6.0而不想进行正式安装的用户。这个版本的浏览器被设计成解压缩后直接运行,避免了在系统中留下冗余文件...

    重装IE6.0无需XP系统光盘的方法

    在Windows XP操作系统中,Internet Explorer 6.0(简称IE6.0)是预装的浏览器版本。然而,当用户需要重新安装或修复这个浏览器时,通常会遇到一个普遍的问题,那就是系统提示需要原始的XP系统光盘。实际上,有一种...

    IE4.0 IE5.0 IE5.5 IE6.0集合

    标题 "IE4.0 IE5.0 IE5.5 IE6.0集合" 提供了这个压缩包包含的Microsoft Internet Explorer(简称IE)的不同版本,这些版本分别是4.0、5.0、5.5以及6.0。这些浏览器是微软在20世纪90年代末到21世纪初推出的,它们在...

    IE6.0绿色免安装版+可以让单个IE6.0打开多窗口的WebTools多页式浏览工具

    IE6.0绿色免安装版:可以实现与IE7.0和IE8.0共存 WebTools多页式浏览工具:可以让让单个IE6.0打开多窗口的工具

    IE6.0绿色版

    IE6.0绿色版,此ie为单文件版本,解压缩即可使用,使用前请校验MD5

    IE6.0以下多页式浏览工具

    IE6.0(Internet Explorer 6.0)是微软在2001年发布的一款老版本浏览器,尽管它已经被后续的版本如IE7、IE8、IE9等取代,但在一些特定的环境中,例如某些企业或政府系统,仍然可能需要使用到IE6.0。这主要是因为这些...

    IE修改工具(IE6.0)

    可以修改IE6.0,清除一些恶意插件,在IE不听话的时候使用

    IE6.0安装包

    标题中的"IE6.0安装包"指的是Internet Explorer 6.0的安装程序,这是微软在2001年发布的一款经典网页浏览器。这个版本在当时是Windows操作系统的主要浏览工具,尤其是在Windows XP系统中广泛使用。然而,随着时间的...

    修复ie6.0浏览器

    标题中的“修复ie6.0浏览器”指的是针对微软Internet Explorer 6.0这款浏览器进行问题诊断和解决的过程。Internet Explorer 6.0是微软在2001年发布的一款网络浏览器,随着时间的推移,它逐渐暴露出了许多安全性和...

    IE6.0 绿色 免安装版

    描述提到"IE6.0的绿色版,可以与IE7并存",意味着这个版本的 IE6 可以与 IE7 同时存在于同一台电脑上,这对于网页开发者尤其有用,因为他们需要在不同的浏览器环境下测试网页的兼容性。此外,"可以同时装ie6,ie7和...

    IE6.0修复工具下载

    **IE6.0修复工具详解** 在互联网发展的早期阶段,微软的Internet Explorer 6.0(简称IE6)是一款广泛使用的网页浏览器。然而,随着时间的推移,它逐渐暴露出许多兼容性和安全性问题,导致用户在浏览网页时可能会...

    IE6·0绿色免安装版让IE7和IE6并存

    这时,"IE6.0绿色免安装版"就显得非常有用,因为它可以与更新的浏览器版本如IE7并存,为开发者和测试人员提供了便利。 首先,让我们了解一下什么是绿色软件。绿色软件通常指的是不需要安装即可使用的程序,它不向...

    IE6.0 升级至8.0包

    IE6.0 升级至8.0包

    无需光盘重装IE6.0的方法

    无需光盘重装出错的IE, 集成装IE需要的I386文件,无需任何辅助工具,以备急用

    PRODAVE MPI IE V6.0 siemens

    V6.0的升级可能包括了对新协议的支持,优化的网络管理功能,以及更强大的错误检测和恢复机制。 在实际应用中,PRODAVE MPI IE V6.0主要用于以下几个方面: 1. **设备连接**:通过该软件,用户可以轻松地将SIMATIC ...

    VB6.0-DBC解析代码生成

    VB6.0-DBC解析 can通信使用的DBC通信矩阵文件,需要和C代码中的解析保持一致,正常情况下我们需要手动修改代码满足DBC指定的信号变换。本文就是提供了VB6.0环境下的DBC解析生产代码的源码工具。使用说明链接如下 ...

Global site tag (gtag.js) - Google Analytics