js打印方式,window.print()

本文详细介绍如何使用JavaScript进行网页打印,包括全页打印的页眉页脚去除、页面方向及大小设置,以及如何打印特定div区域和iframe内容。针对打印超宽内容和跨域打印的问题也提供了实用解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

页面打印的相关问题。

1.使用js自带的打印方式,window.print()方式进行打印。

去除页眉页脚,设置横向纵向或者A3等,在style上增加@page样式。

<style>
    @page {
        size:auto;
        margin: 0mm;
    }
</style>

size:landscape(横向)或者size:A3(A3) .

 

2.打印指定区域的div内容,使用printarea插件

引入js:

<script language="javascript" src="jquery-1.7.1.min.js"></script> 
<script type="text/javascript" src="jquery.PrintArea.js"></script>

html引用:

<div class="my_show"> 
这个是打印时显示的。 
</div> 
<div class="my_hidden"> 
这个是打印时隐藏的。 
</div> 
<input type="button" id="print"/>

js调用:

$(document).ready(function(){ 
    $("#print").click(function(){ 
        $(".my_show").printArea(); 
    }); 
});

此方式,在页面宽度足够宽时,打印依然会超出页面。

 

3.打印iframe的内容

<input type="button" value="打印此页面" onclick="printpage()" />
<div style="height:800px;width:800px;">
    <iframe style="height:100%;width:100%;" src="https://www.runoob.com" id="test"/>
</div>

js方法:

function printpage(){
	var iframe = document.getElementById('test');
    iframe.contentWindow.focus();//获取焦点
    iframe.contentWindow.print();
}

这种情况,在跨域的情况下,并不能实现跨域打印,跨域情况将打印功能加载子页面

可以通过url方式,增加isPrint=1参数,当进入子页面时进行判断,判断该参数,值是否为1直接进行打印操作。同样增加子页面增加打印按钮也能实现打印功能。

if(window.location.href.indexOf('isPdfPrint=1')>0){
    setTimeout(function(){
        window.print();
    },200)
}

 

