跨域访问的解决方案(HTML5的方法:postMessage)

简介:

 关于跨域访问,使用JSONP的方法,我前面已经demo过了,具体见http://supercharles888.blog.51cto.com/609344/856886,HTML5提供了一个非常强大的API,叫postMessage,它其实就是以前iframe的进化版本,使用起来极其方便,这里举个实验例子:

我们依旧按照与上文相同的设定,假定我们有2个Domain 

Domain1: http://localhost:8080  它上面有个应用叫HTMLDomain1,并且有个页面叫sender.html。

Domain2:http://localhost:8180 它上面有个应用叫HTMLDomain2,并且有个页面叫receiver.html。

我现在的需求是,假定Domain1上我们有个json数据,我们想让Domain2应用中的javascript要可以操作这个json 数据(注意,这里已经是跨域了,因为Domain2上的js操作了Domain1上的数据),应该怎么办呢?

解决方案就是用HTML5的postMessage方法

 

Domain2的代码:

首先,我们在Domain2上创建一个HTML页面,这个页面没什么内容,就一行文字会来标识它是Domain 2,它下方将来会被js用来填充从Domain1弄过来的数据。


  
  
  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4. <meta charset="UTF-8"> 
  5. <title>Domain2上的接收者页面receiver.html</title> 
  6. <script type="text/javascript" src="js/receiveInfo.js"></script> 
  7. </head> 
  8. <body onload="receiveInfoFromAnotherDomain();"> 
  9.  
  10.  
  11. <p>这个页面是HTML5跨域访问的Domain2上的页面receiver.html,它会处理来自Domain1上sender.html发送的页面</p> 
  12.  
  13.  
  14. </body> 
  15. </html> 

 

