window.print()

博客分类: 原创

window.print()

今天有一个打印的需求,之前在做另一个项目的时候也用过打印,当时去网上随便找了一段简单的代码就写上去了,发现一旦答应了之后很多功能就失效了,当时不知道怎么回事,现在回过头来看代码就知道了。

实现思路:我们只能打印一整个页面,但需求往往只要我们打印一部分,也就是局部打印,这个实现思路大概就是用特殊的标记将被打印的局部取出来,然后通过新开一个窗口或者iframe的方式将打印内容放进去,最后使用window.print()打印出来。

window.print()触发之后,不同的浏览器对于打印的表现可能不同,实际上调用该方法等同于按了Ctrl + p或者command + p,各个浏览器有自己的表现。但是这么牛逼的一个API居然不能传参数,真的是low爆了。

目前发现的问题是页眉和页脚没有办法通过代码的方式删除,无法控制打印的页数。

IE浏览器内置了WebBrowser控件,能更好的支持打印,但仅限于IE。且IE修改注册表可以去除页眉和页脚,也能控制打印页数。

全局打印

window.print()

局部打印(demo):直接将body的内容改了,然后调用window.print(),打印完了再将body的内容还原回去,这显然是非常不靠谱的,之前在dom上绑定的事件都不在了。

局部打印不删除domdemo):高端点的办法,就是打开一个iframe或者新开一个窗口,再调用打印。

IE插件模式(demo):这个只适用于IE,基本上可以完成所有打印的需求。

打印多份:除了让用户点打印多份,还可以了解一下A4纸大概的高度。然后将内容撑开。多复制内容几份已达到多份的效果。基于这种设想在实施的过程中,发现A4的纸相对于各个分辨率所对应的像素值都不太一样,所以想要达到这种效果首先要自己去计算各分辨率对应的像素的值。经过转换后换算成像素值,然后根据内容高度撑开扩充为多份。这个时候还需要考虑本身内容就超过一份。下次再开发。

打印预览失败:打印过程中发现,如果我需要引入外部css样式的时候,这个是一个请求,如果在调用打印的时候这个请求还没有回溯,预览会失败,解决这个问题是

IE下字体很小:然后就是在IE下打印出来的子都非常小。由旺星同学查阅发现这个问题别人也遇到过,只需要加上paWindow.document.execCommand('print', false, null);就可以解决了。

背景图片打印:打印机是不支持自动选择背景图片打印的,需要用户在打印选项中选择,北京图片打印,但会支持前景图片打印,所以在解决这类问题时一般是放在前景图片上做定位,但这是一个请求,所以一定要注意请求的控制,打印预览可能失败。

顺带遇到上面的问题的时候又发现需要判断浏览器类型,然后就发现了五年前的某某种方法居然对IE11都有效。五年前IE11都还没有出呢~~~

var browser = (function(){
    var ua= navigator.userAgent, tem,
    M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
    if(/trident/i.test(M[1])){
        tem=  /\brv[ :]+(\d+)/g.exec(ua) || [];
        return 'IE '+(tem[1] || '');
    }
    if(M[1]=== 'Chrome'){
        tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
        if(tem!= null) return tem.slice(1).join(' ').replace('OPR', 'Opera');
    }
    M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
    return M.join(' ');
})();

打印小型打印机时,首先需要安装正确的驱动,这个真的太重要了,虽然很常识,但确实非常重要。由于javascript没有办法做到设置预览中的信息,所以没有办法做到对于外框的选择。这部分还是需要用户自己设置,需要选择适合自己阅读的边框及页眉页脚。

以上做完都还有坑,IE9一下,iframe.write(string)。如果string太长就会有一部分没有写入。推荐使用innerHTML,就算用innerHTML内容也不能太长。