国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

React如何實現瀏覽器打印部分內容詳析

2024-05-06 16:51:05
字體:
來源:轉載
供稿:網友

前言

近期著手項目任務的打印功能,在此作個記錄,本文介紹基于React的一種調用瀏覽器打印頁面指定內容的方法。

整體思路: 通過構建一個隱藏的元素(該元素包裹需打印的內容),當打印行為觸發時,將頁面其他的一些不需要打印的元素隱藏,然后將需打印的元素追加到body中,打印完成后,再恢復初始狀態即可。瀏覽器打印的本質還是將web頁面中的元素打印出來而已。

1. 構建待打印元素

在頁面中構建一個display為none的元素,里面的內容為你需要打印的內容。我們還需要設置包裹打印內容的元素的ref屬性,以便于后面獲取到元素。

<div style={{ display: 'none' }}> <div ref={el => (this.printRef = el)}> { 打印內容 } </div></div>

2. 打印動作觸發時的處理

處理流程:

  1. 獲取待打印元素;
  2. 將根元素隱藏;
  3. 將待打印元素追加到body中;
  4. 調用瀏覽器的打印預覽;
  5. 預覽界面關閉后,將待打印元素從body中移除,將原始頁面恢復。
let printView = this.state.printRef //獲取待打印元素document.querySelector('#root').className = 'print-hide' //將根元素隱藏document.body.appendChild(printView) //將待打印元素追加到body中window.print() //調用瀏覽器的打印預覽document.body.removeChild(printView) //將待打印元素從body中移除document.querySelector('#root').className = '' //將原始頁面恢復

對應的CSS設置:

@page { size: A4; margin: 0;}@media print { html, body {  min-width: 0;  width: 210mm;   height: 297mm; } .print-hide { visibility: hidden!important; display: none!important; }}

其中,@page中的size可以自己設置紙張的大小,如果是A4紙可以直接設置值為A4,媒體查詢@media print中設置的是打印時的樣式,因為打印設備知道其輸出區域的物理大小,所以使用厘米(cm)、毫米(mm)、英寸(in)等作為打印設計的單位完全可行。

補充(其他原生的打印方法)

直接替換body的內容為要打印的內容,之后再重新刷新頁面。

const old = window.document.body.innerHTML //備份原來的頁面window.document.body.innerHTML = ''window.document.body.appendChild(/* 將你要打印的內容附加到這 */)window.print() //調用print()函數時,會跳出打印預覽的界面,以下的代碼被阻塞,關閉預覽界面后繼續執行window.document.body.innerHTML = oldwindow.location.reload() //重新加載舊頁面

打開一個新窗口,將打印內容放到新窗口打印,打印結束后關閉新窗口

const newWindow = window.open("打印窗口", "_blank")const docStr = '<div>test</div>' //需要打印的內容newWindow.document.write(docStr)const styles = document.createElement("style")styles.setAttribute('type', 'text/css') //media="print"styles.innerHTML = ''newWindow.document.getElementsByTagName('head')[0].appendChild(styles)newWindow.print()newWindow.close()

以上兩種方法可能會造成CSS樣式應用無效的問題。

3. 注意點

第二小節的步驟2中的意思是:將頁面中所有不需要打印的元素隱藏,特別注意像模態窗Model這些元素,也要為它們加上 'print-hide'className屬性。

如果需要在特定位置強制分頁打印,可以嘗試在對應元素上設置page-break-before:always !importantpage-break-after:always !importantCSS屬性,該屬性只對塊級元素有效。

進入打印預覽后,我們無法獲知用戶最終是選擇了打印,還是選擇了取消。這里若有人知道解決方法的話,歡迎留言。

React,瀏覽器,打印,部分內容

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石首市| 呈贡县| 忻城县| 嵊泗县| 姜堰市| 南澳县| 嘉兴市| 罗平县| 泸定县| 正定县| 乌兰浩特市| 无锡市| 永新县| 青阳县| 汝城县| 永丰县| 永新县| 九龙坡区| 湛江市| 黔南| 亳州市| 横峰县| 横山县| 鱼台县| 普兰店市| 桐梓县| 繁昌县| 洛川县| 山阴县| 潼关县| 高碑店市| 华池县| 舞阳县| 江华| 顺平县| 阜宁县| 承德县| 兴和县| 汾阳市| 武城县| 巍山|