JavaScript使用HTML5的window.postMessage实现跨域通信例子

时间:2024-04-10 11:00:41 

JavaScript由于同源策略的限制,跨域通信一直是棘手的问题。当然解决方案也有很多:
1.document.domain+iframe的设置,应用于主域相同而子域不同;
2.利用iframe和location.hash,数据直接暴露在了url中,数据容量和类型都有限
3.Flash LocalConnection, 对象可在一个 SWF 文件中或多个 SWF 文件间进行通信, 只要

在同一客户端就行,跨应用程序, 可以跨域。
window.name 保存数据以及跨域 iframe 静态代理动态传输方案,充分的运用了window.name因为页面的url改变而name不改变的特性。
各种方案网上都有很多实例代码,大家可以自己搜索一下。

html5中最炫酷的API之一:就是 跨文档消息传输Cross Document Messaging。高级浏览器Internet Explorer 8+, chrome,Firefox , Opera 和 Safari 都将支持这个功能。这个功能实现也非常简单主要包括接受信息的”message”事件和发送消息的”postMessage”方法。

发送消息的”postMessage”方法

向外界窗口发送消息:

otherWindow.postMessage(message, targetOrigin);


otherWindow: 指目标窗口,也就是给哪个window发消息,是 window.frames 属性的成员或者由 window.open 方法创建的窗口
参数说明:
1.message: 是要发送的消息,类型为 String、Object (IE8、9 不支持)
2.targetOrigin: 是限定消息接收范围,不限制请使用 ‘*'

接受信息的”message”事件


var onmessage = function (event) {
var data = event.data;
var origin = event.origin;
//do someing
};
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', onmessage, false);
} else if (typeof window.attachEvent != 'undefined') {
//for ie
window.attachEvent('onmessage', onmessage);
}


回调函数第一个参数接收 Event 对象,有三个常用属性:
1.data: 消息
2.origin: 消息来源地址
3.source: 源 DOMWindow 对象

当然postmessage也有一些不足的地方:
1.ie8,ie9下传递的数据类型值支持字符串类型,不过可以使用用 JSON对象和字符串之间的相互转换 来解决这个问题;
2.ie6,ie7需要写兼容方案,个人认为window.name比较靠谱;

标签:JavaScript,window.postMessage,HTML5
0
投稿

猜你喜欢

  • 仿阿里巴巴搜索导航设计效果

    2008-04-15 15:01:00
  • js实现购物网站放大镜功能

    2024-04-30 08:51:56
  • Go Slice进行参数传递如何实现详解

    2024-02-16 13:07:46
  • 如何查询Top N及Top(M―N)记录?

    2009-11-11 20:03:00
  • MASA Blazor入门详细教程

    2023-04-08 17:51:29
  • Pytorch技巧:DataLoader的collate_fn参数使用详解

    2023-12-11 00:20:48
  • Pytorch转tflite方式

    2023-08-10 03:47:29
  • ACCESS的参数化查询,附VBSCRIPT(ASP)和C#(ASP.NET)函数第1/2页

    2024-01-25 10:05:42
  • Mysql出现问题:error while loading shared libraries: libaio解决方案

    2024-01-13 00:12:00
  • mysql5.6 解析JSON字符串方式(支持复杂的嵌套格式)

    2024-01-22 15:03:58
  • php获取给定日期相差天数的方法分析

    2024-05-02 17:34:20
  • pandas数据合并之pd.concat()用法详解

    2022-10-26 20:22:38
  • Python实现生成随机日期字符串的方法示例

    2023-10-27 11:51:37
  • python判断字符串是否包含子字符串的方法

    2021-01-04 12:48:03
  • python+selenium实现简历自动刷新的示例代码

    2023-11-27 16:13:01
  • sql 查询记录数结果集某个区间内记录

    2023-07-09 08:25:01
  • 关于程序员生活的一份调查,看看你属于哪一个群体吧

    2022-08-11 16:00:48
  • Python定义一个跨越多行的字符串的多种方法小结

    2022-08-04 03:34:27
  • 解决keras backend 越跑越慢问题

    2022-05-27 17:36:58
  • Python数据结构与算法之字典树实现方法示例

    2022-02-28 19:42:37
  • asp之家 网络编程 m.aspxhome.com