<think>好的,我现在需要帮助用户解决两个问题:一是使用window.print时按钮显示为[object HTMLButtonElement],二是如何实现多张打印功能。首先,我得回顾用户提供的引用内容和之前的对话,看看有没有相关的线索。 用户提到在之前的回答中,按钮显示为对象的问题是因为直接传递了DOM元素而没有正确添加到文档中。用户现在引用了三个外部引用,可能想结合这些方法来解决当前的问题。 首先,关于按钮显示为对象的问题,用户之前的回答已经指出,必须通过DOM方法HTML字符串来正确添加按钮。用户现在提供的引用1中使用了innerHTML来获取打印内容,而引用2和3提到了使用window.print以及@media print样式。可能需要确保按钮在打印时不被隐藏,或者在生成打印内容时正确渲染按钮。 第二个问题是如何实现多张打印。用户可能想一次打印多个页面或内容。引用2中提到了替换document.body.innerHTML方法,但这种方法可能会导致问题,比如空白页。需要找到更可靠的方式,比如为每个打印内容生成独立的iframe或窗口,或者使用CSS分页控制。 接下来需要结合用户提供的引用内容。引用1中的printHtml函数可能是一个封装好的打印工具,用户希望利用这个工具来处理多张打印。引用3提到了@media print样式,可以隐藏不需要打印的元素,比如按钮本身可能在打印时需要隐藏,但用户的问题中按钮是在打印预览中显示为对象,这可能涉及到如何正确地在打印内容中包含按钮。 可能的问题根源是,当用户动态创建按钮并直接将其添加到document.write中,导致按钮对象被转换为字符串。解决方法应该是使用正确的DOM操作方法,比如appendChild,或者生成完整的HTML字符串。 对于多张打印功能,可能需要循环处理多个内容块,依次调用打印方法,或者在打印前将所有内容合并到一个容器中,并使用CSS分页(如page-break-before或page-break-after)来控制分页。 现在需要验证这些思路是否正确。比如,用户引用2中的代码替换了body的innerHTML,这可能会导致DOM结构破坏,尤其是在处理多个内容块时。正确的做法可能是创建一个隐藏的iframe,将内容注入其中,然后打印该iframe的内容,这样可以避免影响主页面。 此外,用户引用3中的@media print样式可以用来隐藏不需要打印的元素,比如操作按钮本身应该在打印时隐藏,避免出现在打印结果中。需要确保在生成打印内容时,按钮的显示状态正确。 综合所有信息,解决方案可能包括以下步骤: 1. 正确生成按钮:使用DOM方法创建按钮并添加到打印容器中,或者生成包含按钮HTML的字符串。 2. 处理多张打印:使用CSS分页控制或分多次调用打印函数,每次处理不同的内容块。 3. 使用iframe或新窗口来隔离打印内容,避免影响主页面DOM。 4. 应用@media print样式,隐藏不必要的元素,确保打印内容正确。 需要检查用户提供的代码示例,发现用户直接将按钮对象写入document.write,导致字符串转换问题。应改为使用appendChild或生成HTML字符串。同时,在实现多张打印时,可能需要将多个内容块合并,并添加分页样式,或者依次打印每个内容块。 最后,确保回答中引用相关引用内容,如引用1中的printHtml方法可能适用于多张打印,而引用3中的@media print样式可以帮助控制打印内容的显示。</think>### 分步解决 `[object HTMLButtonElement]` 和多张打印问题 --- #### **问题 1:按钮显示为 `[object HTMLButtonElement]`** **原因分析** 当通过 `document.write()` 直接插入 DOM 对象时,JavaScript 会隐式调用 `toString()` 方法,导致输出对象类型标识而非实际按钮元素。需改用 DOM 操作或 HTML 字符串生成。 --- #### **解决方案** ##### **方法 1:使用 HTML 字符串生成按钮** ```javascript // 正确示例:生成完整的 HTML 字符串 const newWindow = window.open(); newWindow.document.write(` <button onclick="window.print()">打印</button> <div id="content1">第一页内容</div> `); ``` ##### **方法 2:通过 DOM API 动态创建按钮** ```javascript const newWindow = window.open(); const btn = newWindow.document.createElement('button'); btn.textContent = '打印'; btn.onclick = () => newWindow.print(); newWindow.document.body.appendChild(btn); // 显式添加到文档 ``` --- #### **问题 2:实现多张打印功能** **需求场景** 需要分页打印多个独立内容(如订单、报告),每页内容独立排版且不互相干扰。 --- #### **解决方案** ##### **方案 1:CSS 分页控制(推荐)** 通过 `@media print` 和 `page-break` 控制分页: ```html <style> @media print { .page { page-break-after: always; /* 强制分页 */ } } </style> <div class="page">第一页内容</div> <div class="page">第二页内容</div> ``` ```javascript window.print(); // 一次打印所有分页内容 ``` ##### **方案 2:循环打印多张内容** 若需逐个打印不同内容块: ```javascript const contents = ['content1', 'content2']; contents.forEach(id => { const printContent = document.getElementById(id).innerHTML; const iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.appendChild(iframe); iframe.contentDocument.write(printContent); iframe.contentWindow.print(); document.body.removeChild(iframe); }); ``` ##### **方案 3:利用第三方库(如引用[1]中的 `printHtml`)** 若已有封装好的打印工具: ```javascript import printHtml from "@/utils/print.js"; // 合并多张内容(添加分页样式) const multiContent = ` <div style="page-break-after: always">第一页</div> <div>第二页</div> `; printHtml(multiContent); ``` --- #### **完整示例代码** ```javascript // 打开新窗口并添加多页内容 const newWindow = window.open(); newWindow.document.write(` <style> @media print { .page { page-break-after: always; } .noprint { display: none; } } </style> <div class="page">第一页内容</div> <div class="page">第二页内容</div> <button class="noprint" onclick="window.print()">打印全部</button> `); // 或通过 DOM 操作添加按钮 const btn = newWindow.document.createElement('button'); btn.className = 'noprint'; btn.textContent = '打印'; btn.onclick = () => newWindow.print(); newWindow.document.body.appendChild(btn); ``` --- ### **关键注意事项** 1. **分页控制** - 使用 `page-break-after: always` 或 `page-break-before: always` 强制分页[^3]。 - 避免在分页元素中使用浮动或定位布局。 2. **隐藏非打印元素** - 通过 `@media print { .noprint { display: none; } }` 隐藏操作按钮[^3]。 3. **防拦截策略** - `window.open()` 需由用户触发(如点击事件),否则可能被浏览器拦截[^2]。 --- ### 相关问题 1. 如何通过 CSS 控制打印页面的页眉页脚? 2. `window.print()` 如何实现静默打印(无需用户确认)? 3. 打印时图片模糊或样式丢失如何解决?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值