事件回顾:

收到需求,说是要在别人的系统里嵌入目前由我维护的系统,嵌入的逻辑不多,只有一个创建流程。

刚开始觉得没什么,不就是你改改,我改改,你给我url加个参数,我知道是你调用,修改下页面balabal。。。

奈何想法总是赶不上需求。

我要嵌入的页面大概是这样的↓↓↓。一共有三步,切换步骤不刷新页面

要嵌入到对方的页面大概如下↓↓↓。是在一个弹出的modal框里,第一步是对方的步骤,后三步由我们嵌入。

对方的需求:步骤条和下方控制按钮放在他们页面。跟我想的完全不一样。于是开启了这次旅程。

分析需求:

既然步骤条在对方页面,那每一步就需要我们提供一个新的路由对应一个新页面去展示,这很容易想到。但我们系统设计之初,这三步是一个连贯的操作,数据会向下流到最后一步才一次性提交给后端。而且下方控制下一步的按钮放在对方页面,所以就算我们提供新页面也满足不了需求。

不同路由不能满足,那同一个路由不同hash呢?这里要感谢【守卫】大哥,给了一个打开新世界的思路。

同一个路由改变hash值。页面确实不会刷新。那么对方点击下一步时,只要动态改变iframe的url hash,我们这里再监听hash值变化,事先约定好特定值,进而来回切换每一个步骤。嗯,似乎一切都是那么美好。但光想是不够的。Task is cheap,show me the code。所以,我简单模拟了一个iframe环境,嵌入我们系统的页面。一切都很顺利。但我忽略了一点。

这三步中的每一步不是想跳就跳的。每一步的表单都有校验阶段,校验失败我们肯定不会进行下一步。所以这就出现了一个问题:我们如何通知父页面本页面校验阶段是否通过呢?因为步骤条在对方页面,所以我们必须保证我们的实际步骤和对方的步骤条保持同步。

变更需求:

经过一系列讨论,我们决定找他们变更他们的需求。然而对方也很爽快,或许是因为对方不想在这个小需求上花太多时间,或许是因为我们这次是两个人,气势十足。

最终决定步骤条和按钮都可以放在我们页面,但是最后一页必须有一个返回按钮来返回他们的页面。

iframe里的按钮如何改变浏览器的路由呢?这里还要感谢【守卫】大哥,真是字如其花名。提出a标签的target属性或许有帮助。点击查看target的四种值及含义,这里不详细讲了。

a标签target属性的_top值可以使a标签在iframe里改变浏览器的路由。

至此,所有问题似乎以对方的妥协而告终。

但这不是架构组的终点。

继续思考:

现在的情况是:步骤条和按钮都在我们页面,就是说我们不需要做太多的修改,只需要在最后一个页面加一个a标签具有特定target值的属性来改变浏览器的URL,以此来实现关闭弹框modal并且返回到对方的列表页。

这里有一个流畅度的问题。本来到第二步突然切换到iframe,页面会有短时间空白,再加上最后一步跳回列表页,又刷新了整个页面,用户体验非常不好,我都感觉不好。

切换到iframe时的空白只能通过我们页面的首屏性能优化或者微前端的方式,但时间紧任务重。性能优化和微前端不可能半天内搞定,所以第二步优化先放弃,那最后一步能不能优化呢?

又想到了hash值。既然动态改变iframe url hash值不会导致iframe里页面的刷新,那么我通过上方提到的a标签来改变父页面的hash值呢?貌似又发现了新大陆。

说干就干,找了两个系统测试了一番,结果跟预想的一样。

马上通知对方开发人员,提出了这个方案,对方也欣然接受。

至此实现了最后一个步骤返回父页面列表页时,无感知关闭弹框modal。

上线后思考:

最后的方案虽然是步骤条和按钮都在我们页面,但根据上面提到的解决无感知关闭弹框的方案,步骤条和按钮完全可以放到对方页面,就像对方一开始提的需求一样。

具体方案是:父页面点击下一步按钮,改变子页面hash值,子页面监听hash值变化,走校验逻辑。

校验合格,通过代码控制a标签点击来改变父页面hash值,父页面监听hash值变化,进而控制步骤条是否到下一步。

校验不合格,则不改变父页面hash值,则步骤条不动。

不过这种方式对于页面原有hash值有侵入。我们两个系统都没有使用hash所以这个方式可行。对于那些原有页面依赖hash展示的系统,这种方式并不适用。

小结:

iframe的父子页面通信,除了postMessage等方式,相互改变hash值也是不错的选择。

父页面通过JavaScript改变iframe的src的hash,同时监听自己的hash变化。

子页面通过下方的方式改变父页面的hash,同时监听自己的hash变化。

以此可以延伸到更多的场景。当父子页面需要传送很复杂的数据,可以把数据转成字符串放到hash上。

注意:

hash变化会在历史记录生成一条数据,导致用户回退时的页面可能与预期不符,所以这个方式要视情况使用。

