一文弄懂window

		iframeDoc.write('<div>' + printContent + '</div>');
		setTimeout(function(){
		iframe.contentWindow.print();
		document.body.removeChild(iframe);
		}, 50);
	}
</script>

## 三、强行插入分页


当需要自定义打印分页时机时,可通过如下方式将指定 DOM 设为分割点。


1.在指定元素前添加分页符



@media print {h1 {page-break-before: always;}
}


2.在指定元素后添加分页符



@media print {h1 {page-break-after: always;}
}


## 四、打印设置


1.设置打印布局



@media print {
@page {
/* 纵向展示(高度展示内容更多) */
/* size: portrait;*/
/* 横向(宽度展示内容更大) */
size: landscape;
/* 打印的边距 上右下左 */
margin: 1cm 2cm 1cm 2cm;
}
}


注意,`一旦设置为 size: landscape,在打印时将不能切换展示模式,包括纸张类的设置`。


## 五、最佳实践(React)


### 1. 背景:


有一个信息填写页面,支持进行预览和打印,预览是一个 Dialog 弹框,打印取自于预览的内容。因此,在打印前,需要将预览内容呈现在 DOM 树上。


### 2. 思路:


1. 点击打印,将预览 Dialog open state 设置为 true,Dialog 渲染到 DOM 树上;
2. 执行 setTimeout 延迟任务,在 Dialog 渲染在 DOM 树上后对其隐藏(disabled: none),目的是实现视图上不展示 Dialog;
3. 创建 iframe,并将 Dialog 内容及其样式,写入 iframe.document 中;
4. 执行 iframe.contentWindow.print() 进行打印;
5. 打印完成后做一些重置处理:移除 iframe、将 Dialog 隐藏逻辑去掉、将 Dialog open state 置为 false;  
 这样,在`不影响现有页面内容的展示,同时实现了打印 Dialog 内容。`


### 3. 实现:



const printFocus = () => {
// 打印事件
// 1.挂载要打印的内容
setPreviewOpen(true);
setTimeout(() => {
// 延迟,等待 Dialog 渲染在 DOM 树上
// 2.隐藏要打印的内容
const container =document.querySelector(‘.preview-wrapper’);
container.setAttribute(‘style’,‘display: none;’);
// 3. 创建
iframeconst iframe =document.createElement(‘iframe’);
const printContent =container.innerHTML;
iframe.setAttribute(‘style’, ‘position: absolute; width: 0;height: 0;’);
document.body.appendChild(iframe);
const doc =iframe.contentWindow.document;
// 4. 写入内容//
doc.write(‘’);
doc.write(<link href="./preview-focus.css" media="print" rel="stylesheet" />);
doc.write(‘

’+ printContent + ‘
’);
const link = doc.getElementsByTagName(‘link’)[0];
link.onload = () => {
// 样式文件加载完毕后打印
// 5.执行打印
iframe.contentWindow.print();
// 6.重置工作
document.body.removeChild(iframe);
setPreviewOpen(false);
container.removeAttribute(‘style’);
}
},0);
}


## 六、如果干预打印分页


通常我们会遇到这种情况:在打印内容多于一页时会自动进行分页,若分页的分割点恰巧是一行文字,就会出现文字被切割分别显示在上下两页。


尽管我们可以通过 CSS 属性 page-break-before: always; 来干预分页,但页面内容并非固定的,如何将这个属性恰巧应用在分割点的 DOM 元素之上呢?


下面有一个思路可以参考一下:


1.为可能会被分割的元素设置自定义属性,用于查找访问;  
 2.根据打印视窗的每页高度,粗估一个高度值,作为页面分割的参考;  
 3.遍历可分割元素,判断它们是否处于页面分割位置(top < pageHeight && botton > pageHeight);  
 4.若处于页面分割位置,为此 DOM 设置分割属性 page-break-before: always;。  
 **代码实现**:




## 七、 window.print去除浏览器默认页眉页脚


打印时默认有页眉页脚信息,显示在页面外边距范围,我们可以通过去除页面模型page的外边距,使其隐藏页眉页脚信息,再通过设置 body 元素的 margin 来保证打印出来的页面带有外边距



