javascript - 尽快检测跨域父级中的同源 iframe
问题描述
我在同一个域(我控制的域)上有两个 iframe,嵌入到不同域的页面中。我们将它们称为 iframe A 和 iframe B。
页面中可以有多个任一类型的 iframe。
iframe B 的工作很简单:它的工作是尽快在页面上的所有 iframe A 中调用一个函数。
因此,如果 iframe A 像这样嵌入:
<iframe src="https://domain-i-control.net/iframeA.html" name="iframeA"></iframe>
iframe B 可以包含以下内容:
<script>
parent.iframeA.addEventListener("load", function () {
this.iframeAFunction()
})
</script>
当只有一个 iframe A 时,这似乎工作正常。但是,当有多个 iframe A 时,它parent.iframeA
是不明确的,因此不会在所有 iframe A 中调用该函数。相反,我需要能够动态保护对所有 iframe A 的引用。
如何尽快从 iframe B 调用所有 iframe A 中的函数?
我尝试使用parent.frames
来遍历父页面中的框架:
<!-- iframeB.html -->
<script>
// Array.from() fails: Symbol.iterator cannot be accessed cross-origin
Array.prototype.slice.call(parent.frames).forEach(frame => {
// Missing: skip this frame if it's not iframeA
frame.addEventListener("load", () => {
frame.iframeAFunction()
})
})
</script>
...但似乎,当此代码立即运行时,不能保证所有父级的框架都已注册并存在于parent.frames
.
我尝试将上述内容包装在事件侦听器中parent
,以延迟执行,直到确保所有帧都已注册:
parent.addEventListener("load", () => {
// ... the above
})
...但addEventListener
不允许通过同源策略。
我认为在上面的代码段中更改parent
为window
不会有帮助,因为这只会延迟执行直到 iframe B 加载,但不一定是所有 iframe A。
甚至postMessage
需要在发送消息之前保护对目标框架的引用(但在这里似乎没有用,因为我的 iframe 彼此位于同一来源)。
解决方案
推荐阅读
- python - 如何使用 numpy 将矩阵简化为行梯形?
- python - 创建一个通过读取多个 CSV 文件创建字典的类 - Python
- csv - 寻找一种将 csv 文件写入 mdf4 格式的方法?
- excel - 如何为 strBody 变量选择单元格范围而不是仅 2 个单元格?
- perl - 使用 Perl 从块中解析文本
- php - PHP - 我将如何扫描特定的 UDP 端口以查看我的游戏服务器是否在线
- sql - 创建一个视图,将来自其他表多个单元格的数据连接到一个 oracle sql 中
- ios - 使用建议栏快速获取键盘大小
- javascript - 如何在javascript中的每个单词后添加一个符号
- java - 从 Spring Boot 示例代码中不断收到 403 禁止