新闻中心
利用J*aScript和Data URI实现网页特定元素打印教程

本教程详细介绍了如何使用j*ascript将网页中的特定html元素(如收据)打印到pdf或纸张。通过将目标元素的html内容封装为data uri并在新窗口中打开,结合内联j*ascript触发自动打印,实现了一种高效且用户友好的局部内容打印解决方案,避免了复杂的内容隐藏与恢复操作。
在构建复杂的网页应用时,经常会遇到需要打印页面特定区域内容的需求,例如电商网站的订单收据、报告或证书。传统的做法可能涉及通过J*aScript动态隐藏或显示页面元素,但这通常会导致页面闪烁或复杂的DOM操作。本教程将介绍一种更为优雅且自动化的方法,利用Data URI和内联J*aScript实现特定元素的打印功能。
核心原理概述
本方案的核心在于以下几个关键技术点:
- Data URI (数据统一资源标识符):Data URI 允许我们将小型文件直接嵌入到HTML、CSS或J*aScript中,而无需外部链接。在这里,我们将待打印的HTML内容编码成一个Data URI,浏览器可以将其作为一个独立的HTML页面进行渲染。
- window.print() 方法:这是浏览器内置的打印功能,调用它会弹出操作系统的打印对话框,允许用户选择打印机或保存为PDF。
- 内联 J*aScript:为了实现自动打印,我们将在Data URI所承载的HTML内容中嵌入一段J*aScript代码,使其在新页面加载完成后自动调用 window.print()。
- 动态样式注入:为了确保打印内容的最佳呈现,我们可以在打印前动态注入额外的CSS样式,例如居中布局。
HTML 结构准备
首先,需要将你希望打印的特定内容(例如收据表格)封装在一个独立的容器元素中。这样做有助于J*aScript精确地获取其HTML内容。同时,为了打印时的样式一致性,建议将与该内容相关的CSS样式直接嵌入到该容器内部或其子元素中,以确保在新打开的打印页面中样式能够正确应用。
以下是一个收据表格的HTML结构示例,它被包裹在一个 section 标签内,并且其样式直接嵌入在表格中:
<section class="receipt-section">
<table class="receipt">
<style>
/* 收据表格的专用样式 */
.receipt {
border-collapse: collapse;
max-width: 80%;
font-family: sans-serif;
/* 初始样式,打印时可能需要调整 */
}
.receipt td {
padding: .5em;
}
.receipt tr:nth-child(even) {
border: 1px solid #333;
border-inline: none;
background: #ddd;
}
.receipt tr:nth-child(odd) {
background: #fff
}
.header-Uprice,
.item-Uprice,
.header-qty,
.item-qty {
text-align: center
}
.total {
border-bottom: 3px double #000
}
</style>
<tr class="table-headers">
<td class="header-id">#</td>
<td class="header-desc">Item Description</td>
<td class="header-Uprice">Unit Price</td>
<td class="header-qty">Qty</td>
<td class="header-price">Price</td>
</tr>
<tr class="item" id="1">
<td class="item-id">1</td>
<td class="item-desc">Dummy Item1</td>
<td class="item-Uprice">200$</td>
<td class="item-qty">1</td>
<td class="item-price">200$</td>
</tr>
<tr class="item" id="2">
<td class="item-id">2</td>
<td class="item-desc">Dummy Item2</td>
<td class="item-Uprice">75$</td>
<td class="item-qty">1</td>
<td class="item-price">75$</td>
</tr>
<tr class="item" id="3">
<td class="item-id">3</td>
<td class="item-desc">Dummy Item3</td>
<td class="item-Uprice">100$</td>
<td class="item-qty">2</td>
<td class="item-price">200$</td>
</tr>
<tr class="total">
<td>Total</td>
<td></td>
<td></td>
<td></td>
<td>475$</td>
</tr>
</table>
</section>J*aScript 实现步骤
接下来是实现打印功能的J*aScript代码。我们将创建一个函数,该函数在被调用时执行以下操作:
-
获取目标内容并注入打印逻辑 首先,获取包含收据的 table 元素。然后,向其内部动态注入一个 <script> 标签。这个脚本会在新页面加载完成后执行,首先应用一些额外的打印样式(例如居中),然后调用 window.print() 触发打印。</script>
function printReceipt() { const receiptTable = document.querySelector('.receipt'); // 动态注入用于打印居中的CSS样式,这里通过修改已有的style标签实现 // 注意:这里假设receiptTable内部有一个<style>标签,或者可以直接在receiptTable上添加style属性 const cssCenteringScript = ` const styleTag = document.querySelector('table.receipt > style'); if (styleTag) { styleTag.innerHTML += '.receipt { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; }'; } else { // 如果没有内联style标签,则创建一个并注入 const newStyle = document.createElement('style'); newStyle.innerHTML = '.receipt { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; }'; document.head.appendChild(newStyle); } `; // 注入自动打印的脚本到收据表格内容中 // 注意:这里将脚本直接添加到receiptTable的innerHTML,确保它在新页面中被执行 receiptTable.innerHTML += `<script>window.onload = () => { ${cssCenteringScript}; window.print(); }</script>`; // ... 后续步骤 } -
构建 Da
ta URI
在注入脚本后,获取包含整个 section 的完整HTML内容。然后,使用 encodeURIComponent 对这段HTML字符串进行编码,并前缀 data:text/html, 来构建Data URI。function printReceipt() { // ... (前面注入脚本的代码) ... const receiptSectionHTML = document.querySelector('.receipt-section').innerHTML; const dataUri = 'data:text/html,' + encodeURIComponent(receiptSectionHTML); // ... 后续步骤 } -
在新窗口中打开并触发打印 最后,使用 window.open() 方法在新标签页或新窗口中打开这个Data URI。由于Data URI中包含了自动打印的脚本,新页面加载后将立即弹出打印对话框。
function printReceipt() { const receiptTable = document.querySelector('.receipt'); const cssCenteringScript = ` const styleTag = document.querySelector('table.receipt > style'); if (styleTag) { styleTag.innerHTML += '.receipt { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; }'; } else { const newStyle = document.createElement('style'); newStyle.innerHTML = '.receipt { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); margin: 0; }'; document.head.appendChild(newStyle); } `; // 保存原始HTML,以便在注入后可以恢复 const originalReceiptTableHTML = receiptTable.innerHTML; receiptTable.innerHTML += `<script>window.onload = () => { ${cssCenteringScript}; window.print(); }</script>`; const receiptSectionHTML = document.querySelector('.receipt-section').innerHTML; const dataUri = 'data:text/html,' + encodeURIComponent(receiptSectionHTML); window.open(dataUri, '_blank'); // 在新标签页中打开并触发打印 // 打印完成后(或者立即),恢复原始HTML,移除注入的脚本 // 注意:由于是新窗口打开,这里立即恢复对当前页面DOM没有影响 receiptTable.innerHTML = originalReceiptTableHTML; }
完整代码示例
将上述步骤整合,并添加一个按钮来触发 printReceipt 函数:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>打印特定元素教程</title>
<style>
body {
font-family: sans-serif;
margin: 20px;
}
.printButton {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
margin-bottom: 20px;
}
/* 页面其他内容,确保它不会被打印 */
.other-content {
background-color: #f0f0f0;
padding: 20px;
border: 1px solid #ccc;
margin-top: 20px;
}
</style>
</head>
<body>
<h1>网页特定元素打印示例</h1>
<button class="printButton">打印收据</button>
<div class="other-content">
这是页面上的其他内容,不应被打印。
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/2401">
<img src="https://img.php.cn/upload/ai_manual/001/246/273/176378189624798.png" alt="察言观数AskTable">
</a>
<div class="aritcle_card_info">
<a href="/ai/2401">察言观数AskTable</a>
<p>企业级AI数据表格智能体平台</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="察言观数AskTable">
<span>78</span>
</div>
</div>
<a href="/ai/2401" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="察言观数AskTable">
</a>
</div>
</div>
<section class="receipt-section">
<table class="receipt">
<style>
/* 收据表格的专用样式 */
.receipt {
border-collapse: collapse;
max-width: 80%; /* 原始页面显示时的最大宽度 */
font-family: sans-serif;
width: 100%; /* 打印时通常希望宽度占满 */
}
.receipt td {
padding: .5em;
}
.receipt tr:nth-child(even) {
border: 1px solid #333;
border-inline: none;
background: #ddd;
}
.receipt tr:nth-child(odd) {
background: #fff
}
.header-Uprice,
.item-Uprice,
.header-qty,
.item-qty {
text-align: center
}
.total {
border-bottom: 3px double #000
}
</style>
<tr class="table-headers">
<td class="header-id">#</td>
<td class="header-desc">Item Description</td>
<td class="header-Uprice">Unit Price</td>
<td class="header-qty">Qty</td>
<td class="header-price">Price</td>
</tr>
<tr class="item" id="1">
<td class="item-id">1</td>
<td class="item-desc">Dummy Item1</td>
<td class="item-Uprice">200$</td>
<td class="item-qty">1</td>
<td class="item-price">200$</td>
</tr>
<tr class="item" id="2">
<td class="item-id">2</td>
<td class="item-desc">Dummy Item2</td>
<td class="item-Uprice">75$</td>
<td class="item-qty">1</td>
<td class="item-price">75$</td>
</tr>
<tr class="item" id="3">
<td class="item-id">3</td>
<td class="item-desc">Dummy Item3</td>
<td class="item-Uprice">100$</td>
<td class="item-qty">2</td>
<td class="item-price">200$</td>
</tr>
<tr class="total">
<td>Total</td>
<td></td>
<td></td>
<td></td>
<td>475$</td>
</tr>
</table>
</section>
<script>
function printReceipt() {
const receiptTable = document.querySelector('.receipt');
// 确保在获取innerHTML之前,将可能需要居中的样式注入到新页面的head中
// 这里的cssCenteringScript会作为字符串被注入到新页面的<script>中执行
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 += `<script>window.onload = () => { ${cssCenteringScript}; window.print(); };<\/script>`;
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);
</script>
</body>
</html>注意事项与优化
浏览器兼容性:window.open() 和 data: URI 在现代浏览器中普遍支持,但某些浏览器可能会有对Data URI长度的限制。对于非常大的HTML内容,这种方法可能不适用。
安全性:使用 window.open() 打开 data: URI 通常被认为是安全的,因为内容是本地生成的。然而,如果Data URI的内容来自不可信的第三方,则可能存在跨站脚本(XSS)风险。在本例中,内容来自当前页面DOM,因此风险较低。
-
打印样式控制 (@media print):对于更专业的打印布局,推荐使用CSS的 @media print 媒体查询。通过定义专门的打印样式表,可以精确控制打印时的页面布局、字体大小、隐藏非打印元素等,而无需J*aScript的动态注入。例如:
/* style.css */ /* 默认屏幕样式 */ .receipt-section { display: block; } .print-button { display: block; } @media print { /* 打印时隐藏所有非收据内容 */ body > *:not(.receipt-section) { display: none; } /* 让收据居中 */ .receipt-section { width: 100%; margin: auto; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } /* 确保收据表格宽度占满 */ .receipt { width: 100%; max-width: none; /* 移除屏幕样式中的最大宽度限制 */ } }然后,J*aScript只需调用 window.print() 即可,无需构建Data URI和注入脚本。这种方法通常更健壮和易于维护。本教程介绍的方法是应对特定场景(如需要完全隔离打印内容)的一种灵活变通方案。
用户体验:window.open() 可能会被浏览器的弹窗拦截器阻止,尤其是在用户没有明确交互(如点击按钮)的情况下。确保用户行为触发此函数可以避免此问题。
总结
通过将特定HTML内容封装为Data URI,并巧妙地利用内联J*aScript在新页面加载时触发 window.print(),我们可以实现一种高效且用户友好的局部内容打印解决方案。虽然这种方法在某些方面可能略显“非传统”,但它提供了一种无需复杂DOM操作即可实现局部打印的有效途径。在实际项目中,开发者应根据具体需求权衡其与更标准的 @media print 方案的优劣,选择最适合的实现方式。
以上就是利用J*aScript和Data URI实现网页特定元素打印教程的详细内容,更多请关注其它相关文章!
# javascript
# 网络推广seo怎么做
# 金牛区响应式网站建设
# 禹州短视频推广招聘网站
# 弹出
# 样式表
# 会在
# 单选框
# 移除
# 加载
# 这是
# 新页面
# 表单
# css样式
# css
# java
# html
# 操作系统
# 编码
# 浏览器
# app
# 打印机
# pdf
# win
# h
# 东莞如何学网站建设开发
# 绥化抖音seo代理
# 西藏英文网站推广
# 优化网站四大因素
# 合肥抖音营销推广软件
# 廊坊网站推广哪家专业
# 武威小胡子大神SEO
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
抖音未来赚钱的新趋势 2025年值得关注的变现风口分析
uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验
抓大鹅无需下载版 抓大鹅秒玩版入口
Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
新手怎么开始学化妆 零基础化妆入门教程
漫蛙MANWA漫画主页官方入口 漫蛙漫画最新在线阅读地址
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
零跑汽车11月交付量达70327台 实现连续9个月正增长
极兔快递快件信息查询系统 极兔快递官网运单号追踪
Bing引擎入口最新2025 Bing搜索免费官方登录
《刺客信条:影》PS5 Pro和Switch 2画面对比
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
zookeeper 都有哪些功能?
如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略
J*a里如何使用forEach遍历Map_Map遍历方法说明
必由学在线入口 必由学网页版快速登录入口
铃兰之剑为这和平的世界希里技能组及加点推荐
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
限制HTML日期输入框的日期选择范围
Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注
“在文档元素之后找到了标记”是什么错误? 检查并修复XML中多个根元素的3个方法
Go调试环境为何无法启动_Go调试器启动失败原因与解决策略
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
LINUX的I/O重定向是什么_深入理解LINUX中 >、>> 与 < 的区别
Go语言中的*string:深入理解字符串指针
免费抖音短视频入口_抖音网页版短视频免费通道
html5 app怎么运行环境_配html5 app运行环境【教程】
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
126邮箱账号注册 电脑版登录入口
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
实现全屏滚动与导航点:专业教程
c++如何实现一个简单的ECS框架_c++数据驱动设计与游戏开发
J*aScript中高效管理与清空动态列表:避免循环陷阱
Go RPC HTTP服务正确实现与常见陷阱解析
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
React Hooks最佳实践:动态组件状态管理的组件化方案
蛙漫官方正版入口 蛙漫网页在线全集免费观看
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧
Python中高效访问嵌套字典与列表中的键值对
C++如何解决segmentation fault_C++段错误调试与原因分析


2025-10-16
浏览次数:次
返回列表
ta URI
在注入脚本后,获取包含整个 section 的完整HTML内容。然后,使用 encodeURIComponent 对这段HTML字符串进行编码,并前缀 data:text/html, 来构建Data URI。