window.print()局部打印三種方式(小結(jié))
首先準(zhǔn)備要打印的內(nèi)容,也可以打印時(shí)再填充,html中定義如下:
<!--startprint-->
<div id="printcontent" style="display:none">
${printContentBody}
</div>
<!--endprint-->方法一: 通過(guò)開(kāi)始、結(jié)束標(biāo)記(startprint、endprint)來(lái)打印
function doPrint() {
bdhtml=window.document.body.innerHTML;
sprnstr="<!--startprint-->"; //開(kāi)始打印標(biāo)識(shí)字符串有17個(gè)字符
eprnstr="<!--endprint-->"; //結(jié)束打印標(biāo)識(shí)字符串
prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); //從開(kāi)始打印標(biāo)識(shí)之后的內(nèi)容
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); //截取開(kāi)始標(biāo)識(shí)和結(jié)束標(biāo)識(shí)之間的內(nèi)容
window.document.body.innerHTML=prnhtml; //把需要打印的指定內(nèi)容賦給body.innerHTML
window.print(); //調(diào)用瀏覽器的打印功能打印指定區(qū)域
window.document.body.innerHTML=bdhtml;//重新給頁(yè)面內(nèi)容賦值;
return false;
}方法二:通過(guò)id選擇器來(lái)替換內(nèi)容打印,方法類似第一種
function doPrint2(){
if(getExplorer() == "IE"){
pagesetup_null();
}
//根據(jù)div標(biāo)簽ID拿到div中的局部?jī)?nèi)容
bdhtml=window.document.body.innerHTML;
var jubuData = document.getElementById("printcontent").innerHTML;
//把獲取的 局部div內(nèi)容賦給body標(biāo)簽, 相當(dāng)于重置了 body里的內(nèi)容
window.document.body.innerHTML= jubuData;?
//調(diào)用打印功能
window.print();
window.document.body.innerHTML=bdhtml;//重新給頁(yè)面內(nèi)容賦值;
return false;
}
function pagesetup_null(){?????????????? ?
??? var hkey_root,hkey_path,hkey_key;
??? hkey_root="HKEY_CURRENT_USER";
??? hkey_path="\\Software\\Microsoft\\Internet Explorer\\PageSetup\\";
??? try{
??????? var RegWsh = new ActiveXObject("WScript.Shell");
??????? hkey_key="header";
??????? RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"");
??????? hkey_key="footer";
??????? RegWsh.RegWrite(hkey_root+hkey_path+hkey_key,"");
??? }catch(e){}
}
function getExplorer() {
??? var explorer = window.navigator.userAgent ;
??? //ie
??? if (explorer.indexOf("MSIE") >= 0) {
??????? return "IE";
??? }
??? //firefox
??? else if (explorer.indexOf("Firefox") >= 0) {
??????? return "Firefox";
??? }
??? //Chrome
??? else if(explorer.indexOf("Chrome") >= 0){
??????? return "Chrome";
??? }
??? //Opera
??? else if(explorer.indexOf("Opera") >= 0){
??????? return "Opera";
??? }
??? //Safari
??? else if(explorer.indexOf("Safari") >= 0){
??????? return "Safari";
??? }
}方法三:通過(guò)動(dòng)態(tài)創(chuàng)建iframe來(lái)打?。ㄍ扑]的方法)(210616更新)
這里要注意判斷iframe是否存在,防止反復(fù)使用時(shí),iframe重復(fù)創(chuàng)建消耗內(nèi)存
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus?">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
<button onclick="doPrint3()">打印</button>
<!--startprint-->
<div id="printcontent" style="display:none">
這里可以自己填充打印內(nèi)容
</div>
<!--endprint-->
<script type='text/javascript'>
function doPrint3(){
//判斷iframe是否存在,不存在則創(chuàng)建iframe
var iframe=document.getElementById("print-iframe");
if(!iframe){
var el = document.getElementById("printcontent");
iframe = document.createElement('IFRAME');
var doc = null;
iframe.setAttribute("id", "print-iframe");
iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;');
document.body.appendChild(iframe);
doc = iframe.contentWindow.document;
//這里可以自定義樣式
doc.write('<style media="print">@page {size: auto;margin: 0mm;}</style>'); //解決出現(xiàn)頁(yè)眉頁(yè)腳和路徑的問(wèn)題
doc.write('<div>' + el.innerHTML + '</div>');
doc.close();
iframe.contentWindow.focus();
}
setTimeout(function(){ iframe.contentWindow.print();},50) //解決第一次樣式不生效的問(wèn)題
if (navigator.userAgent.indexOf("MSIE") > 0){
document.body.removeChild(iframe);
}
}
</script>
</body>
</html>對(duì)打印預(yù)覽頁(yè)面的居中或者橫向、縱向設(shè)置可以參考這個(gè)鏈接:https://blog.csdn.net/ZHANGLIZENG/article/details/91865007
使用方法一、二時(shí),弊端有2個(gè):
1)由于替換來(lái)當(dāng)前頁(yè)面的內(nèi)容,從而當(dāng)取消打印時(shí),會(huì)使原來(lái)的頁(yè)面一些form表單失效。
2)當(dāng)前頁(yè)面中的樣式會(huì)影響到打印的內(nèi)容中的樣式。
所以這里推薦使用iframe來(lái)創(chuàng)建,并且可以自定義樣式。
以上內(nèi)容在谷歌瀏覽器下測(cè)試通過(guò),其他瀏覽器未做驗(yàn)證。
190622更新說(shuō)明:
看到兩個(gè)伙伴留言,我說(shuō)說(shuō)后面發(fā)生的事兒吧,我當(dāng)時(shí)做的是電子面單的打印,但是發(fā)現(xiàn)第三種方法打印出的電子面單的條碼還是不太清洗,字體偏淡。
所以最后也沒(méi)有用第三種方法,直接使用lodop來(lái)打印了。
但是本身第三種方法測(cè)試是可行的。
20210616更新說(shuō)明:
結(jié)合評(píng)論中的反饋,針對(duì)第三種方式解決了頁(yè)眉頁(yè)腳顯示的問(wèn)題、第一次出現(xiàn)樣式不生效的問(wèn)題。
到此這篇關(guān)于window.print()局部打印三種方式(小結(jié))的文章就介紹到這了,更多相關(guān)window.print()局部打印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用微信小程序開(kāi)發(fā)彈出框應(yīng)用實(shí)例詳解
本文通過(guò)實(shí)例代碼給大家介紹了使用微信小程序開(kāi)發(fā)彈出框功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
微信小程序獲取驗(yàn)證碼60秒倒計(jì)時(shí)功能
這篇文章主要介紹了微信小程序獲取驗(yàn)證碼60秒倒計(jì)時(shí)模板,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
JavaScript中三種非破壞性處理數(shù)組的方法比較
在這篇文章中,我們將會(huì)探索處理數(shù)組的三種方法:for…of循環(huán)、數(shù)組方法.reduce()和數(shù)組方法.flatMap(),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-06-06
Javascript實(shí)現(xiàn)返回上一頁(yè)面并刷新的小例子
這篇文章主要介紹了Javascript實(shí)現(xiàn)返回上一頁(yè)面并刷新的小例子,有需要的朋友可以參考一下2013-12-12
ionic2打包android時(shí)gradle無(wú)法下載的解決方法
這篇文章主要為大家詳細(xì)介紹了ionic2打包android時(shí)gradle無(wú)法下載的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
js定時(shí)器怎么寫?就是在特定時(shí)間執(zhí)行某段程序
定時(shí)器想必大家并不陌生吧,在本文為大家詳細(xì)介紹下js中是如何實(shí)現(xiàn)定時(shí)器的,具體原理及代碼如下,感興趣的朋友不要錯(cuò)過(guò)2013-10-10
JavaScript實(shí)現(xiàn)的一個(gè)倒計(jì)時(shí)的類
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的一個(gè)倒計(jì)時(shí)的類,本文直接給出demo代碼,需要的朋友可以參考下2015-03-03
javascript基于原型鏈的繼承及call和apply函數(shù)用法分析
這篇文章主要介紹了javascript基于原型鏈的繼承及call和apply函數(shù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了javascript中繼承的概念、創(chuàng)建方法以及call和apply函數(shù)的功能與使用技巧,需要的朋友可以參考下2016-12-12

