跨文档消息传递 postMessage

一、跨文档消息传递

1. postMessage

发送信息

向当前页面的 <iframe> 元素传送数据

// 接收方window对象.postMessage( "message", "接收方域名" ); 

var iframeWindow = document.getElementById("myframe").contentWindow;  //contentWindow
iframeWindow.postMessage("a secret","http://www.wrox.com"); //向内嵌框架发送消息

接收信息

该方法触发接收方 window 对象的 message 事件,并且传递个 onmessage处理程序的 event 包括以下三方面信息

  • data:postMessage()第一个参数传过来的 message,最好只传字符串 (结合: JSON.stringify(), JSON.parse())
  • origin: 发生消息的文档所在的域
  • source: 发送消息的文档的 window对象代理
//接收到其他窗口发送过来的信息
window.addEventListener("message", function(event){
    event.source.postMessage("收到",event.origin)  //向原窗口发送回执
})

2. 例子

外层 top 窗口 和 内层 iframe 窗口可进行通信,top 窗口可发送消息给 iframe 窗口,iframe 在接受到消息后返回 ‘Ok‘ 作为回应;iframe 也可以发送信息给 window,不过为了避免两个窗口无限的互发 ‘Ok‘ 回应信息,top 窗口在收到信息后不给予回应。

http://localhost:3000 域下页面代码

<style>
    #textarea{
        width: 300px;
        height: 100px;
    }
</style>

<body>
    <h1>TOP</h1>
    <p id="localOrigin"></p>
    <button id="button">发信息给 iframe</button><br/>
    <textarea id="textarea"></textarea>
    <div id="message"></div>

    <hr>

    <iframe id="iframe" src="https://czsheng.cn:8080/demo/iframe.html" frameborder="1" style="width: 100%; height: 300px"></iframe>
</body>
<script>
    document.getElementById(‘localOrigin‘).innerHTML = ‘我的域名为:‘ + window.location.origin;
    window.addEventListener("message", function(event){
        var messageBox = document.getElementById("message");
        var msg = "【origin】:"  + event.origin + "<br/>"      // 收到发送方的消息及发送发所在的域
                + "【message】:" + event.data + "<br/>"
        messageBox.innerHTML = msg

        // 因为 iframe 里面会在收到信息后返回 OK 信息,如果我这样也返回的话会造成循环,所以这里就注销掉了
        /* setTimeout(function(){
            event.source.postMessage("--------------------OK--------------------", event.origin)
        }, 1000) */
    })
    document.getElementById("button").addEventListener("click",function(){
        var ifm = document.getElementById("iframe").contentWindow    // 也可以通过 window.frames[0] 获取 iframe 的 window 对象
        var text = document.getElementById(‘textarea‘).value;
        ifm.postMessage(text, "https://czsheng.cn:8080")    // 向接收方窗口的 window 对象发送消息,指明接收方所在的域
    })
</script>

https://czsheng.cn:8080 域下页面代码

<style>
    #textarea{
        width: 300px;
        height: 100px;
    }
</style>

<body>
    <h1>Iframe</h1>
    <p id="localOrigin"></p>
    <button id="button">发送信息给 Top window</button><br/>
    <textarea id="textarea"></textarea>
    <div id="message"></div>
</body>

<script>
    document.getElementById(‘localOrigin‘).innerHTML = ‘我的域名为:‘ + window.location.origin;

    window.addEventListener("message", function(event){
        var messageBox = document.getElementById("message");
        var msg = "【origin】:"  + event.origin + "<br/>"
                + "【message】:" + event.data + "<br/>"
        messageBox.innerHTML = msg
        setTimeout(function(){
            event.source.postMessage("--------------------OK--------------------", event.origin)
        }, 1000)
    })
    document.getElementById("button").addEventListener("click",function(){
        var text = document.getElementById("textarea").value;
        top.postMessage(text, "http://localhost:3000")
    })
</script>
</html>


注意

转载、引用,但请标明作者和原文地址

原文地址:https://www.cnblogs.com/CccZss/p/8515845.html

时间: 2024-11-07 12:22:52

跨文档消息传递 postMessage的相关文章

