MHTML文件如何在前端页面展示

MHTML文件如何在前端页面展示

需求背景:

目前在给证券公司做项目,但是在使用新系统的过程中,甲方还希望之前之前系统的历史记录可以看到。

最初制定的计划是项目组里面做数据的把原系统页面爬取下来,转成图片,直接给到前端即可。但是产品建议说把整个页面的html爬下来再展示更好,但是在爬取html的过程中出现了若干问题,总之最后做数据的把之前的历史记录爬成MHTML格式的给了后端,我在请求的时候后端把MHTML格式文件内容以字符串格式全部给到前端。

技术背景:

1. MHTML和HTML

特性HTMLMHTML
文件格式纯文本文件,扩展名为.html.htm单一文件,扩展名为.mht.mhtml
资源处理外部资源通过链接引用所有资源(如图片、CSS、JS)嵌入文件中
用途用于创建和展示网页用于保存完整网页,适合离线浏览
兼容性所有浏览器均支持部分浏览器支持(如IE、Edge)
文件大小较小,因资源未嵌入较大,因包含所有资源
离线支持需要外部资源在线访问支持离线浏览,资源已嵌入
分享与保存需附带外部资源单一文件,便于分享和保存
总结:
  • HTML:适合在线浏览,依赖外部资源。
  • MHTML:适合保存完整网页,便于离线使用和分享。

2. mhtml2html

​ 需要了解这个库的使用方式,其官网地址如下:mhtml2html - npm

3. 为什么需要 .window.document

原因 1:模拟浏览器环境
  • mhtml2html 的设计可能是为了在 Node.js 或浏览器中模拟一个独立的浏览器环境(类似 jsdomiframe),以正确解析 MHTML 文件的资源(如 CSS、图片、脚本等)。
  • 在这种情况下,生成的 convertedHTML 对象会包含一个完整的 window 对象,其内部才有 documentdocumentElement
原因 2:隔离文档作用域
  • MHTML 文件可能包含独立的 HTML、CSS 和 JavaScript 代码,需要在一个隔离的环境中运行,避免污染当前页面的全局作用域。
  • 通过将文档封装在 window 对象中,mhtml2html 实现了这种隔离。

4. innerHTML和outerHTML

特性innerHTMLouterHTML
定义获取或设置元素内部的 HTML 内容(不包含该元素本身)获取或设置整个元素的 HTML,包括该元素自身及其所有子元素
返回内容返回元素内部的 HTML 字符串返回包含当前元素标签及其内部 HTML 的完整字符串
修改行为赋值后仅会替换元素内部的内容,不会改变元素自身赋值后会替换整个元素(即当前元素及其所有子元素都会被更新或移除)
常见用途用于更新或操作元素内部的内容,例如动态加载文本或子节点用于替换、删除整个元素,或将元素及其内容导出为 HTML 字符串
注意事项修改后元素本身的标签和属性保持不变,仅子节点内容发生变化修改后原来的 DOM 引用可能失效,因为整个元素可能已经被新元素替换

解决思路:

1. 使用iframe展示内容
1. 首先,你可能需要一个库来解析MHTML文件。可以使用`mhtml2html`库来将MHTML转换为HTML。
2. **Blob**: 用于创建一个包含HTML内容的Blob对象。
3. **URL.createObjectURL**: 生成一个临时的URL,用于在`iframe`中加载HTML内容。

核心代码示例:

<template><div><!-- 使用 iframe 展示 MHTML 内容 --><iframe :src="iframeSrc" width="100%" height="500px"></iframe></div>
</template><script>
import { ref, onMounted } from "vue";
import mhtml2html from "mhtml2html";export default {setup() {const iframeSrc = ref(""); // 用于存储 iframe 的 src// 加载并解析 MHTML 文件const loadMHTML = async () => {try {// 假设你有一个 MHTML 文件的 URLconst mhtmlUrl = "/path/to/your/file.mhtml";// 获取 MHTML 文件内容const response = await fetch(mhtmlUrl);const mhtmlContent = await response.text();// parse解析:将 MHTML 字符串解析为对象const parsedMHTML = mhtml2html.parse(mhtmlContent);// convert, 将 解析出的 MHTML 对象转译成含有资源的 HTMLconst convertedHTML = mhtml2html.convert(parsedMHTML);if (!convertedHTML?.window.document?.documentElement) {throw new Error("HTML转换失败,未找到可用的 documentElement");}// 注意:mhtml2html.convert 返回的是一个模拟的浏览器环境,其文档对象 (document) 必须通过 .window 访问。这种设计是为了隔离 MHTML 文件的内容,确保资源解析和样式作用域的正确性。直接使用 convertedHTML.document 会失败,因为 document 并未直接暴露在返回值顶层。const htmlContent =convertedHTML.window.document.documentElement.outerHTML;loadingText.value = "解析成功,开始展示";// 创建 Blob URLconst blob = new Blob([htmlContent], { type: "text/html" });iframeSrc.value = URL.createObjectURL(blob);} catch (error) {console.error("Failed to load MHTML file:", error);}};// 在组件挂载时加载 MHTML 文件onMounted(() => {loadMHTML();});// 在组件销毁时清理 Blob URLonBeforeUnmount(() => {if (iframeSrc.value) {URL.revokeObjectURL(iframeSrc.value);}});return {iframeSrc,};},
};
</script><style scoped>
iframe {border: 1px solid #ccc;
}
</style>
2. 使用v-html展示内容

​ 本来想将解析出来的html文本内容直接通过v-html展示,但是实际展示却是html字符串,所以不推荐使用这种方式。

总结:

实际上这个功能不算复杂,但是对于一些基础的前端知识先需要了解,否则会踩坑,有较长的试错时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException

解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 目录 解决Spring Boot中MySQL数据库报错“Bad SQL Grammar”的问题 问题描述解决步骤解决方案结论附&#xff1a;MySql常用配置参数及使用场景 在使用Spring Boot连接MySQL数据库时&#xff0c;有时候会遇到“B…

【AI日记】25.02.08

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 探索 AI 应用探索周二有个面试&#xff0c;明后天打算好好准备一下&#xff0c;我打算主要研究下 AI 如何在该行业赋能和应用&#xff0c;以及该行业未来的发展前景和公司痛点&#…

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图&#xff0c;清晰易懂形象直观&#xff0c;记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》&#xff0c; 文章链接&#xff1a;https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…

零基础都可以本地部署Deepseek R1

文章目录 一、硬件配置需求二、详细部署步骤1. 安装 Ollama 工具2. 部署 DeepSeek-R1 模型3. API使用4. 配置图形化交互界面&#xff08;可选&#xff09;5. 使用与注意事项 一、硬件配置需求 不同版本的 DeepSeek-R1 模型参数量不同&#xff0c;对硬件资源的要求也不尽相同。…

索引失效的场景

chatGpt 7. 使用 DISTINCT 或 GROUP BY 当查询中涉及 DISTINCT 或 GROUP BY 时&#xff0c;如果查询没有合适的索引支持&#xff0c;可能会导致性能问题&#xff0c;虽然不完全是索引失效&#xff0c;但会影响查询效率。 sql SELECT DISTINCT department_id FROM employees;…

Node.js中http模块(二)

一、http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer0) 方法&#xff0c;就能方便的把一台普通的电脑&#xff0c;变成一台 Web 服务器&#xff0c;从而对外提供 Web 资源服务。 二、域名和域名服务器 尽管 I…

Dockerfile 文件详解

在平常的开发工作中&#xff0c;我们经常需要部署项目&#xff0c;一个项目开发完成后&#xff0c;使用 Docker 方式部署&#xff0c;那么首先得构造镜像&#xff0c;构造镜像最主要的就是 Dockerfile 文件的编写&#xff0c;今天简单来总结下 Dockerfile 文件的编写以及有哪些…

Git提交错误解决:missing Change-Id in message footer

问题现象&#xff1a; 提交的commit中没有插入change id导致push代码失败。 问题解决&#xff1a; 针对该错误&#xff0c;Git已经给出了解决方案&#xff1a; 1、to automatically insert a Change-Id, install the hook: gitdir$(git rev-parse --git-dir); scp -p -P 2…

第四十一章:沪上逐梦:适应新环境的挑战

2022 年底&#xff0c;凛冽的寒风裹挟着岁末的清冷&#xff0c;毫无保留地席卷了整个华夏大地。上海&#xff0c;这座屹立在东方的繁华都市&#xff0c;在这冰寒彻骨的冬日里&#xff0c;愈发显得冷峻而深沉。小冷怀揣着对新工作的满心期待&#xff0c;以及对未来的无限憧憬&am…