Domain2页面加载时候,它会调用receiveInfoFromAnotherDomain()函数,这个函数首先定义了一个事件监听函数,它只接受来自Domain1(http://localhost:8080)的事件,否则就忽略掉,然后它从这个事件中分离出信息负载,也就是json 数据,然后显示在页面底部:


  
  
  1. //这个函数用于处理从Domain1上的sender发送过来的信息,然后将他们打印出来 
  2. function receiveInfoFromAnotherDomain(){ 
  3.      
  4.     console.log("entering method receiveInfoFromAnotherDomain()"); 
  5.     //首先让window添加一个事件监听函数,表明它可以监听窗口对象的message事件 
  6.     //它受到事件时,会先判断是否来自指定的Domain(不是所有Domain丢过来的事件它都处理的) 
  7.     window.addEventListener("message",function(ev){ 
  8.         console.log("the receiver callback func has been invoked"); 
  9.          
  10.         //如果不是来自指定Domain的,则忽略 
  11.         if(ev.origin !="http://localhost:8080"){ 
  12.             console.log("the event doesn't come from Domain1!"); 
  13.             return
  14.         } 
  15.          
  16.         //现在可以处理数据了 
  17.         //控制台打印出接收到的json数据,因为我们把json字符串发送了过来 
  18.         console.log(ev.data); 
  19.  
  20.         //将json字符串转为json对象,然后从中分离出原始信息 
  21.         var personInfoJSON = JSON.parse(ev.data); 
  22.         var name = personInfoJSON.name; 
  23.         var title = personInfoJSON.title; 
  24.         var info = personInfoJSON.info; 
  25.          
  26.         //构造信息文本并且显示在页面的底部 
  27.         var personInfoString="从域为: "+ev.origin+"那里传来的数据."+"<br>"
  28.         personInfoString+="姓名是: "+name+"<br>"
  29.         personInfoString+="头衔为:  "+title+"<br>"
  30.         personInfoString+="信息为:  "+info+"<br>"
  31.         document.body.innerHTML=personInfoString; 
  32.                  
  33.         } 
  34.          
  35.     ); 
  36.  
  37.  
  38.  
  39.  

 

然后将Domain2 (http://localhost:8180)启动起来,不出意外,它将是:

Domain1的代码:

现在,我们来构建Domain1:

为了让Domain1能够和Domain2通过事件交互,我们用了iframe,把Domain2的页面receiver.html以<iframe>形式镶嵌在Domain1的sender.html页面中。


  
  
  1. <!DOCTYPE html> 
  2. <html> 
  3. <head> 
  4. <meta charset="UTF-8"> 
  5. <title>Domain1上的发送者页面sender.html</title> 
  6. <script type="text/javascript" src="js/sendInfo.js"></script> 
  7. </head> 
  8. <body> 
  9.  
  10. <p>这个页面是HTML5跨域访问的Domain1上的页面sender.html,它将发送一些信息到Domain2上的receiver.html</p> 
  11. <input type="button" value="点击则发送事件到Domain2" onclick="sendInfoToAnotherDomain();"/> 
  12.  
  13. <!-- 这个iframe包含了在另外一个domain->Domain2(http://localhost:8180)的接收者页面receiver.html --> 
  14. <iframe width="1200" src="http://localhost:8180/HTML5Domain2/receiver.html"></iframe> 
  15. </body> 
  16. </html> 

同时我们在页面上创建一个button,当点击它就会发送json数据给Domain2.

 

所以js函数就负责以json字符串形式发送json数据,然后让iframe中的Domain2页面发送信息,注意这里接受者的窗口在iframe中,所以我们用iframe.postMessage,第一个参数是我们的信息载体,这里是json字符串,第二个参数是目标Domain,也就是Domain2


  
  
  1. //假定这个Domain(Domain1)要把一些json信息发送到另一个域(Domain2)的某个页面 
  2. function sendInfoToAnotherDomain(){ 
  3.      
  4.     console.log("entering method: sendInfoToAnotherDomain()"); 
  5.      
  6.     //首先构造一个对象,内含有我们想要发送到Domain2的信息,然后把它转为json字符串    
  7.     var personInfo= new Object; 
  8.     personInfo.name='charles'
  9.     personInfo.title='technical lead'
  10.     personInfo.info="talent man"
  11.     var str=JSON.stringify(personInfo); 
  12.      
  13.     console.log("The information to be send: "+str); 
  14.      
  15.     //我们把这个json字符串发送到Domain2 
  16.     //因为这个Domain2上的目标页面被嵌在了主页面上作为iframe,所以我们取得这个iframe然后让他来发送信息 
  17.     //信息的内容是我们的包含个人信息内容的json字符串 
  18.     var iframe=window.frames[0];     
  19.     iframe.postMessage(str,'http://localhost:8180'); 
  20.      
  21.     console.log("json string has been sent to domain2 successfully"); 

 

这样一来,我们就定义了发送者(Domain1)和接收者(Domain2),发送者由于嵌了<iframe>所以页面看上去如下图:

 

当点击"点击则发送事件到Domain2" 按钮后,json数据信息被发送到了Domain2,因为Domain2的事件监听程序注册了监听来自Domain1的事件,所以它可以把事件中携带的json字符串解析成原始信息,然后构造文本显示在Domain2的receiver.html的下方,如图:(可以比照sendInfoToAnotherDomain(),可以发现信息是完全匹配的)





本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/857637,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
移动开发 前端开发 HTML5
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
本文介绍了Twaver HTML5中数据的批量加载方法,通过使用`box.startBatch()`可以在大量数据加载时提高性能。文章通过示例代码展示了如何在React组件中使用批量加载功能,以减少界面重绘次数并提升效率。
47 1
Twaver-HTML5基础学习(20)数据容器(3)_数据的批量加载(节省性能方法)
|
3月前
|
Web App开发 数据采集 移动开发
提升Selenium在Chrome上的HTML5视频捕获效果的五个方法
在Selenium中优化Chrome的HTML5视频捕获涉及更新Chrome和ChromeDriver、配置浏览器选项、使用代理IP、调整加载策略及确保安装了正确编解码器。例如,更新驱动程序,添加如`--autoplay-policy`和`--proxy-server`的命令行参数,使用代理以防止被封,设置页面加载策略为&#39;eager&#39;,并安装必要的编解码器来确保视频播放。代码示例展示了如何集成这些优化措施。
108 2
提升Selenium在Chrome上的HTML5视频捕获效果的五个方法
|
15天前
|
XML JavaScript 数据格式
jquery中html()方法的使用
jquery中html()方法的使用
15 1
|
1月前
|
存储 编解码 前端开发
HTML颜色的性能优化方法
在网页开发中,虽然颜色选择并非主要性能瓶颈,但合理的颜色优化仍可提升渲染效率与用户体验。本文介绍十种实用技巧,如使用CSS渐变代替图片、运用CSS变量存储颜色、合理选择颜色格式、减少页面颜色种类、按需加载样式表等,帮助改善网页性能。尽管单独来看颜色优化的影响有限,但综合应用这些技巧能够有效提升网页加载速度及整体体验。
|
28天前
|
XML 前端开发 JavaScript
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
11 2
|
1月前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
35 12
|
15天前
|
JavaScript 前端开发
DOM的概念?获取html元素的方法有哪些?
DOM的概念?获取html元素的方法有哪些?
26 0
|
1月前
|
JavaScript 前端开发
HTML 表单和输入与按钮的联动方法汇总
在HTML中,通过JavaScript可以轻松实现表单与输入、按钮的互动。本文介绍了基本表单结构,并展示了如何用JS处理按钮点击、表单提交、动态禁用按钮、表单验证以及使用AJAX和jQuery简化代码等技巧,帮助你更好地控制和优化表单功能。
|
1月前
|
数据安全/隐私保护
自定义密码访问单页HTML源码
自定义密码访问单页HTML源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
36 1
|
2月前
|
数据安全/隐私保护
自定义密码访问跳转页面HTML源码
自定义密码访问跳转页面HTML源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
44 0
自定义密码访问跳转页面HTML源码