跨域、跨文档传输数据(三)---- postMessage ; 实现跨文档消息传输;
来源:互联网 发布:淘宝一个金冠要多少丹 编辑:程序博客网 时间:2024/05/02 01:23
之前写过两篇解决跨文档消息传输的解决方案。其中 一种使用了MessageJS的插件方法,其实MessageJS
这个插件的原理就是使用了HTML5提供的postMessage;
一下讲讲,postMessage的实际用法以及基本知识:
HTML5提供了在网页之间互相接受与发送消息的功能;
可以获取到网页所在窗口的对象实例,不进同源(域+端口号)的web网页之间的互相通信,也可以实现跨域通信;
兼容性:
IE8+,
Firefox 3.1+,
Opera 9+,
Safari,
Chrome
首先:想 要接收从其他窗口发过来的消息,就必须对窗口对象进行监听:
监听方法:
window.addEventListener("message", function(e){...}, false);
发送消息:
/*** @message:发送的消息文本,可以是数字。字符串,也可以是javascript的对象(通过JSON转换为对象文本);* @origin:接收消息的对象窗口的URL地址(例如http://1.1.1.1:8080;带端口号。),这个参数也可以使用* 通配符"*",意思是指定发送给全部的地址,这样的话所有的网页都能收到你发来的消息,友情提示:* 不建议这么用,最好使用指定的URL;该参数发送时,只包括域和端口号;*/otherWindow.postMessage(message,origin);
案例
以下案例,来说明iframe在使用postMessage跨域传输数据;
父页面和子页面,在不同的主机上发布(IP地址不同)
跨域通信 — 主(父)页面 postParent.html:
<!DOCTYPE html><html><head><title>postMessage:跨域传输数据主页面</title></head><body> <div> <p>接受来自:</p> <h1 id="h1"></h1> <p>的消息:</p> <h1 id="p_text"></h1> </div> <iframe width="500px" height="500px" id="iframe" src="http://1.1.1.1:8080/postMessage/postMessage1.html" onload="send()"> </iframe> <script type="text/javascript"> // 窗口事件监听:监听message window.addEventListener("message",function(e){ // e.origin:发送消息的地址,谁发的消息就是谁的 // 接收时候,可以加个判断;避免接收来源不明的URL发过来的数据 if( e.origin != "http://1.1.1.2:8080" ){ return; } document.getElementById("h1").innerHTML = e.origin; // e.data:发消息的内容 document.getElementById("p_text").innerHTML = e.data; },false); // 发消息 function send(){ // 获取嵌入的iframe var iframe = window.frames[0], send_origin = document.getElementById("iframe").getAttribute("src"); iframe.postMessage("我是父页面的消息---唉呀妈呀",send_origin); } </script></body></html>
跨域通信 — 子(嵌入)页面 postMessage1.html:
<!DOCTYPE html><html><head><title>postMessage:跨域传输数据子页面</title></head><body> <div> <p>接受来自:</p> <h1 id="h1"></h1> <p>的消息:</p> <h1 id="p_text"></h1> </div> <script type="text/javascript"> // 窗口事件监听:监听message window.addEventListener("message",function(e){ // e.origin:发送消息的地址,谁发的消息就是谁的 // 接收时候,可以加个判断;避免接收来源不明的URL发过来的数据 if( e.origin != "http://1.1.1.1:8080" ){ return; } document.getElementById("h1").innerHTML = e.origin; // e.data:发消息的内容 document.getElementById("p_text").innerHTML = e.data; // 接收到消息后,在回过去,回个话; // 通过访问message的source的属性,来获取消息发送源的窗口对象, // 也就是能知道是谁发的消息,在通过postMessage,给发消息者回个话 e.source.postMessage("我是子页面的消息---呵呵哒",e.origin); },false); </script></body></html>
注意:
1.origin属性,可以获取消息的发送源。请注意,发送源与网站的URL地址不是统一概念,发送源只包括域名和端口号。为;了不接收同其他源发送过来的恶意的乱七八糟的消息,最好对发送源做个检查;屏蔽掉一些不需要的消息;
2.data属性,可以得到消息的内容,可以是任何javascript对象;
3.使用postMessage发消息;
4.source属性,可以获取消息发送源的窗口代理对象;
结果图:(实在抱歉测试的时候,用的IP是真的,只能覆盖了;理解理解!)
以上是整理postMessage跨文档传输消息
0 0
- 跨域、跨文档传输数据(三)---- postMessage ; 实现跨文档消息传输;
- 跨文档消息传输之postMessage()
- iframe跨文档传输(postMessage跨域)
- 跨文档消息传输
- html5跨文档消息传输
- 跨域请求方式二: iframe跨文档传输(postMessage跨域)
- html5web通信-跨文档消息传输
- postMessage 跨文档消息传递
- HTML5知识填坑(三)——跨文档传输消息
- 前端跨域技术之跨文档消息传输
- HTML5 postMessage 消息传输与 POST 跨域通信
- HTML5 postMessage 消息传输与 POST 跨域通信
- TCP传输文档
- Web 通信技术 ——跨文档信息传输(JavaScript)
- 设计文档,,,(负荷管理传输规约)
- 设计文档,,,(负荷管理传输规约)
- TCP传输大文件(图片、文档)
- TCP传输大文件(图片、文档)
- 进程间通信----命名管道
- char与byte的区别
- Struts2.3+Spring3.2.8+Hibernate4.1全注解配置
- 博客开通鸟~
- 每日一linux命令(11)-------nl
- 跨域、跨文档传输数据(三)---- postMessage ; 实现跨文档消息传输;
- 图解用Fiddler做http协议分析入门
- Android xutil3网络模块二次封装
- 使用axis1+spring+hibernate搭建webservice框架(一)
- mongodb常用命令
- Hadoop入门之Hadoop中的HelloWorld程序
- Xcode清除缓存、清理多余证书
- Block (二) 块方法的应用症状枚举
- hdu 1269 迷宫城堡【强连通+Kosaraju】