本教程详细介绍了如何使用javascript将网页中的特定html元素(如收据)打印到pdf或纸张。通过将目标元素的html内容封装为data uri并在新窗口中打开,结合内联javascript触发自动打印,实现了一种高效且用户友好的局部内容打印解决方案,避免了复杂的内容隐藏与恢复操作。
在构建复杂的网页应用时,经常会遇到需要打印页面特定区域内容的需求,例如电商网站的订单收据、报告或证书。传统的做法可能涉及通过JavaScript动态隐藏或显示页面元素,但这通常会导致页面闪烁或复杂的DOM操作。本教程将介绍一种更为优雅且自动化的方法,利用Data URI和内联JavaScript实现特定元素的打印功能。
本方案的核心在于以下几个关键技术点:
首先,需要将你希望打印的特定内容(例如收据表格)封装在一个独立的容器元素中。这样做有助于JavaScript精确地获取其HTML内容。同时,为了打印时的样式一致性,建议将与该内容相关的CSS样式直接嵌入到该容器内部或其子元素中,以确保在新打开的打印页面中样式能够正确应用。
以下是一个收据表格的HTML结构示例,它被包裹在一个 section 标签内,并且其样式直接嵌入在表格中:
# Item Description Unit Price Qty Price 1 Dummy Item1 200$ 1 200$ 2 Dummy Item2 75$ 1 75$ 3 Dummy Item3 100$ 2 200$ Total 475$
接下来是实现打印功能的JavaScript代码。我们将创建一个函数,该函数在被调用时执行以下操作:
获取目标内容并注入打印逻辑 首先,获取包含收据的 table 元素。然后,向其内部动态注入一个
function printReceipt() {
const receiptTable = document.querySelector('.receipt');
// 动态注入用于打印居中的CSS样式,这里通过修改已有的style标签实现
// 注意:这里假设receiptTable内部有一个
网页特定元素打印示例
这是页面上的其他内容,不应被打印。
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
#
Item Description
Unit Price
Qty
Price
1
Dummy Item1
200$
1
200$
2
Dummy Item2
75$
1
75$
3
Dummy Item3
100$
2
200$
Total
475$
中执行
const cssCenteringScript = `
const styleTag = document.createElement('style');
styleTag.innerHTML = '.receipt { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; max-width: 80%; width: auto; }';
document.head.appendChild(styleTag);
`;
// 保存原始HTML,以便在注入后可以恢复
const originalReceiptTableHTML = receiptTable.innerHTML;
// 注入自动打印的脚本到收据表格内容中
// 这个脚本会在新打开的Data URI页面中执行
receiptTable.innerHTML += ``;
const receiptSectionHTML = document.querySelector('.receipt-section').innerHTML;
const dataUri = 'data:text/html,' + encodeURIComponent(receiptSectionHTML);
window.open(dataUri, '_blank'); // 在新标签页中打开并触发打印
// 恢复原始HTML,移除注入的脚本,避免影响当前页面的DOM
// 这一步在window.open之后立即执行,不会影响新打开的Data URI页面
receiptTable.innerHTML = originalReceiptTableHTML;
}
const button = document.querySelector('.printButton');
button.addEventListener('click', printReceipt);