window.print网页打印——打印htmlbody的实际高度,而不是看到的内容

article/2025/10/7 8:13:20

文章目录

    • 文章参考
    • 问题描述
    • 使用chrome保存图片功能——验证问题3
      • 测试代码
      • 测试结果
      • 测试结论
    • 使用浏览器打印功能为pdf
      • 打印的API
      • 通用JS代码——将网页总具体的某段保存为pdf
      • 天坑——为什么我打印的时候只显示当前页
      • 禁止页面打印
    • 样式在class中,如何获取DOM的样式?
      • ele.style
      • getComputedStyle()

文章参考

  1. 原生js获取元素样式的简单方法

问题描述

  1. 工作中,想把网页中某段内容保存图片
  2. 想保存的这部分内容在网页中的某个div中,并且出现了滚动条,(不是窗口出现滚动条,是某个div有滚动条)
  3. 第一想法是使用chrome的保存图片的命令功能 —— 保存全屏、某个节点、当前可视区域三个功能,但是测试没有成功(这个功能只是针对显示在html节点的内容,因为节点高度固定,所以保存的图片就是我们看到的部分)
  4. 想到“网页打印功能”,将打印的内容保存为Pdf,还方便查找

使用chrome保存图片功能——验证问题3

测试代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div style="height: 200px;width: 200px;overflow: auto;"><div>dddddddd</div><div>dddddddd</div><div>此处省略一万行代码</div></div>
</body>
</html>

测试结果

保存固定高度节点为图片的内容,如图
在这里插入图片描述

测试结论

这个功能只是针对显示在html节点的内容,因为节点高度固定,所以保存的图片就是我们看到的部分

使用浏览器打印功能为pdf

打印的API

  1. window.print()
  2. document.execCommand('print')

上面两种API 作用是一样的

通用JS代码——将网页总具体的某段保存为pdf