同时还要注意,hash功能本身是为了使浏览器能定位到页面特定的元素↓↓↓

所以改变hash时要注意页面上不能有有反应的元素。

iframe 覆盖父页面_一次iframe子页面与父页面的通信相关推荐

  1. 小程序嵌套h5页面_微信小程序内嵌h5页面

    概况 使用 标签能在小程序中打开外部网页,但是要打开的网页的域名必须跟小程序的业务域名(业务域名可以在小程序的后台管理界面添加)一致,否则在真机上是打不开的.如果开发工具上勾选了'不校验域名',在开发 ...

  2. app.vue 跳转页面_「案例分析」APP关键页面UX优化拆解—以珍爱网APP为例

    珍爱网APP一共有五个主要的关键页面.第一个是推荐页面,第二个是直播页面,第三个动态页面,第三个是消息页面,第五个是个人设置. (一)APP页面结构梳理 珍爱网APP关键页面结构 (二)各部分关键页面 ...

  3. h5 iframe嵌套页面_关于解决iframe标签嵌套问题的解决方法

    问题描述 当我们使用easyui做后台管理系统的时候,会使用tree组件来实现树形菜单,而我们每点击一次相应菜单,会根据是否有url来判断是否是一级菜单,以及是否已经存在 //根据该节点名字判断该节点 ...

  4. python爬虫动态加载页面_如何爬动态加载的页面?ajax爬虫你有必要掌握

    通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这 ...

  5. 需要某个字体包才能正确显示此页面_[三分钟小文]前端性能优化-页面加载速度优化...

    本期内容请记住一个核心:JavaScript很快,DOM很慢 阅读本文您将收获: 从用户输入URL到看得到页面的过程 页面渲染过程 在页面加载层级的性能优化 用户看到页面之前都经历了什么 这一部分是面 ...

  6. 小程序跳到h5页面_小程序如何跳转h5页面

    小程序跳转H5页面是通过web-view组件来实现的,web-view是一个可以用来承载网页的容器,会自动铺满整个小程序页面. 1.配置业务域名 小程序账号必须是企业账号,个人和海外账号暂不支持,只有 ...

  7. iframe简单使用 、获取iframe 、获取iframe 元素值 、iframe获取父页面的信息

    文章目录 1.iframe简单使用 2.获取iframe 3.获取iframe 元素值 4.iframe获取父页面的信息: 1.iframe简单使用 <iframe> 标签规定一个内联框架 ...

  8. h5 iframe嵌套页面_汇总IOS下奇葩BUG以及iframe嵌套页面带来的一些困扰

    做H5开发,安卓和IOS的兼容问题经常会困扰我们,尤其是跟第三方平台合作,用到iframe嵌入式应用,令很多Web前端开发的童鞋脑壳疼,相信大家也入了不少坑,且踩且珍惜吧,呵呵^_^.今天抽时间整理一 ...

  9. php退出页面父元素,jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码...

    iframe和弹窗这些词对于js高手来说都是耳熟能详的东西,作为一个新人来说,还在学习阶段的我就在工作中遇到这么一个奇葩的需求,要在引入的iframe页面里做一个全屏化的功能. 粗略一看,这还不容易, ...

最新文章

  1. lava.lang.String数据转换为java.sql.Date
  2. Java 位运算- 十进制数值转十六进制(内存中的数据)
  3. IOS 文件读取4种方法 转字符串 和data
  4. 黑马程序员——java语言基础——面向对象
  5. 母版页(Master Pages)--轉載
  6. 再等等!iPhone 11和iPhone SE还会继续降价
  7. 什么是Java Marker Interface(标记接口) 1
  8. android studio:aar文件出现问号,导入不生效解决
  9. 1.nodejs介绍
  10. 安卓开发之刮刮乐实例教程
  11. a number of 和the number of用法
  12. rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
  13. 软件工程需求分析模板(简单)
  14. 三维重建:特征检测+匹配+RT恢复+稠密重建方法
  15. RabbitMQ heartbeat原理
  16. Internet协议的安全性
  17. Smith预估控制实验 simulink模型
  18. 怎样合并磁盘分区?看这里~
  19. 实现语音视频录制(demo源码)
  20. Island Transport

热门文章

  1. IBASE search
  2. jQuery.proxy debug
  3. IBASE category 01 component hierarchy
  4. SAP CRM BSP URL 302 redirect
  5. Vue compile - Vue中的双大括号 {{ 是如何被解析(parse)的
  6. SAP UI5和微信小程序对比之我见
  7. Android跨屏拖动item,android中如何实现两个listview中的item可以互相拖拽移位?
  8. android 构造xml,android 中生成xml文件
  9. android 缩进轮播图,如何利用纯css实现图片轮播
  10. 某一个接口403 其他接口可以调通_设计模式HR:不会设计模式,你来面什么试?你以为设计模式只有23种?(真正的入门到精通可以用到入土)...