Vue2或者uniapp 中 使用 iframe 嵌入本地 HTML 页面 并 相互通信。

1.使用 iframe 嵌入本地 HTML 页面(以pdfjs为例)

在 public 文件夹下新建 static 文件夹,然后将 html 文件及相关引用拷贝到 static 文件夹下
在这里插入图片描述

uniapp在src下新建hybrid文件
在这里插入图片描述
vue 文件完整代码

<template><div class="wrap"><iframeref="iframe":src="`${viewerUrl}?file=${encodeURIComponent(pdfUrl)}&page=12`"width="100%"height="50%"frameborder="0"></iframe><button @click="vueSendMsg">vue向iframe传递信息</button><button @click="iframeMethods">触发iframe中的方法</button></div>
</template><script>export default {data() {return {viewerUrl:'/hybrid/html/web/viewer.html',  // vue2 这里 直接写 static ,static/web/viewer.html};},methods: {// vue获取iframe传递过来的信息getiframeMsg(event){const res = event.data;console.log(event)if(res.cmd == 'myIframe'){console.log(res)}},// vue向iframe传递信息vueSendMsg(){const iframeWindow = this.$refs.iframe.contentWindow;iframeWindow.postMessage({cmd:'myVue',params : {info: 'Vue向iframe传递的消息',}},'*')},// 触发iframe中的方法iframeMethods(){this.$refs.iframe.contentWindow.triggerByVue('通过Vue触发iframe中的方法');},},mounted() {window.addEventListener('message',this.getiframeMsg)},
};
</script><style lang="scss" scoped>.wrap{width: 100%;height: 500px;
}
</style>

html 文件完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><h3>iframe嵌入的页面</h3><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta name="google" content="notranslate"><title>PDF.js viewer</title><!-- This snippet is used in production (included from viewer.html) --><link rel="resource" type="application/l10n" href="locale/locale.json"><script src="../build/pdf.mjs" type="module"></script><link rel="stylesheet" href="viewer.css"><!-- <script src="viewer.js" type="module"></script> --><script type="module">const queryString = document.location.search.substring(1);function parseQueryString(query) {const params = new Map();for (const [key, value] of new URLSearchParams(query)) {params.set(key.toLowerCase(), value);}return params;}// 当前页码和pdf地址通过链接传进来const curParams = parseQueryString(queryString);var url = curParams.get("file"); // pdf 地址var {pdfjsLib} = globalThis;pdfjsLib.GlobalWorkerOptions.workerSrc = '../build/pdf.worker.mjs';var pdfDoc = null,pageNum =Number(curParams.get("curpage"))|| 1,  // 当前页码pageTotal=null, // 总页码pageRendering = false,pageNumPending = null,scale = 0.8,canvas = document.getElementById('the-canvas'),ctx = canvas.getContext('2d');// iframe获取Vue传递过来的信息 拿到进度存储的页码window.addEventListener("message", getVueMsg);function getVueMsg(event){const res = event.data;if(res.cmd == 'myVue'){pageNum=res.curPage;console.log('iframe获取Vue传递过来的信息',res,res.curPage)}};/*** Get page info from document, resize canvas accordingly, and render page.* @param num Page number.*/function renderPage(num) {pageRendering = true;// Using promise to fetch the pagepdfDoc.getPage(num).then(function(page) {var viewport = page.getViewport({scale: scale});canvas.height = viewport.height;canvas.width = viewport.width;// Render PDF page into canvas contextvar renderContext = {canvasContext: ctx,viewport: viewport};var renderTask = page.render(renderContext);// Wait for rendering to finishrenderTask.promise.then(function() {pageRendering = false;if (pageNumPending !== null) {// New page rendering is pendingrenderPage(pageNumPending);pageNumPending = null;}});});// Update page countersdocument.getElementById('page_num').textContent = num;}/*** If another page rendering in progress, waits until the rendering is* finised. Otherwise, executes rendering immediately.*/function queueRenderPage(num) {if (pageRendering) {pageNumPending = num;} else {renderPage(num);}iframeSendMsg(num,pageTotal); // 实时触发页码变化给 vue页面 }/*** Displays previous page. 上一页*/function onPrevPage() {if (pageNum <= 1) {return;}pageNum--;queueRenderPage(pageNum);}document.getElementById('prev').addEventListener('click', onPrevPage);/*** Displays next page. 下一页*/function onNextPage() {if (pageNum >= pdfDoc.numPages) {return;}pageNum++;queueRenderPage(pageNum);}document.getElementById('next').addEventListener('click', onNextPage);/*** Asynchronously downloads PDF. 初次加载*/pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {pdfDoc = pdfDoc_;document.getElementById('page_count').textContent = pdfDoc.numPages;pageTotal=pdfDoc.numPages;// console.log('总页码',pageTotal)iframeSendMsg(pageNum,pageTotal) // 初次加载后向cue页面传递 页码// Initial/first page renderingrenderPage(pageNum);});// iframe向vue传递信息window.iframeSendMsg = 	function iframeSendMsg(num,total){window.parent.postMessage({cmd:'myIframe',pdfTotal:pageTotal,readPage:num,params : {info: 'iframe向Vue传递的消息',}},'*');};</script><script type="text/javascript">function triggerByVue(msg){console.log(msg)}</script></head><body tabindex="1"><canvas id="the-canvas" style="width: 100%; height: 205;"></canvas><div><button id="prev">上一页并传给vue</button><button id="next">下一页传给vue</button>&nbsp; &nbsp;<span>Page: <span id="page_num"></span> / <span id="page_count"></span></span></div><!-- <button onclick="iframeSendMsg()">iframe向Vue传消息</button> --></body></body><script type="text/javascript">// iframe向vue传递信息function iframeSendMsg(){window.parent.postMessage({cmd:'myIframe',params : {info: 'iframe向Vue传递的消息',}},'*');};// iframe获取Vue传递过来的信息window.addEventListener("message", getVueMsg);function getVueMsg(event){const res = event.data;if(res.cmd == 'myVue'){console.log(res)}};function triggerByVue(msg){console.log(msg)}
</script>
</html>

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

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

相关文章

RocketMQ-整合SpringBoot

SpringBoot整合RocketMQ 创建Maven工程&#xff0c;引入关键依赖&#xff1a; <dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</ver…

基于ssm实现的工资管理系统

一、系统架构 前端&#xff1a;jsp | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及截图 三、功能介绍 01. 登录页 02. 首页 03. 用户管理-基本资料 04. 用户管理-修改密码 05. 人事管理-部门列表…

基于Python实现的滑动验证码自动识别工具源码

滑动验证码识别 今天的目标地址是字节的巨量纵横&#xff0c;目前东家是一家广告营销型的公司&#xff0c;专注于在各大平台投放信息流广告。巨量纵横为字节跳动的广告平台&#xff0c;用于管理推广账户。今天破解一下这个平台的登陆入口&#xff0c;为今后的数据爬取开个头。…

Pytorch深度强化学习1-5:详解蒙特卡洛强化学习原理

目录 0 专栏介绍1 蒙特卡洛强化学习2 策略评估原理3 策略改进原理3.1 同轨蒙特卡洛强化学习3.2 离轨蒙特卡洛强化学习 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手…

倾斜摄影三维模型的根节点合并的优势分析

倾斜摄影三维模型的根节点合并的优势分析 根节点合并是倾斜摄影三维模型处理中的一项重要技术&#xff0c;它具有许多优势&#xff0c;可以显著提升模型数据的处理效率和渲染性能。在本文中&#xff0c;我们将对倾斜摄影三维模型的根节点合并的优势进行详细分析。 1、数据大小…

Oracle(2-8)Configuring the Database Archiving Mode

文章目录 一、基础知识1、Redo Log History2、NOARCHIVELOG Mode 非归档模式3、ARCHIVELOG Mode 归档模式4、Changing the Archiving Mode 更改归档模式![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d6a09f9a6de24de7bbcdad90b8d6b9ca.png)5、Auto and Manual Ar…

关于this和构造器的理解

1.类中的this关键字表示当前对象的引用。它可以被用于解决变量名冲突问题&#xff0c;或者在一个方法中调用类的另一个方法。如果在方法中没有明确指定要使用哪个变量&#xff0c;那么编译器就会默认使用this关键字来表示当前对象。 下面是一个输出this关键字的示例代码&#…

网工学习9-STP配置(二)

如图 1 所示&#xff0c;当前网络中存在环路&#xff0c; SwitchA 、SwitchB 、SwitchC 和 SwitchD 都运行 STP&#xff0c;通过 彼此交互信息发现网络中的环路&#xff0c;并有选择的对某个端口进行阻塞&#xff0c;最终将环形网络结构修剪成无 环路的树形网络结构&#xff…

木质家具行业分析:我国市场规模总资产达1669.19亿元

木质家具是指以天然木材和木质人造板为主要材料&#xff0c;配以其他辅料(如油漆、贴面材料、玻璃、五金配件等)制作各种家具的生产活动。 近年来实木家具越来越受到广大消费者的青睐。继板式家具、板式定制家具之后&#xff0c;板木家具与整木定制家具渐渐走进人们的视野。但目…

【EI稳定检索】第三届能源利用与自动化国际学术会议(ICEUA 2024)

第三届能源利用与自动化国际学术会议&#xff08;ICEUA 2024&#xff09; 2024 3rd International Conference on Energy Utilization and Automation (ICEUA 2024) ICEUA 2024已成功申请JPCS - Journal of Physics: Conference Series (ISSN:1742-6596)---独立出版 2024年…

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

Python小项目:葛兰中欧医疗基金数据分析

1 前言 2022年1月末&#xff0c;正值年前&#xff0c;股票市场持续大幅下跌&#xff0c;与之相应的基金市场也出现了近一周的持续跌势。作为一个资深的投资者&#xff0c;我承认自己曾是一名“韭菜”&#xff0c;在2021年12月初购买了中欧医疗健康混合C基金。这只基金由医疗板…