HTML5中的跨文档消息传递

跨文档消息传送(cross-document messaging),有时候也简称为XDM,指的是来自不同域的页面间传递消息。例如,www.w3cmm.com域中的一个页面与一个位于内嵌框架中的p2p.w3cmm.com域中的页面通信。在XDM机制出现之前,更稳妥地实现这种通信需要花很多功夫。XDM把这种机制规范化,让我们能既稳妥有简单地实现跨文档通信。

XDM的核心是postMessage()方法。在HTML5规范中,除了XDM部分之外的其它部分也会提到这个方法名,但都是为了同一个目的:向另一个地方传递数据。对于XDM而言,“另一个地方”指的是包含在当前页面中的<iframe>元素,或者由当前页面弹出的窗口。

postMessage()方法接收两个参数:一条消息和一个表示消息接收方来自哪个域的字符串。第二个参数对保障安全通信非常重要,可以防止浏览器把消息发送到不安全的地方。来看下面的例子。

var iframWindow = document.getElementById("myframe").contentWindow;
iframWindow.postMessage("A secret", "http://www.w3cmm.com");

最后一行代码尝试向内嵌框架中发送一条消息,并指定框架中的文档必须来源于“http://www.w3cmm.com”域。如果来源匹配,消息会传递到内嵌框架中;否则,postMessage()什么也不做。这一限制可以避免窗口中的位置在你不知道的情况下发生改变。如果传给postMessage()的第二个参数是“*”,则表示可以把消息发送给来自任何域的文档,但我们不推荐这样做。

接收到XDM消息时,会触发window对象的message事件。这个事件是以异步形式触发的,因此从发送消息到接受消息(触发接受窗口的message事件)可能要经过一段时间的延迟。触发message事件后,传递给onmessage处理程序的事件对象包含以下三方面的重要信息。

data:作为postMessage()第一个参数传入的字符串数据。
origin:发送消息的文档所在的域,例如“http://www.w3cmm.com”。
source:发送消息的文档的window对象的代理。这个代理对象主要用于在发送上一条消息的窗口中调用postMessage()方法。如果发送消息的窗口来自同一个域,那这个对象就是window。

接受到消息后验证发送窗口的来源是至关重要的。就像给postMessage()方法指定第二个参数,以确保浏览器不会把消息发送给未知页面一样,在onmessage处理程序中检测消息来源可以确保传入的消息来自已知的页面。基本的检测模式如下。

var EventUtil = {
    addHandler: function (element, type, handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler, false);
        } else if (element.attachEvent) {
            element.attachEvent("on" + type, handler);
        } else {
            element["on" + type] = handler;
        }
    }
};

EventUtil.addHandler(window, "message", function (event) {
    //确保发送消息的域是已知的域
    if (event.origin == "http://www.w3cmm.com") {
        //处理接收到的数据
        processMessage(event.data);
        //可选:向来源窗口发送回执
        event.source.postMessage("Received!", "http://p2p.w3cmm.com");
    }
});

还是要提醒大家,event.source大多数情况下只是window对象的代理,并非实际的window对象。换句话说,不能通过这个代理对象访问window对象的其它任何信息。记住,只通过这个代理调用postMessage()就好,这个方法永远不存在,永远可以调用。

XDM还有一些怪异之处。首先,postMessage()第一个参数最早是作为“永远都是字符串”来实现的。但后来这个参数的定义改了,改成允许传入任何数据结构。可是,并非所有浏览器都实现了这一变化。为保险起见,使用postMessage()时,最好还是只传字符串。如果你想传入结构化的数据,最佳选择是先在要传入的数据上调用JSON.stringify(),通过postMessage()传入得到的字符串,然后再在onmessage事件处理程序中调用JSON.parse()。

在通过内嵌框架加载其它域的内容时,使用XDM是非常方面的。因此,在混搭和社交网络应用中,这种传递消息的方法极为常用。有了XDM,包含<iframe>的页面可以确保自身不受恶意内容的侵扰,因为它只通过XDM为嵌入的框架通信。而XDM也可以来自相同域的页面间使用。

Related posts:

  1. HTML5中的拖放
时间: 2024-11-06 13:44:45

HTML5中的跨文档消息传递的相关文章

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

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

跨文档消息传递 postMessage

一.跨文档消息传递 1. postMessage 发送信息 向当前页面的 <iframe> 元素传送数据 // 接收方window对象.postMessage( "message", "接收方域名" ); var iframeWindow = document.getElementById("myframe").contentWindow; //contentWindow iframeWindow.postMessage("

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

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

跨文档消息

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

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

跨文档消息传送,简称为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

mongodb 删除集合中的所有文档

db.test.remove() -->  无参数将删除该集合中的所有文档

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

视频会议软件中的协同文档技术

现今的视频会议软件产品不单只是音.视频的传输,还包括协同数据功能.协同数据功能主要包括:电子白板共享.文档协同浏览.共享桌面等功能.现在我们主要讨论的是视频会议软件中的协同文档技术.协同文档浏览主要是通过协同浏览的方式,把主持人现场所打开的文档,传送给其他的客户端,从而其他的客户端可以实时看到主持人的操作.协同文档浏览技术一般可以通过几种方式来实现,每种实现方式有其优缺点: 1.直接文档上传方式 直接文档上传方式就是把文档上传到MCU服务器,然后记录主持人操作文档的类型.相关信息,并实时传输主持