layui提示Uncaught DOMException: Blocked a frame with origin怎么解决

夜枫小哥_4905

夜枫小哥_4905

2026-10-09

391人浏览

原创

跨域 iframe 中 parent.xxx() 报错是因浏览器同源策略拦截,必须用 postmessage 通信:子页需校验 parent.postmessage 可用性并指定精确 origin,父页须在顶层监听、校验 origin 并确保 tableins 已就绪再调 reload。

layui提示uncaught domexception: blocked a frame with origin怎么解决

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

不是 layui 写错了,是浏览器直接拦了。只要父子页面协议(http/https)、域名、端口三者中任一不同,window.parent 就变成“纸面存在、实际不可用”的对象——读属性、调方法、甚至 console.log(parent) 展开时都会抛 Uncaught DOMException: Blocked a frame with origin ...。常见触发场景包括:http://localhost:8080 调 https://dev.example.com、同域名但端口不同(:3000 vs :8080)、本地双击打开 file:/// 页面嵌套 iframe。

不能用 --disable-web-security 的真实原因

VS Code 的 launch.json 里加 "--disable-web-security" 确实能让 Chrome 暂时放行,但它只适用于本地调试,且:

  • 现代 Chrome(120+)已逐步限制该 flag 生效范围,尤其在 macOS 和启用扩展的环境下大概率失效
  • 它关闭的是整个浏览器的同源策略,不是项目级修复,上线前必须删掉,否则等于裸奔
  • IE/Edge 不报错 ≠ 安全,只是它们旧版策略宽松,不代表代码可移植
所以这不是解决方案,只是临时绕过,容易让你误判问题已解决。

必须用 postMessage,但写错就等于没写

postMessage 是唯一合规路径,但以下四点漏一个就会静默失败或被拦截:

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

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

下载
  • 子页发消息必须指定精确 origin,比如父页是 https://admin.example.com:8000,就不能写 '*' 或 'https://example.com';现代浏览器会直接丢弃 origin === '*' 的消息
  • 父页监听必须挂在顶层 window 上,如果父页本身在 LayuiAdmin 的 tab iframe 里,监听代码得写在最外层 layout 页面,而不是某个 tab 的 JS 里
  • 父页收到消息第一件事是校验 event.origin,不匹配立刻 return,否则可能被恶意 iframe 注入伪造数据
  • 子页调用 parent.postMessage() 前,先判断 parent !== window && typeof parent.postMessage === 'function',避免非 iframe 环境下直接报错
示例:子页安全发送
if (parent !== window && typeof parent.postMessage === 'function') {
  parent.postMessage({ type: 'SUBMIT_SUCCESS', data: formResult }, 'https://admin.example.com:8000');
}

父页监听片段

window.addEventListener('message', function(e) {
  if (e.origin !== 'https://admin.example.com:8000') return;
  if (e.data?.type === 'SUBMIT_SUCCESS') {
    // 确保 tableIns 已就绪再调 reload
    if (typeof tableIns !== 'undefined' && typeof tableIns.reload === 'function') {
      tableIns.reload({ page: { curr: 1 } });
    }
  }
});

关闭弹窗时别用 layer.getFrameIndex 直接关

Layui 的 layer.getFrameIndex(window.name) 在跨域 iframe 中大概率返回 NaN 或 undefined,因为 window.name 可能被重置或无法读取。正确做法是:子页发完消息后,让父页统一关——子页只负责通知,不负责关闭自身。父页监听到成功消息后,用保存的 index 关闭:

// 父页 open 时存 index
const index = layer.open({
  type: 2,
  content: 'child.html',
  success: function(layero) {
    const iframe = layero.find('iframe')[0];
    // 把 index 挂到 iframe 元素上,确保后续可查
    iframe.dataset.layerIndex = index;
  }
});

// 监听消息后关
if (e.data?.type === 'SUBMIT_SUCCESS') {
  const idx = document.querySelector('iframe[data-layer-index]').dataset.layerIndex;
  layer.close(+idx);
}

真正麻烦的从来不是“怎么通信”,而是通信时机和对象生命周期——父页表格还没渲染完你就调 tableIns.reload(),或者子页在父页监听器挂载前就发了消息,这些都不会报错,但逻辑就断了。

相关文章

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

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

下载

相关标签:

layui layui菜鸟教程

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

相关专题

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

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

2023.08.11

2343

5

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

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

2023.10.09

5063

6

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

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

2024.03.19

6130

13

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

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

2024.03.22

5658

10

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

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

2024.05.22

803

5

iframe写法有哪些
iframe写法有哪些

iframe写法有基本Iframe写法、嵌套Iframe写法、自适应宽高的Iframe写法、带有样式和属性的Iframe写法、内联Iframe写法和使用JavaScript动态创建Iframe写法。种写法都有自己的特点和适用场景。根据实际需求,选择合适的写法可以实现所需的功能和效果。

2023.10.19

2163

8

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

40

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

140

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

140

14

热门下载

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

精品课程

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

共87课时 | 12.8万人学习

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

共89课时 | 11万人学习

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

共5课时 | 1.6万人学习