Vue2嵌入HTML页面空白、互相传参、延迟加载等问题解决方案

一、需求分析

      最近做的一个用H5加原生开发的html项目,现需要集成到Vue2.0项目里面来。遇到的相关问题做个记录和总结,以便能帮到大家避免踩坑。

二、问题记录

1、页面空白问题

     将html页面通过iframe的方式嵌入进来之后,发现页面是空白的,不显示任何元素,

通过搜索资料发现,把html页面放到public目录下面的static目录下能够显示

 

 不写static目录直接访问会报错

2、vue和html页面之间如何通信

首先通过window对象 绑定一个方法 去调用vue声明的方法 

格式为:window[‘方法名’]   = (参数)=>{  vue里面的 你需要在html页面里调用的方法  }

下面是贴的相关代码 三个方法

methods: {
      // 调用方法
      iframeLoad() {
        const iframe = document.querySelector('#iframe')
        this.loading = true
        const that = this
        // 兼容处理
        if (iframe.attachEvent) {
          // IE
          iframe.attachEvent('onload', () => {
            that.loading = false
          })
        } else {
          // 非IE
          iframe.onload = () => {
            that.loading = false
          }
        }
      },
      //查询机组下拉列表
      listSystemQuery(){
        listSystem().then((response) => {
          this.selectData = response.rows || [] //机组下拉列表
          this.sendMessage(1)
        }).catch((error)=>{
          console.log(error)
        })
      },
      //查询所选机组下的查询参数
      listParamsQuery(param){
        const value = param.value
        const number = param.num
        getSystemResult(value).then((response) => {
          this.paramsData = response.data || [] //所选机组参数
          this.sendMessage(2,number)
        }).catch((error)=>{
          console.log(error)
        })
      },
      //点击查询按钮获取对标分析数据
      dbfxQueryData(param){
        const params = {
          id: param.id,
          startTime: param.startTime, //开始时间
          endTime: param.endTime,   //结束时间
          queryParams: param.queryParams,
          timeParam: param.timeParam,//页面录入 持续时间秒
        }
        const num = param.num
        getSystemData(params).then((response) => {
          this.resultData = response.data || [] //所选机组参数
          this.sendMessage(3,num)
        }).catch((error)=>{
          console.log(error)
        })
      },
      sendMessage(num,num2){
        const iframeWindow = document.querySelector('#iframe').contentWindow
        if(num===1){
          iframeWindow.postMessage({
            cmd: 'selectData',
            params: {
              success: true,
              data: this.selectData,
            }
          },'*')  // 发送消息至html页面
        }else if(num ===2){
          iframeWindow.postMessage({
            cmd: 'paramsData',
            params: {
              success: true,
              data: this.paramsData,
              num:num2
            }
          },'*')  // 发送消息至html页面
        }else if(num ===3){
          iframeWindow.postMessage({
            cmd: 'resultData',
            params: {
              success: true,
              data: this.resultData,
              num:num2
            }
          },'*')  // 发送消息至html页面
        }

      },
    }

在vue绑定方法之后 那么如何在html去调用这个方法呢

通过window.parent['vue里面绑定的名称'](需要传递的参数)  可以定义一个对象来传参 这种方法就可以调用到vue里面的方法啦!

       //调用vue方法
          const param ={
            value:selectValue,
            num:num
          }
          window.parent['queryParamsData'](param)

如下 html调用的是这个方法 

 param可以接收到来取值

 html调用vue现在可以拿到数据啦   那么该如何回传到html页面上来使用呢 看下面!

 首先拿到iframe的contentWindow对象,通过这个对象 postMessage 就可以发送消息给到html页面

 html页面接收时是通过message统一接收的,针对发送多个消息的情况下, 我们这里做下区分,

 通过传递不同的参数作为标识来区分是那个接口来发送的消息

html页面同样也要根据传递过来不同的参数 去调整自己的逻辑,首先知道html是如何接收到vue传来的消息的,window监听message即可接收postMessage发送来的消息

再通过传参的不同就可以区分处理逻辑啦

 3、iframe延迟加载提升用户体验

如果不加加载效果,会导致dom元素渲染的很慢,体验感很差,这里通过antdesign的spin渲染组件来搞定它

 那么问题来了,什么情况下知道iframe渲染完了呢,看下面

 iframe对象attachEvent事件可以知道是否已加载完成,再去给他关闭loading即可

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023牛客暑期多校训练营7(C/I/M)

目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。 首先,由题…

商品推荐系统浅析 | 京东云技术团队

一、综述 本文主要做推荐系统浅析,主要介绍推荐系统的定义,推荐系统的基础框架,简单介绍设计推荐的相关方法以及架构。适用于部分对推荐系统感兴趣的同学以及有相关基础的同学,本人水平有限,欢迎大家指正。 二、商品…

独立站如何进行Facebook广告投放?关于广告投放策略的真相

谷歌广告是独立站卖家推广引流的首选渠道,那么谷歌广告该如何投放?在这个过程中有哪些需要特别注意的吗? 创建Facebook广告账户: 访问Facebook广告管理平台(Ads Manager)并创建一个广告账户。您需要提供一…

Towards Open World Object Detection【论文解析】

Towards Open World Object Detection 摘要1 介绍2 相关研究3 开放世界目标检测4 ORE:开放世界目标检测器4.1 对比聚类4.2 RPN自动标注未知类别4.3 基于能量的未知标识4.4 减少遗忘 5 实验5.1开放世界评估协议5.2 实现细节5.3 开放世界目标检测结果5.4 增量目标检测结果 6 讨论…

