使用postMessage实现跨域文档通信

postMessage(msg,targetOrigin)

  1. msg:要传递的数据,html5规范中提到该参数可以是JavaScript的任意基本类型或可复制的对象,但是并不是所有的浏览器都可以做到这点,部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数序列化,在低版本IE中引用json2.js可以实现类似效果。
  2. targetOrigin:字符串参数,指明目标窗口的源,协议+主机+端口号[+URL],URL会被忽略,所以可以不写,这个参数是为了安全考虑,postMessage()方法只会将message传递给指定窗口,当然如果愿意也可以建参数设置为"*",这样可以传递给任意窗口,如果要指定和当前窗口同源的话设置为"/"。

当postMessage()被调用的时,一个消息事件就会被分发到目标窗口上。该接口有一个message事件,该事件有几个重要的属性

  1. data:顾名思义,是传递来的message
  2. source:发送消息的窗口对象
  3. origin:发送消息窗口的源(协议+主机+端口号)

  这样就可以接收跨域的消息了,我们还可以发送消息回去,方法类似。

简单的demo

例:实现如下两个不同域文档之间的通信,

  1.主页面:http://mydomain.com/mytest.html

<!DOCTYPE html>
<html>
<head>  <meta charset="utf-8">
  <title>Post Message1</title>
</head>
<body>
     <div style="width:200px;height:200px; float:left; margin-right:200px;border:solid 1px #333;">
          <div id="color">Frame Color</div>
     </div>
     <div>
         <iframe id="child" src="http://yourdomain.com/yourtest.html"></iframe>
     </div>

     <script type="text/javascript">
         window.onload=function(){
             window.frames[0].postMessage(‘getcolor‘,‘http://yourdomain.com/‘);
         }

         window.addEventListener(‘message‘,function(e){
             var color=e.data;
             document.getElementById(‘color‘).style.backgroundColor=color;
         },false);
     </script>
</body>
</html>

  2.iframe页面:http://yourdomain.com/yourtest.html

<!doctype html>
<html>
<head>
     <meta charset="utf-8">   <style type="text/css">
           html,body{ height:100%;margin:0px;}
      </style>
</head>
<body style="height:100%;">
     <div id="container" onclick="changeColor();" style="widht:100%; height:100%; background-color:red;">
             click to change color
     </div>
     <script type="text/javascript">
         var container=document.getElementById(‘container‘);
      window.addEventListener(‘message‘,function(e){
                 if(e.source!=window.parent) return;//判断是否来自http://mydomain.com/mytest.html窗口对象
                 var color=container.style.backgroundColor;
                 window.parent.postMessage(color,‘*‘);
             },false);

          function changeColor () {
                 var color=container.style.backgroundColor;
                 if(color==‘red‘){
                     color=‘blue‘;
                 }else{
                     color=‘red‘;
                 }
                 container.style.backgroundColor=color;
                 window.parent.postMessage(color,‘*‘);
             }
      </script>
</body>
</html>

增强postMessage通信安全

  1. 对于包含重要信息的消息,不要砸targetOrigin参数中使用“*”,而应当指定一个域,否则,无法保证消息只发送到了期望的接收处;
  2. 经常检查origin属性,以确保只接收来自可信任的消息域中的消息;
  3. 想要更安全的话,可以检查一下收到的数据是否符合预期的格式。
时间: 2024-10-14 00:52:01

使用postMessage实现跨域文档通信的相关文章

跨域文档之间的访问

<iframe id='iframe1' src="http://www.cnblogs.com/lydialee/p/4869145.html" frameborder="1"></iframe> <script> var iframe = document.getElementById('iframe1'); console.log('iframe',iframe); var win = iframe.contentWindo

同域下跨文档通信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

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_WebWorkers]HTML5 web通信(跨文档通信/通道通信)简介

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

[HTML5_WebWorkers]利用HTML5的window.postMessage实现跨域通信

由于同源策略的限制,JavaScript跨域的问题,一直是一个颇为棘手的问题,为了解决js的跨域,web开发人员是煞费苦心,研究了各种跨域方案,如果有机会的话,明河以后会一一展示给各位,今天明河重点介绍下html5新引入的postMessage跨域方案. 1.哪些场景要考虑跨域问题? 明河这二周在处理淘宝添加收藏夹的重构,里面就有一个非常经典的跨域问题.添加收藏弹出层外层是淘宝商城页面域名是tmall.com,而弹出层内部的页面域名却是taobao.com,接下来的问题就是我现在希望弹出层内部的

window.postMessage解决跨域

一.基本原理 HTML5为了解决跨域,引入了跨文档通信API(Cross-document messaging).这个API为window对象新增了一个window.postMessage方法,允许跨窗口通信,不论这两个窗口是否同源.Internet Explorer 8+, chrome,Firefox , Opera和Safari 都支持这个功能. 二.测试步骤 1.创建a.html <!DOCTYPE html> <html lang="en"> <

Html5 postMessage实现跨域消息传递

一.同源策略 要理解跨域,我们首先要知道什么是同源策略.百度百科上这样定义同源策略:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现. 何谓同源:如果两个URL的域名.协议.端口相同,则表示他们同源. 浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读

html5 postMessage解决跨域、跨窗口消息传递

问题: 对于跨域问题,研究了一下html5的postMessage,写了代码测试了一下,感觉html5新功能就是好用啊. 此文仅使用html5的新特性postMessage,演示其执行过程和效果: 方法解释:postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档.多窗口.跨域消息传递.postMessage(data,origin)方法接受两个参数: 1.data:你需要传递的消息,消息传递的格式有一定要求:参数可以是JavaScript的任意基本类型或可

html5 postMessage解决跨域、跨窗口消息传递(转)

仅做学习使用,原文链接:http://www.cnblogs.com/dolphinX/p/3464056.html 一些麻烦事儿 平时做web开发的时候关于消息传递,除了客户端与服务器传值还有几个经常会遇到的问题 1.页面和其打开的新窗口的数据传递 2.多窗口之间消息传递 3.页面与嵌套的iframe消息传递 4.上面三个问题的跨域数据传递 postMessage() 这些问题都有一些解决办法,但html5引入的message的API可以更方便.有效.安全的解决这些难题.postMessage