Basicly我有一个跨域的iframe,无法启用允许脚本标志,但同时我需要获取iframe文档中<script>
标记中的postMessage,或者访问iframe contentDocument。
我试过:
let iframeElement = document.getElementsByTagName('iframe')[0];
let iframeContent = iframeElement.contentDocument
console.log(iframeContent)
但是使用沙箱标志,我只得到一个null
返回。
我需要做的是这三个选项之一:
- 将eventListener添加到iframe contentDocument中的标记中
- 获取iframe contentDocument中的attr值
- 一种从原始页面发送JSON并在带有iframe(postMessage(的页面中获取该JSON的方法
但所有这些都没有允许脚本标志,我试图归档的内容可能吗?
简单的答案是否。
一个<iframe>的sandbox
属性限制了脚本的使用,因此无法执行脚本。因此,您将无法从此iframe的上下文中调用postMessage()
,也无法向事件侦听器发出回调。
现在,由于您的文档不满足跨来源策略,您陷入了困境,无法与<iframe>的文档。
如果此功能是必须具备的,唯一的解决方法是将您的服务器用作代理,以便您的iframe的内容实际上由您自己的服务器获取和服务。
这样,就不再有跨源问题了(如果你在你的iframe上添加allow-same-origin
策略(,你将能够从你父母的文档中访问你的ifame的内容,甚至添加事件监听器,即使仍然没有脚本可以从这个<iframe>的上下文中,所有内容都将从main的doc上下文中运行。(这意味着<iframe>中仍然没有postMessage()
(。
引用部分问题,
我需要获取iframe文档中
<script>
标记中的postMessage
如果您的意思是需要放入或注入包含postMessaging的<script>
标记,那么恐怕这是不可能的,因为同源策略会阻止它。
然而,如果您正试图访问或收听来自跨源iframe内<script>
标签的postMessage广播,那么是的,这正是postMessage的设计目的。假设您的消息事件侦听器托管在postMessage的targetOrigin
参数中定义的原点上。
PostMessage本质上是一种信任契约,旨在克服跨来源的障碍;要么拥有。。。
- 对iframe内容的访问权限
- 被委托通过托管在定义的
targetOrigin
上(推荐(或在targetOrigin
具有通配符"*"值的情况下位于任何原点(not推荐(来侦听广播消息
https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Security_concerns