JavaScript postMessage跨域通信

这玩意儿很早以前就有了,只是一直没流行起来。但是现在差不多可以用用了,下面这个是国内最新的浏览器市场份额数据 
  可见IE8的普及程度已经很高了,所以不做IE7-的网站也渐渐多起来,是时候使用这些东西了。
  这里说的postMessage是window对象的方法,它有两个参数,第一个是发送的消息,第二个是目标window对象打开页面的协议和域名。postMessage还有另外一个Worker版,这里就不介绍了。下面是一个最简单的postMessage例子,给自身window对象丢去消息。这个例子还没涉及到跨域问题,但是可以很清楚的了解postMessage的用法。
<script>
onmessage=function(e){
  e=e||event;
  document.write("消息:",e.data);
};
postMessage("次碳酸钴","http://127.0.0.1");
</script>

  这个例子中使用的postMessage实际上就是window.postMessage,也就是向window这个对象发送消息。window对象接收到消息后会触发message事件,在这个例子中message事件触发时会把收到的消息输出到文档上,这就是我们看到的结果。postMessage的第二个参数是一个包含协议名称和域名的URL格式字符串(Worker版没有这个参数),你也可以在这个字符中加入具体的路径,这不会影响结果。
  在对自身window对象postMessage的时候,它的功能就和detachEvent(fireEvent)类似,就是触发一个事件而已。postMessage最初的设计是用来与Worker(JavaScript独立子进程)通信的,这本身没有跨域问题,后来被扩展到window对象上,我们就可以跨域使用它做页面间的通信。跨域使用它通常是和IFRAME配合使用的,因为IFRAME可以很容易的获取到其中的window对象,我们就可以对IFRAME中的异域window执行postMessage。下面是例子:
<!--http://127.0.0.1/a.html-->
<iframe id="f" src="http://localhost/b.html"></iframe>
<script>
var f=document.getElementById("f");
f.οnlοad=function(){
  f.contentWindow.postMessage("SB","http://localhost");
}
</script>
<!--http://localhost/b.html-->
<script>
onmessage=function(e){
  e=e||event;
  document.write("我是",e.data);
};
</script>

  其实和之前的例子一样,这个例子中是调用了f.contentWindow的postMessage,你可以理解调用f.contentWindow的postMessage方法来触发f.contentWindow的message事件,就像主动派送一个事件一样,只不过是跨域的而已。
  postMessage的用法是很简单的,但是也有一些麻烦的问题,比如说事件回调。在message事件中由于跨域限制,无法获取这个消息来源的window对象,因此我们无法回送消息,这也是使用这个跨域方法最蛋疼的地方。就因为这个,postMessage在跨域方面上不是主流方法,所以这就作为一个跨域的候补方法吧。到这里使用postMessage跨域相关的东西也说完了,下面是一些相关的文档。
   MSDN postMessage
   MSDN onmessage
   MDN postMessage
   MDN onmessage


转载请注明:前端录»JavaScript postMessage跨域通信

<script src="http://www.wozhuye.com/index.php?m=digg&c=index&a=init&id=20-76-2"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Web 开发中,当网页中包含来自不同域名的 iframe(内嵌框架)时,由于浏览器的同源策略限制,iframe 之间的直接通信会受到限制。为了实现 iframe 之间的跨域通信,可以使用 postMessage 方法。 postMessage 是一种 HTML5 提供的跨文档消息传递机制,它允许在不同窗口或 iframe 之间发送消息。通过 postMessage,可以在不同域名之间进行安全的双向通信。 使用 postMessage 进行跨域通信的步骤如下: 1. 在发送消息的页面(发送方)中,使用 JavaScript 调用 postMessage 方法发送消息。该方法接受两个参数:要发送的消息和接收消息的目标窗口的源(origin)。目标窗口的源可以是具体的域名、协议和端口号,或者是通配符 "*" 表示任意源。 ```javascript var targetWindow = document.getElementById('target-frame').contentWindow; targetWindow.postMessage('Hello', 'https://target-domain.com'); ``` 2. 在接收消息的页面(接收方)中,监听 message 事件,通过 event.data 获取接收到的消息。在事件处理程序中可以对消息进行处理。 ```javascript window.addEventListener('message', function(event) { if (event.origin === 'https://source-domain.com') { console.log('Received message: ' + event.data); } }); ``` 通过这种方式,发送方和接收方可以进行跨域通信,并且可以在消息中传递复杂的数据结构。但要注意,为了确保安全性,应该在接收方对来自不同源的消息进行验证,以防止恶意代码的攻击。 需要注意的是,postMessage 方法只能在现代浏览器中使用,兼容性可能会有所差异。此外,在使用 postMessage 进行跨域通信时,也需要确保目标窗口(接收方)支持 postMessage 方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值