多租户架构设计与实现:基于 PostgreSQL 和 Node.js

多租户架构设计与实现:基于 PostgreSQL 和 Node.js 引言 多租户架构(Multi-tenancy)是现代 SaaS(Software as a Service)应用的核心设计模式之一。它允许多个租户共享同一套应用实例,同时确保数据隔离和安全性。本文将详细介绍多租户架构的设计方案,并基于 PostgreSQL…

顺丰java面试题_顺丰java开发面试分享,顺丰java面试经面试题

今天要给大家分享的是一个小伙伴的顺丰java开发面试过程&#xff0c;其中包括了面试流程&#xff0c;面试题目&#xff0c;和回答&#xff0c;感兴趣的朋友可以来了解一下哈。 一、面试流程 是中午进行的面试&#xff0c;首先是做自我介绍&#xff0c;之后就是讲一下项目&…

天津三石峰科技——汽车生产厂的设备振动检测项目案例

汽车产线有很多传动设备需要长期在线运行&#xff0c;会出现老化、疲劳、磨损等 问题&#xff0c;为了避免意外停机造成损失&#xff0c;需要加装一些健康监测设备&#xff0c;监测设备运 行状态。天津三石峰科技采用 12 通道振动信号采集卡&#xff08;下图 1&#xff09;对…

SpringBoot教程(十四) SpringBoot之集成Redis

SpringBoot教程&#xff08;十四&#xff09; | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 &#xff08;举例讲解&#xff09;2.4 项目中使用之工具类封装 &#xff08;正式用这个&#xff09;2.5 序列化 &…

多智能体协作架构模式:驱动传统公司向AI智能公司转型

前言 在数字化浪潮的席卷下&#xff0c;传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈&#xff0c;客户需求的快速变化以及业务复杂度的不断攀升&#xff0c;传统公司在缺乏 AI 技术支撑的情况下&#xff0c;暴露出诸多痛点。在决策层面&#xff0c;由于…

rBits.exe服务备份

Program.cs using System; using System.Collections.Generic; using System.Linq; using System.ServiceProcess; using System.Text; using System.Threading.Tasks;namespace rBits {internal static class Program{/// <summary>/// 应用程序的主入口点。/// </s…

边缘计算网关驱动智慧煤矿智能升级——实时预警、低延时决策与数字孪生护航矿山安全高效运营

迈向智能化煤矿管理新时代 工业物联网和边缘计算技术的迅猛发展&#xff0c;煤矿安全生产与高效运营正迎来全新变革。传统煤矿监控模式由于现场环境复杂、数据采集和传输延时较高&#xff0c;已难以满足当下高标准的安全管理要求。为此&#xff0c;借助边缘计算网关的实时数据…

互联网分布式ID解决方案

业界实现方案 1. 基于UUID 2. 基于DB数据库多种模式(自增主键、segment) 3. 基于Redis 4. 基于ZK、ETCD 5. 基于SnowFlake 6. 美团Leaf(DB-Segment、zkSnowFlake) 7. 百度uid-generator() 基于UUID生成唯一ID UUID生成策略 推荐阅读 DDD领域驱动与微服务架构设计设计模…

深入理解小波变换:信号处理的强大工具

引言 在科学与工程领域&#xff0c;信号处理一直是关键环节&#xff0c;傅里叶变换与小波变换作为重要的分析工具&#xff0c;在其中发挥着重要作用。本文将深入探讨小波变换&#xff0c;阐述其原理、优势以及与傅里叶变换的对比&#xff0c;并通过具体案例展示其应用价值。 一…

【数据结构】(7) 栈和队列

一、栈 Stack 1、什么是栈 栈是一种特殊的线性表&#xff0c;它只能在固定的一端&#xff08;栈顶&#xff09;进行出栈、压栈操作&#xff0c;具有后进先出的特点。 2、栈概念的例题 答案为 C&#xff0c;以C为例进行讲解&#xff1a; 第一个出栈的是3&#xff0c;那么 1、…

vue基础(三)

常用指令 1. v-bind 固定绑定与动态绑定&#xff1a; 语法&#xff1a; 标准语法&#xff1a;v-bind:属性"动态数据" 简写语法&#xff1a;:属性"动态数拓" <!DOCTYPE html> <html lang"en"><head><me…