Javascript postMessage

时间:2018-01-23 04:16:13

标签: javascript iframe

Chrome浏览器如何在窗口与其IFrame之间交换数据(窗口在1个域名上,IFrame从其他域名加载内容)?

我的问题是,浏览器如何将JS对象发送到IFrame?是用HTTP请求还是其他一些网络协议完成的?

我无法在Chrome的网络标签中看到它,这就是我想知道的原因

3 个答案:

答案 0 :(得分:3)

TLDR; 因为父窗口可以直接获取iframe Window,所以浏览器可以使用离线的,基于事件的通信协议进行通信。

在这种情况下不需要网络协议,因为父窗口可以直接引用嵌入式iframe的Window对象(使用HTMLIFrameElement.contentWindow,然后可以使用MessageEvent来监听{{ 1}}为s)。

当父窗口调用otherWindow.postMessage(...)时,该邮件为serialized internally并传递给otherWindowWindow会自动反序列化对象,只要iframe MessageEvent正在通过为message注册事件监听器来监听window.addEventListener("message", function(event) { // passed offline using serialization algorithm specified in spec (2.9.1) console.log(event.data); // contains deserialized object }); ,如下所示:

removeGestureRecognizer

答案 1 :(得分:1)

您无法将JavaScript对象传递给iFrame,但您仍然可以访问iFrame中的元素,如下所示:

$('#iframeId').contents().find('iframe').contents().find('#element');

它将访问元素(假设隐藏字段)并设置您需要传递的值并在iFrame内容中使用它。

答案 2 :(得分:-1)

应该能够读取全局变量。

<script>var masterOfTheUniverse = "He-Man";</script>
应该可以从iFrame内外的任何地方看到

或者,您可以使用浏览器存储

// Store
localStorage.setItem("masterOfTheUniverse", "He-Man");
// Retrieve
localStorage.getItem("masterOfTheUniverse");