0

0

html5嵌入页面跨域报错_html5嵌入页跨域解决法【方案】

蓮花仙者

蓮花仙者

发布时间:2026-01-25 20:20:01

|

996人浏览过

|

来源于php中文网

原创

iframe跨域时无法访问contentWindow是同源策略强制保护,须用postMessage配合源校验实现安全通信,document.domain已废弃。

html5嵌入页面跨域报错_html5嵌入页跨域解决法【方案】

iframe 跨域时无法访问 contentWindow

当用 嵌入不同源(协议、域名、端口任一不同)的页面时,浏览器会阻止脚本访问 iframe.contentWindowiframe.contentDocument,直接报错 Blocked a frame with origin "https://a.com" from accessing a cross-origin frame.。这不是 bug,是浏览器同源策略的强制保护。

解决思路不是“绕过”策略,而是通过合法通信机制协作:

  • 双方页面都需主动配合,不能单边修改
  • 主页面调用 window.postMessage() 发送消息,嵌入页监听 message 事件接收
  • 嵌入页回复时也必须指定目标源(event.source.postMessage(..., event.origin)),不能写 *(除非你明确信任所有来源)
  • 主页面监听自身 message 事件时,务必校验 event.originevent.source,防止伪造消息

postMessage 传参和响应不生效?检查这几点

postMessage 看似简单,但实际常因细节失效。常见卡点:

  • 发送方未等 iframe 加载完成就调用 postMessage —— 应监听 iframe.onloadDOMContentLoaded 后再发
  • 接收方没加 event.origin !== 'https://trusted.com' 校验,导致被恶意页面冒充
  • 发送数据含函数、DOM 节点等无法序列化的值,会静默失败 —— 只能传可 JSON 序列化的对象
  • 嵌入页在 iframe 内调用 parent.postMessage,但主页面绑定了错误的事件监听器(比如绑在 window 上却忘了加 useCapture: false 默认行为,其实不影响)

示例(主页面发):

iframe.addEventListener('load', () => {
  iframe.contentWindow.postMessage({ type: 'INIT', data: { theme: 'dark' } }, 'https://embed.example.com');
});

嵌入页想主动通知主页面高度变化,怎么安全传?

这是典型场景:嵌入页内容动态撑高,需要通知父页调整 iframe 高度。关键在于避免无限循环和 XSS 风险:

立即学习前端免费学习笔记(深入)”;

易可图
易可图

电商人都在用的设计平台

下载
  • 嵌入页每次调用 parent.postMessage({ type: 'RESIZE', height: 520 }, parentOrigin) 前,先确认 parentOrigin 是白名单中的源(如从初始化消息里记下)
  • 主页面收到后,只更新 iframe.style.height,**不要**直接执行 eval() 或插入 HTML 字符串
  • 若嵌入页高度频繁变动,建议加防抖(如 100ms 内只发最后一次)
  • 别依赖 iframe.contentDocument.body.scrollHeight —— 如果嵌入页 CSS 有 height: 100%position: fixed 元素,这个值可能不准;更稳妥的是由嵌入页 JS 主动上报

为什么 document.domain 不再适用?

过去可通过设置 document.domain = 'example.com'a.example.comb.example.com 跨域变同源。但 HTML5 中该方式已被废弃:

  • Chrome 85+、Firefox 79+ 已完全移除对 document.domain 的支持(仅保留读取,写入抛错)
  • 即使旧版浏览器可用,它也只适用于**同主域子域间**,对完全不同的域名(如 example.comother-site.net)无效
  • 现代方案统一用 postMessage,兼容性更好、语义更清晰、权限控制更细

现在还看到 document.domain 相关代码,基本可以判定是遗留系统,升级时应优先替换为 postMessage 协作模型。

跨域通信真正难的不是语法,而是两边约定好消息格式、错误重试逻辑、超时兜底和源校验粒度 —— 这些往往比写几行 postMessage 花的时间多得多。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

508

2023.10.23

HTML与HTML5的区别
HTML与HTML5的区别

HTML与HTML5的区别:1、html5支持矢量图形,html本身不支持;2、html5中可临时存储数据,html不行;3、html5新增了许多控件;4、html本身不支持音频和视频,html5支持;5、html无法处理不准确的语法,html5能够处理等等。想了解更多HTML与HTML5的相关内容,可以阅读本专题下面的文章。

430

2024.03.06

html5从入门到精通汇总
html5从入门到精通汇总

想系统掌握HTML5开发?本合集精选全网优质学习资源,涵盖免费教程、实战项目、视频课程与权威电子书,从基础语法到高级特性(Canvas、本地存储、响应式布局等)一应俱全,适合零基础小白到进阶开发者,助你高效入门并精通HTML5前端开发。

46

2025.12.30

html5新老标签汇总
html5新老标签汇总

HTML5在2026年持续优化网页语义化与交互体验,不仅引入了如<header>、<nav>、<article>、<section>、<aside>、<footer>等结构化标签,还新增了<video>、<audio>、<canvas>、<figure>、<time>、<mark>等增强多媒体与

83

2025.12.30

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 23.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号