window.print()局部打印三種方式(小結(jié))
首先準(zhǔn)備要打印的內(nèi)容,也可以打印時(shí)再填充,html中定義如下:
<!--startprint-->
<div id="printcontent" style="display:none">
${printContentBody}
</div>
<!--endprint-->方法一: 通過開始、結(jié)束標(biāo)記(startprint、endprint)來打印
function doPrint() {
bdhtml=window.document.body.innerHTML;
sprnstr="<!--startprint-->"; //開始打印標(biāo)識字符串有17個(gè)字符
eprnstr="<!--endprint-->"; //結(jié)束打印標(biāo)識字符串
prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17); //從開始打印標(biāo)識之后的內(nèi)容
prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr)); //截取開始標(biāo)識和結(jié)束標(biāo)識之間的內(nèi)容
window.document.body.innerHTML=prnhtml; //把需要打印的指定內(nèi)容賦給body.innerHTML
window.print(); //調(diào)用瀏覽器的打印功能打印指定區(qū)域
window.document.body.innerHTML=bdhtml;//重新給頁面內(nèi)容賦值;
return false;
}方法二:通過id選擇器來替換內(nèi)容打印,方法類似第一種
function doPrint2(){
if(getExplorer() == "IE"){
pagesetup_null();
}
//根據(jù)div標(biāo)簽ID拿到div中的局部內(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;//重新給頁面內(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";
??? }
}方法三:通過動(dòng)態(tài)創(chuàng)建iframe來打?。ㄍ扑]的方法)(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)頁眉頁腳和路徑的問題
doc.write('<div>' + el.innerHTML + '</div>');
doc.close();
iframe.contentWindow.focus();
}
setTimeout(function(){ iframe.contentWindow.print();},50) //解決第一次樣式不生效的問題
if (navigator.userAgent.indexOf("MSIE") > 0){
document.body.removeChild(iframe);
}
}
</script>
</body>
</html>對打印預(yù)覽頁面的居中或者橫向、縱向設(shè)置可以參考這個(gè)鏈接:https://blog.csdn.net/ZHANGLIZENG/article/details/91865007
使用方法一、二時(shí),弊端有2個(gè):
1)由于替換來當(dāng)前頁面的內(nèi)容,從而當(dāng)取消打印時(shí),會使原來的頁面一些form表單失效。
2)當(dāng)前頁面中的樣式會影響到打印的內(nèi)容中的樣式。
所以這里推薦使用iframe來創(chuàng)建,并且可以自定義樣式。
以上內(nèi)容在谷歌瀏覽器下測試通過,其他瀏覽器未做驗(yàn)證。
190622更新說明:
看到兩個(gè)伙伴留言,我說說后面發(fā)生的事兒吧,我當(dāng)時(shí)做的是電子面單的打印,但是發(fā)現(xiàn)第三種方法打印出的電子面單的條碼還是不太清洗,字體偏淡。
所以最后也沒有用第三種方法,直接使用lodop來打印了。
但是本身第三種方法測試是可行的。
20210616更新說明:
結(jié)合評論中的反饋,針對第三種方式解決了頁眉頁腳顯示的問題、第一次出現(xiàn)樣式不生效的問題。
到此這篇關(guān)于window.print()局部打印三種方式(小結(jié))的文章就介紹到這了,更多相關(guān)window.print()局部打印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS 組件系列之Bootstrap Table的凍結(jié)列功能徹底解決高度問題
這篇文章主要介紹了JS 組件系列之Bootstrap Table的凍結(jié)列功能徹底解決高度問題,需要的朋友可以參考下2017-06-06
js location.replace與location.reload的區(qū)別
js location.replace與location.reload的區(qū)別,經(jīng)常能用的到,需要的朋友可以可以下。2010-09-09
JavaScript模擬實(shí)現(xiàn)簡單的MVC的示例詳解
MVC是一種常見的軟件架構(gòu)模式,MVC模式的目的是將應(yīng)用程序的數(shù)據(jù)、用戶界面和控制邏輯分離,提高代碼的可維護(hù)性,可拓展性和可重用性。本文就來用用JS模擬實(shí)現(xiàn)一個(gè)簡單的MVC吧2023-04-04
微信小程序使用request網(wǎng)絡(luò)請求操作實(shí)例
這篇文章主要介紹了微信小程序使用request網(wǎng)絡(luò)請求操作,結(jié)合實(shí)例形式分析了wx.request(object)網(wǎng)絡(luò)請求操作的具體使用技巧,需要的朋友可以參考下2017-12-12
javascript HTML5 Canvas實(shí)現(xiàn)圓盤抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了javascript HTML5 Canvas實(shí)現(xiàn)圓盤抽獎(jiǎng)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04
一直都需要的復(fù)制到系統(tǒng)剪貼板之IE,firefox兼容版
一直都需要的復(fù)制到系統(tǒng)剪貼板之IE,firefox兼容版...2007-09-09
JavaScript程序設(shè)計(jì)高級算法之動(dòng)態(tài)規(guī)劃實(shí)例分析
這篇文章主要介紹了JavaScript程序設(shè)計(jì)高級算法之動(dòng)態(tài)規(guī)劃,結(jié)合實(shí)例形式分析了javascript動(dòng)態(tài)規(guī)劃算法的原理、實(shí)現(xiàn)技巧與相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2017-11-11
深入淺析JavaScript中prototype和proto的關(guān)系
prototype,每一個(gè)函數(shù)對象都有一個(gè)顯示的prototype屬性,而proto每個(gè)對象都有一個(gè)名為_proto_內(nèi)部隱藏屬性。本文給大家介紹JavaScript中prototype和proto的關(guān)系,需要的朋友參考下2015-11-11

