为什么js无法通过contentDocument获取到iframe内容

embedded/2024/9/23 3:12:05/

最近在开发一个附件预览的页面,考虑到附件的安全性由后端对内容进行了加密,前端负责在页面引入iframe标签来加载数据,在这个过程中需要实时获取到iframe标签的渲染状态来判断什么时候loading结束:

这里我通过标签的方式来获取到iframe,再通过判断内部body是否有长度来确认loading状态,但是在页面中iframe加载到内容的情况下,无论怎么获取,js拿到的iframe内部都是空的

javascript">var iframe = document.getElementsByTagName('iframe')]
var loading = true// 监听iframe加载完成
iframe.onload = function() {// 获取iframe的document对象var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;// 获取iframe下的body元素var iframeBody = iframeDoc.body;loading = iframeBody.children?.length < 1
};

观察发现iframe的地址和项目的地址没有满足同源策略

同源策略限制:如果 iframe 加载的内容与主页面不在同一源(即协议、域名和端口相同),那么由于浏览器的同源策略,您将无法访问 iframe 的 contentDocument。在这种情况下,即使 iframe 已经加载完成,您也无法读取其内容。

而对于跨域 iframe,最可靠的方法是让 iframe 的内容主动通知主页面它已经渲染完成。这通常通过 postMessage 方法实现。如果您没有控制权限来修改 iframe 的内容,那么您将无法判断其渲染状态,因为浏览器的同源策略会阻止这种访问。

使用 postMessage 和 message 事件
如果跨域 iframe 的内容允许,您可以使用 window.postMessage 方法来在 iframe 和主页面之间安全地传递消息。iframe 可以在其内容加载和渲染完成后向主页面发送一个消息,主页面可以通过监听 message 事件来接收这个消息。

javascript">// 在主页面中监听来自iframe的消息  
window.addEventListener('message', function(event) {  if (event.origin !== '期望的iframe源的URL') return; // 安全检查  if (event.data === 'iframeRendered') {  console.log('iframe已经渲染完成');  }  
}, false);

在 iframe 的内容中,当渲染完成时,您可以发送消息:

javascript">// 在iframe的内容中发送消息给主页面  
window.parent.postMessage('iframeRendered', '*'); // 注意:'*' 表示接收方可以是任何源,出于安全考虑,应该替换为具体的源URL

 


http://www.ppmy.cn/embedded/9863.html

相关文章

nacos配置mysql(windows)

nacos默认是使用的内置数据库derby ,可通过配置修改成mysql,修改成mysql之后&#xff0c;之前配置在derby的数据会丢失 本文使用mysql版本为8.0.22 nacos版本为2.3.1 在mysql里面先创建一个数据库test(名称自定义&#xff0c;和后面配置文件里面的一样就好了) 在上面创建的数据…

实验7-4:补全代码,插入操作

实验7-4&#xff1a;补全代码&#xff0c;插入操作 【问题描述】 初始化一维数组中的9个元素a[10]{2,5,6,8,11,15,17,20,25}&#xff0c;要求该数组已经按升序排列&#xff0c;从键盘输入一个整数num&#xff0c;并将其插入到数组a中&#xff0c;要求插入操作完成后&#xff0…

lazarus-ide简介

Lazarus是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使用Free Pascal编译器的Pascal语言设计。它支持快速应用开发&#xff08;RAD&#xff09;&#xff0c;允许开发者创建跨平台的图形用户界面&#xff08;GUI&#xff09;应用程序。以下是关于Lazarus的来…

null和undefined区别

首先 Undefined 和 Null 都是基本数据类型&#xff0c;这两个基本数据类型分别都只有一个值&#xff0c;就是 undefined 和 null。 undefined 代表的含义是未定义&#xff0c;null 代表的含义是空对象。 一般变量声明了但还没有定义的时候会返回 undefined&#xff0c;null主要…

【C++ STL序列容器】array 数组

文章目录 【 1. 基本原理 】【 2. array 的创建 】2.1 不赋初值2.2 赋默认值2.3 赋指定值 【 3. array 的成员函数 】实例 【 1. 基本原理 】 array 是在 C 普通数组的基础上添加了一些成员函数和全局函数。在使用上&#xff0c;它 比普通数组更 安全&#xff0c;且效率并没…

海尔推行TPM管理的经验分享:打造高效制造新标杆

海尔集团&#xff0c;作为家电行业的佼佼者&#xff0c;其推行TPM&#xff08;全面生产维护&#xff09;管理的成功经验&#xff0c;无疑为众多寻求管理突破的企业提供了宝贵的借鉴。 一、TPM管理的核心理念 TPM&#xff08;Total Productive Maintenance&#xff09;即全面生…

Python基于flask的豆瓣电影分析可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

MySQL数据库——16.NULL 值处理

在MySQL中 NULL值表示一个字段的内容是未知或不适用的。在处理NULL值时,需要特别注意,因为它可能会对数据库查询和操作产生影响。 NULL值比较: 在MySQL中,NULL值不能简单地与其他值进行比较,包括与NULL本身的比较。例如,使用等号(=)比较NULL值会返回未知(UNKNOWN),…