Layui如何解决弹出层iframe中父子页面协议不一致导致的报错

大雪姑娘_6959

大雪姑娘_6959

2026-07-19

954人浏览

原创

跨协议或跨端口时浏览器强制拦截 window.parent 访问,因违反同源策略;唯一可行方案是 postmessage 通信,需严格校验 origin、确保监听在顶层窗口,并安全检查依赖对象是否就绪。

跨协议(如 http 与 https)或跨端口(如 :8080 与 :3000)时,浏览器会强制拦截 window.parent 访问,直接报 blocked a frame with origin ... from accessing a cross-origin frame —— 这不是 layui 的 bug,是浏览器安全策略铁律,无法绕过,只能换通信方式。

为什么 parent.xxx() 一调就报错?

因为父子页面协议、域名、端口三者任一不同,即触发跨域。此时 window.parent 对象存在,但它的属性和方法全部被浏览器屏蔽,读取任何字段都会抛出 DOMException。即使只是 console.log(parent),展开时也会卡住或报错。

  • parent.submitForm → undefined(不是没定义,是被拒绝访问)
  • typeof parent.submitForm === 'function' → false(实际是 "undefined",但 typeof 不报错)
  • parent.postMessage 仍可用,但必须指定明确 origin,不能用 '*'

必须用 postMessage + 监听,且 origin 不能写错

这是唯一能跨协议通信的方案。关键不是“怎么发”,而是“谁监听”和“校验是否可信”。

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
  • 子页面发消息:必须用 parent.postMessage({type: 'SAVE_SUCCESS', data: result}, 'https://your-domain.com') —— origin 必须精确匹配父页协议+域名+端口,写成 '*' 在现代浏览器中会被静默丢弃
  • 父页面监听必须挂载在顶层窗口:如果父页本身嵌在另一个 iframe(如 LayuiAdmin 的 tab 页),window.addEventListener('message', ...) 要写在最外层 layout 页面,而不是某个子 tab 里
  • 监听函数里第一件事是校验 e.origin:如果 e.origin !== 'https://your-domain.com',直接 return,否则可能被恶意 iframe 欺骗
  • 子页面发消息前,先确认 parent !== window 且 parent.postMessage 存在,避免在非 iframe 环境下报错

父页面如何安全接收并响应?

接收后别直接执行逻辑,先解构、再校验、最后触发业务动作。尤其注意:不要在 message 回调里直接调 tableIns.reload(),除非你确定 tableIns 已初始化。

  • 用 typeof tableIns !== 'undefined' && typeof tableIns.reload === 'function' 双重判断,防止父页表格还没渲染完就调用
  • 如果需要刷新带参数(如跳转第一页),把参数放在 postMessage 的 data 字段里:{type: 'REFRESH', page: 1, filter: {status: 'active'}}
  • 子页面发完消息后,应立刻关闭自己:parent.layer.close(parent.layer.getFrameIndex(window.name)) —— 注意这里用的是 parent.layer,不是 window.layer
  • 父页面收到消息后,不建议立即 location.reload();优先走局部刷新,比如 tableIns.reload({page: {curr: 1}})

真正难的不是写几行 postMessage,而是确保父子两端的 origin 完全一致、监听位置在顶层、且所有依赖对象(如 tableIns)已就绪。跨协议场景下,连 window.parent.layui 都拿不到,更别说直接调函数——这时候硬写 parent.xxx() 只会让控制台越来越红。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2583

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5603

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6610

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6278

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

883

5

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.09

3543

4

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

2023.11.14

894

3

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2024.03.12

6546

8

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

5450

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 13万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 11.2万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.6万人学习