web通信之跨文档通信 postMessage

index.html <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>web通信之跨文档通信</title> <style> iframe {float:left;width:45%; height:200px; bor

HTML5中的跨文档消息传递

跨文档消息传送(cross-document messaging),有时候也简称为XDM,指的是来自不同域的页面间传递消息.例如,www.w3cmm.com域中的一个页面与一个位于内嵌框架中的p2p.w3cmm.com域中的页面通信.在XDM机制出现之前,更稳妥地实现这种通信需要花很多功夫.XDM把这种机制规范化,让我们能既稳妥有简单地实现跨文档通信. XDM的核心是postMessage()方法.在HTML5规范中,除了XDM部分之外的其它部分也会提到这个方法名,但都是为了同一个目的:向另一个

跨文档消息

跨文档消息传送 1.想从其他窗口接收到消息必须对窗口对象的message事件进行监听 window.addEventListener("message",function(){},false); 使用window对象的otherwindow.postMessage(message,targetOrigin);//第一个参数为字符串文本或通过JSON.stringify(obj)转换的json字符串 第二个为接受方的url Otherwindow 获取 1.由 window.open()

HTML5学习之跨文档传输消息(七)

新标准中提供了文档之间直接的消息传输API.而且不限制跨域消息传递! 发送消息使用的是Window对象的postMessage(data,targetURL)方法就可以了,但给哪个window对象发送消息,就使用哪个window的实例来调用,注意这个细节. 文档默认监听一下message事件就可以接受消息了:window.addEventListener("message", function (ev) {}); 监听消息事件:ev两个重要属性:ev.source指向发送消息的源win

[HTML5_WebWorkers]HTML5 web通信(跨文档通信/通道通信)简介

一.简单概要 web通信(洋名:web messaging)是一种文档中独立的浏览上下文间的DOM不会被恶意的跨域脚本暴露数据分享方式. 得得得,术语啊什么的,比看到凤姐还头疼.有必要把上面一句话拆开讲: web通信是一种数据分享方式(有屁话之嫌): 通信的主体是“浏览上下文”(这是纳尼?): 哦,“浏览上下文”呢是“一个将 Document对象呈现给用户的环境”,你可以近似理解为平常我们看到的某个页面所处的环境: web通信不会有DOM被恶意暴露的危险: 目前应用比较多的就是iframe之间的

跨域技术之跨文档消息传输

跨文档消息传送,简称为XDM,指的是来自不同的域的页面间的传递消息. 如果两个网页不同源,就无法拿到对方的DOM.典型的例子是iframe窗口和window.open方法打开的窗口,它们与父窗口无法通信. 比如,父窗口运行下面的命令,如果iframe窗口不是同源将会报错. document.getElementById("iframe").contentWindow.document 上面命令中,父窗口想获取子窗口的DOM,因为跨源导致报错. 反之亦然,子窗口获取主窗口的DOM也会报错

同域下跨文档通信iframe和window.open

1.iframe标签可以嵌套另一个标签,并且可以通过js去访问被包含的页面的window对象,从而操作该页面下documentElement,如下: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <s

postMessage解决跨域下跨文档通信

postMessage方法可以向另外一个窗口发送消息, 该方法是window下的一个全局方法.用法: 首先找到新窗口的window的对象,然后调用postMessage方法,该方法接受两个参数,第一个参数为数据,第二个参数为打开的新窗口的域(带协议的).例如: oMyIframe.contentWindow.postMessage('1', 'http://www.b.com'); 在被打开的新窗口里面,有一个message事件:当窗口接受到通过postMessage传递过来的数据时就会触发该事

HTML5 学习笔记四(跨文档消息通信)

一.同域 父→子  方法: ⒈iframe对象:父页面的iframe中的子页面,父的iframe对象的contentWindow即为子window对象. ⒉父通过window.open()方法,其方法接收子url作为参数,方法返回值为子window对象. 子→父 方法: ⒈iframe:在父页面的iframe中,子页面的parent(window.parent)对象为父window. ⒉使用open()方法的父子,其子页面的window.openner即为父window对象. 二.跨域 在父窗口