@media print {
@page {
margin: 0;
}
body {
margin: 1cm;
}
}



//打印(兼容IE浏览器)

function webPrint(objId){

var printContent=document.getElementById(objId).innerHTML;//获得需要打印内容的HTML代码

PageSetup_Null();//把页眉页脚设置为空

printWindow=window.open(‘’,‘_blank’);

printWindow.document.write(‘ ’);

//这里是向新建的窗口写入HTML的head信息,可引入自己的js和css,以供打印时样式与网页中显示的一致

printWindow.document.write(‘

’+printContent+“
”);

//这里向新建的窗体中写入BODY的内容,注意,外边加的额外DIV是有必要的,它里面CSS可以控制打印时不会出现空白页

printWindow.document.write(“”);//这里向新建的窗体写入HTML的结束标记

printWindow.document.close();//关闭新建窗口的文档输出流,否则下面的打印语句无效

printWindow.print();//打印当前新建窗口中的内容

printWindow.close();//关闭新建的窗口

PageSetup_Default();//把页眉页脚恢复为默认

}

//设置网页打印的页眉页脚为空

function PageSetup_Null(){

var HKEY_Root,HKEY_Path,HKEY_Key;

HKEY_Root=“HKEY_CURRENT_USER”;

HKEY_Path=“\Software\Microsoft\Internet Explorer\PageSetup\”;

try{

var Wsh=new ActiveXObject("WScript.Shell");

HKEY_Key="header";

Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");

HKEY_Key="footer";

Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");

}catch(e){}

}

//设置网页打印的页眉页脚为默认值

function PageSetup_Default(){

var HKEY_Root,HKEY_Path,HKEY_Key;

HKEY_Root=“HKEY_CURRENT_USER”;

HKEY_Path=“\Software\Microsoft\Internet Explorer\PageSetup\”;

try{

var Wsh=new ActiveXObject("WScript.Shell");

HKEY_Key="header";

Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&w&b页码,&p/&P");

HKEY_Key="footer";

Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&u&b&d");

}catch(e){}

}


### window.print() 实现A4纸张打印及去掉页眉页脚及打印链接



测评表
<!-- Bootstrap -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
  <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
打印
</div>    
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
    /\*\*

* [打印]
* @return {[type]} [description]
*/
function preview()
{
bdhtml=window.document.body.innerHTML;//获取当前页的html代码
sprnstr=“ ”;//设置打印开始区域
eprnstr=“ ”;//设置打印结束区域
prnhtml=bdhtml.substring(bdhtml.indexOf(sprnstr)+18); //从开始代码向后取html
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));//从结束代码向前取html
window.document.body.innerHTML=prnhtml;
window.print();
window.document.body.innerHTML=bdhtml;
}


### window.print() 去掉页眉页脚及打印链接


![在这里插入图片描述](https://img-blog.csdnimg.cn/ab811b6a87514bc8a2113665e9dd3ec0.png)




![在这里插入图片描述](https://img-blog.csdnimg.cn/73799f7f561f4db4961e099e8b347937.png)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4ad69a88ecf049d49c9b03298d3af5b7.png)


## 八 、IE浏览器打印预览 :使用html 标签引入Webbrowser控件


最近遇到这么一个需求,需要在IE浏览器上打印的时候,不直接调用打印机,而是先打开打印预览页面,再进行打印操作。  
 这样,就需要对原本的打印方法进行改写了。`使用html 标签<object>引入Webbrowser控件`,这种方式优势是在I`E下可以弹出打印预览,这是打印很人性化的功能,但是遗憾的是高版本的IE浏览器不支持WebBrowser`了。  
 具体实现如下:





function printall(){
// 打印页面预览
if (!!window.ActiveXObject || “ActiveXObject” in window){//IE浏览器
$(“.noprint”).css(“display”,“none”);
try{
//增加打印预览
printWB.ExecWB(7, 1);
}catch(e){
alert(e);
}finally{
$(“.noprint”).css(“display”,“”);
}
}else{
//需要引入jquery.jqprint-0.3.js
$(‘#a’).jqprint();
}
}


附该对象常用的方法:



  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值