【ArcGIS Pro二次开发】(56):界址点导出Excel

界址点成果表是地籍测绘中的一种表格,用于记录地块的界址点坐标和相关属性信息。 这个工具的目的就是为了将地块要素导出为界址点成果表。 一、要实现的功能 如上图所示,在【数据处理】组—【Excel相关】面板下,点击【界址点导出Excel】工具。…

linux文件I/O之 open() 函数用法

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> typedef unsigned int mode_t ; int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 函数功能 打开或创建一个文件 返回值 成功…

21、springboot的宽松绑定及属性处理类的构造注入

springboot的宽松绑定及属性处理类的构造注入 ★ 如何使用属性处理类所读取的属性 属性处理类最终变成了Spring容器中的一个Bean组件&#xff0c;因此接下来Spring即可将该Bean组件注入任意其他组件。 这种做法的好处是&#xff1a;可以将大量的配置信息封装一个对象——所以…

JavaScript的三大组成部分是什么?JavaScript的核心组成部分解析:语法、BOM和DOM

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【uniapp】封装一个全局自定义的模态框

【需求描述】 在接口401处&#xff0c;需要实现全局提示并弹出自定义模态框的功能。考虑到uni-app内置的模态框和app原生提示框的自定义能力有限&#xff0c;我决定自行封装全局自定义的模态框&#xff0c;以此为应用程序提供更加统一且个性化的界面。 【效果图】 【封装】 主…

Python-OpenCV中的图像处理-几何变换

Python-OpenCV中的图像处理-几何变换 几何变换图像缩放图像平移图像旋转仿射变换透视变换 几何变换 对图像进行各种几个变换&#xff0c;例如移动&#xff0c;旋转&#xff0c;仿射变换等。 图像缩放 cv2.resize() cv2.INTER_AREAv2.INTER_CUBICv2.INTER_LINEAR res cv2.r…

MySQL面试1

Mysql的面试突击1 Mysql的体系结构是什么样子的&#xff08;查询语句怎么进行执行的&#xff09; mysql的架构&#xff1a;单进程多线程的架构模式 CLient -----> Server架构 Mysql的链接方式有没有性能优化的点 2个点 查询缓存(Query Cache) MySQL 内部自带了一个缓存模…

Direct path read LOB

Table full scan &#xff1a; wait event Direct path read because of LOB "Direct path read" Wait Event During LOB Access (Doc ID 2287482.1)​编辑To Bottom In this Document Symptoms Changes Cause Solution References APPLIES TO: Oracle Database …

数据结构--栈和队列

文章目录 栈的概念和结构栈的实现栈的数据结构栈的初始化和销毁出栈和入栈获取栈顶、大小&#xff0c;判空 队列的概念和结构队列的实现队列的数据结构队列的初始化和销毁队列的插入 队列的删除获取队头和队尾的数据获取队列长度和判空 栈和队列的一些题目1.有效的括号2.用队列…

教你连接本地树莓派

如何连接本地树莓派 文章目录 如何连接本地树莓派前言1. 操作流程2. 打开树莓派SSH功能3. 确认树莓派信息后 安装相应SSH客户端 前言 树莓派作为一款以教育为目的推出的硬件系统&#xff0c;也是超低功耗的微型“准系统”&#xff0c;能够提供基础的电脑应用体验。而得益于其极…

微信开发之获取标签详情的技术实现

简要描述&#xff1a; 获取标签列表 请求URL&#xff1a; http://域名地址/getContactLabelList 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

服务限流治理

一、基础概念 1.什么是服务限流&#xff1f; 限流在日常生活中也很常见&#xff0c;比如节假日你去一个旅游景点&#xff0c;为了不把景点撑爆&#xff0c;管理部门通常会在外面设置拦截&#xff0c;限制景点的进入人数&#xff08;等有人出来之后&#xff0c;再放新的人进去…

为什么还有很多人不喜欢使用微信电话?让人感到困扰

尽管微信电话在技术上非常便利和实用&#xff0c;但仍然有很多人不太喜欢使用它。这引发了一个问题&#xff1a;为什么还有这么多人对微信电话感到困扰呢&#xff1f; 一、容易造成隐私泄露 在很多情况下&#xff0c;我们经常会收到好友的微信电话。然而&#xff0c;如果在这个…

(Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

前言&#xff1a;本文主要介绍在企业使用Python搭建接口自动化测试框架&#xff0c;数据驱动读取excel表里的数据&#xff0c;和数据库方面的交互&#xff0c;包括关系型数据库Mysql和非关系型数据库MongDB&#xff0c;连接数据库&#xff0c;读取数据库中数据&#xff0c;最后…

MySQL事务:ACID特性实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面&#xff0c;是保证数据一致性的重要手段。本文将首先介绍MySQL事务相关的基础概念&#xff0c;然后介绍事务的ACID特性&#xff0c;并分析其实现原理。 MySQL博大精深&#xff0c;文章疏漏之处在所难免&#xff0c;欢迎批评指…

Eudic欧路词典 for Mac v4.4.5增强版

欧路词典 (Eudic)是一个功能强大的英语学习工具&#xff0c;它包含了丰富的英语词汇、短语和例句&#xff0c;并提供了发音、例句朗读、单词笔记等功能。 多语种支持&#xff1a;欧路词典支持多种语言&#xff0c;包括英语、中文、日语、法语等等&#xff0c;用户可以方便地进…