(function dayin(queryStr) {// 防止页面设置了禁止打印的功能var style=document.createElement("style");style.innerText = "@media print{body{display:block!important;}}"document.getElementsByTagName("html")[0].append(style)var userAgent = navigator.userAgent.toLowerCase() // 取得浏览器的userAgent字符串if (userAgent.indexOf('trident') > -1) {alert('请使用google或者360浏览器打印')return false} else if (userAgent.indexOf('msie') > -1) {alert('请使用google或者360浏览器打印')return false} else {// 其它浏览器使用lodop// var oldstr = window.document.body.outerHTMLvar printData = window.document.querySelector(queryStr).outerHTML // 获得 div 里的所有 html 数据,因为只有样式没有事件// window.document.body.innerHTML = printDataconst htmlObj = window.document.getElementsByTagName('html')[0]const bodyObj = window.document.getElementsByTagName('body')[0]// 缓存body、html的高度const beforeBodyHeightStyle = getComputedStyle(bodyObj).heightconst beforeHtmlHeightStyle = getComputedStyle(htmlObj).height// 缓存body、html是否隐藏起来了const beforeBodyOverflowStyle = getComputedStyle(bodyObj).overflowconst beforeHtmlOverflowStyle = getComputedStyle(htmlObj).overflowconsole.log(beforeBodyOverflowStyle)// 防止 html 和 Body都设置了高度为100%,因为实际要打印的高度是所有内容,大于浏览器的高度100%的,而我们查看的内容和显示的内容都是浏览器的高度,并且有滚动条,这样就让我们有错觉,// 我们打印的内容是html的高度的内容,不是100%,有可能是小于100%,也可能大于100%的htmlObj.style.height = 'auto'bodyObj.style.height = 'auto'// 判断body是否隐藏不显示滚动条if (beforeBodyOverflowStyle === 'hidden') {bodyObj.style.overflow = 'auto'}if (beforeHtmlOverflowStyle === 'hidden') {htmlObj.style.overflow = 'auto'}//var targetDiv = document.createElement('div')const targetId = Math.floor(Math.random() * 10000000000000000)targetDiv.id = targetIdtargetDiv.innerHTML = printData // 将 HTML 代码作为字符串重新拷贝到 创建的div 中// document.getElementById('app').style.display = 'none'var docfrag = document.createDocumentFragment() // 创建一个fragment 对象// 将 body 下面的所有非 link 和 script 标签的全部都移动到 创建的 fragment 对象中for (let i = 0; i < bodyObj.childNodes.length; i++) {var node = bodyObj.childNodes[i]// 过滤 text 节点、script 节点if (node.nodeType === 1 &&node.nodeName !== 'LINK' &&node.nodeName !== 'SCRIPT') {console.log(node.nodeName)// 如果参数节点是 DOM 已经存在的节点,appendChild方法会将其从原来的位置,移动到新位置。docfrag.appendChild(node)}}bodyObj.append(targetDiv)// window.print()// 等价于window.document.execCommand('print')htmlObj.style.height = beforeHtmlHeightStylebodyObj.style.height = beforeBodyHeightStyleif (beforeBodyOverflowStyle === 'hidden') {bodyObj.style.overflow = 'hidden'}if (beforeHtmlOverflowStyle === 'hidden') {htmlObj.style.overflow = 'hidden'}// 打印结束后,放开隐藏内容targetDiv.remove()var children = docfrag.childNodes // NodeList 接口console.log(children instanceof NodeList)children.forEach((node, i, list) => {console.log(node, i, list)})bodyObj.appendChild(docfrag)}})("article.article");

打印的思路

  1. 将节点的代码缓存起来
  2. 将body内部的 非 LINK 和 非SCRIPT 节点 缓存起来,放到 新建的 fragment 节点中
  3. 将需要打印的代码创建为 一个DIV 节点,挂在 body 节点下面
  4. 检测是否固定了html和body的高度
  5. 检测是否将html和body设置了overflow:hidden
  6. 打印完成或者取消打印,将创建的打印节点删除,然后将新建的fragment 下的节点重新返回挂载到 body 节点下面

天坑——为什么我打印的时候只显示当前页

上面的代码我做了注释,再重复说明一下,下面的情况是我遇到的一种情况,具体情况具体分析

  1. 防止 html 和 Body都设置了高度为100%,因为实际要打印的高度是所有内容,大于浏览器的高度100%的,
  2. 而我们查看的内容和显示的内容都是浏览器的高度,并且有滚动条,这样就让我们有错觉,
  3. 结论:
    我们打印的内容是html的实际高度的内容,不是100%,有可能是小于100%,也可能大于100%的

禁止页面打印

@media print{body{display:none!important;}
}

样式在class中,如何获取DOM的样式?

问题描述:
在学习DOM的时候就看到通过ele.style来获取元素样式值,但是有时候获取的并非是节点的样式值,而是空值。

ele.style

a. 这是因为ele.style只能获取写在元素标签中的style属性里的样式值,
b. 无法获取到定义在<style></style>和通过<link href="css.css">加载进来的样式属性

var test = document.getElementById("test");
//获取节点的color
test.style.color;

getComputedStyle()

getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。
window.getComputedStyle("元素", "伪类");


http://chatgpt.dhexx.cn/article/P0i5DUws.shtml

相关文章

页码在html中怎么设置,如何设置网页打印的网址、日期、页码等?

2005-12-22 怎样更改网页打印时的外观? 在“文件”菜单上&#xff0c;单击“页面设置”。 在“页边距”框中&#xff0c;键入页边距(以英寸为单位)。 在“方向”下面&#xff0c;单击“纵向”或“横向”&#xff0c;指定要纵向还是横向打印页面。 在“页眉”和“页脚”框中&am…

ASP.NET网页打印

昨晚朋友要求在前段时间完成的新闻的网站上加上一个功能&#xff0c;就是在每篇新闻浏览的页面&#xff0c; 加一个打印铵钮。让用户一点打印&#xff0c;能把整篇文章打印。一开始Insus.NET建议朋友&#xff0c;叫用户使用IE浏览器的打印功能&#xff0c;但是朋友说&#xff0…

网页打印怎样去掉网址

在打印设置里面去掉一个页眉和页脚前的勾就可以了

网页打印与导出word实现在A4纸上相同效果

在工作中遇到这样一个需求&#xff0c;客户要求&#xff1a; 1、实现在浏览器中打印和导出到word中&#xff0c;要求浏览器打印出来的效果和word中打印的效果基本一致。2、打印的内容要自动分页&#xff0c;第一页的顶部有文件头&#xff0c;最后一页的底部有页尾。 这里记录…

网页打印文档,不弹出浏览器打印对话框设计思路

一、需求 客户提出一个功能&#xff0c;在浏览器上点击打印按钮&#xff0c;不弹出浏览器的打印对话框&#xff0c;让打印机直接打印所需内容。 二、过程 在接收到该需求后&#xff0c;就去查询相关资料&#xff0c;查询到一个解决方案&#xff0c;使用ie插件&#xff0c;由于…

网页打印表格

如标题所说就是调用网页打印器来打印表格&#xff0c;先说以下具体实现步骤&#xff1a; 将数据查询出来&#xff08;因为网页的打印器是打印的当前网页的内容&#xff0c;所以需要新建一个页面专门用来打印数据用&#xff09; 查询出来的数据保存到请求中&#xff0c;在把请求…

页面打印不全怎么办html css,win7打印网页显示不全怎么办|win7设置网页打印页面的方法...

‍‍ 有很多win7 32位系统的用户反馈&#xff0c;在使用浏览器的网页打印功能时&#xff0c;发现打印出来的网页显示不全&#xff0c;内容超出了纸张&#xff0c;遇到win7打印网页显示不全怎么办呢&#xff1f;出现打印网页显示不全很有可能是网页打印页面设置出了问题&#xf…

Javascript网页打印大全

目录 普通打印&#xff08;整页打&#xff09;打印去掉/添加页眉页脚 使用外部控件/方法实现多功能打印 打印背景 普通打印&#xff08;整页打&#xff09; window.print(); 打印网页内部分内容&#xff08;自定义&#xff09; 用css控制 media print .a {display:block}…

java.util. 什么意思_java.util中,util是什么意义

展开全部 1. util包的框架 常用的集合类主要636f70793231313335323631343130323136353331333431343630实现两个“super接口”而来&#xff1a;Collection和Map。 1.1 Collection有两个子接口&#xff1a;List和Set List特点是元素有序&#xff0c;且可重复。实现的常用集合类有…

Java.util包简单总结

之前听一位老师讲过&#xff0c;学Java的程序员&#xff0c;lang包和util包至少是要过一遍的。 很惭愧的是&#xff0c;从入门到现在&#xff0c;我还没完整的探究过这两个基础包。 今天借着跟公司小伙伴分享的机会&#xff0c;把util包简单的梳理一遍。由于最近加班很多&…

mysql-Util

将13位的时间戳字符串转换为4位的年的字符串 FROM_UNIXTIME(CONVERT(UPLOAD_TIME/1000 , signed),"%Y") 年结果&#xff1a; 将10位的时间戳字符串转换为4位的年的字符串 FROM_UNIXTIME(CONVERT(UPLOAD_TIME , signed),"%Y") 年结果&#xff1a; 根据A…

Util类简单介绍

集合简单介绍 一. Set集合 1.不包含重复元素、无序的元素集合 且存和取顺序不一致 无索引 2.Set集合的实现类有HashSet和LinkedHashSet Set接口继承于Collection接口 3.Set集合中没有get()方法 只有add(Element e)方法 没有add(key,Element)方法 4. 如&#xff1a;HashSet mySe…

史上最全总结!Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和区别分析

文章目录 前言工具类层Util 数据层POJO对象domainentitymodelviewDTO总结 数据访问层DAOmapper 业务层service 控制层Controller 前言 做开发项目时&#xff0c;总会遇到这些包&#xff0c;理清他们的层次&#xff0c;非常有助于我们对于项目的理解和建立。 现阶段CSDN上貌似…

vivado case_【vivado(3)】序列检测/状态机

手机上不好看可用电脑看 (1)首先建立一个工程名叫seq_det: 详细步骤可查看: 【vivado(1)】vivado软件的简单使用 【vivado(2)】计数器/testbench仿真 (2)建立一个design source如下所示: 右击design source, 选择add or create design source, 然后next 选择create file, …

vivado dcp生成

dcp与edif (write_edif命令生成) 比较&#xff1a; dcp主要有两个优点&#xff1a;第一个不需要手动生成stub文件&#xff0c;dcp是一个 压缩包里面包含所有文件。 第二个不需要xdc&#xff0c;尤其对于使用ip的设计。同时还可以使用加密功能。 不同阶段产生的dcp也不相同&a…

vivado ip打包归档

一般来说&#xff0c;要保存vivado工程使用的ip只需要xci文档即可。 但xci文档不仅仅是包含对应ip的配置信息&#xff0c;同样记录了一些path路径&#xff0c;以及ip核的属性&#xff08;core container/ooc等&#xff09; 使能core container后,将会以xcix方式保存ip核信息&…

Vivado驱动安装

一、卸载 二、打开Vivado 1 、 2 、 3、 4、 确认即可 5、安装证书 6、安装驱动 三、更新驱动程序

vivado2020.2导入原工程IP

vivado2020.2导入原工程IP 将原工程IP导入新工程中在新工程中添加每个IP的xci文件 将原工程IP导入新工程中 vivado 2022.2的IP在当前工程中.srcs中IP目录中&#xff0c;如下图&#xff1a; 将所需要转移的IP将完整的文件夹复制到新工程同样的目录中。 在新工程中添加每个IP的…

vivado 配置matlab,Matlab vivado

FPGA很多时候是用来做信号处理&#xff0c;而做信号处理都离不开Matlab。如通信中的调制解调、纠错码、各类编解码&#xff0c;这些都离不开Matlab&#xff0c;因为Matlab中simulink有非常丰富的库&#xff0c;方便客户建模和仿真。 以前modelsim 通过simulinx建模后&#xff0…

vivado使用方法

一、新建工程 首先打开vivado2017.4 点击create project 点击next 为新建的工程起名字&#xff0c;路径和名字都不要有中文 起好名字后点击next 起好名字后点击next 选择RTL project&#xff0c;勾选do not specify sources at this time,表示以后再配置资源文件 选…