由于同源策略的限制,Javascript存在跨域通信的问题。典型的跨域问题包括iframe与其父级之间的通信。几种常规解决方案:
(1)document . domain iframe;(2)创作剧本;动态地;(3)iframe location . hash;(4)闪光灯.
PostMessage是HTML5为解决js跨域问题而引入的新API,允许多个iframe/window跨域通信。
HTML5提供了在web文档之间接收和发送信息的功能。有了这个功能,只要获取到网页所在的窗口对象的实例,不仅相同来源(域端口号)的网页可以相互通信,还可以实现跨域通信。
浏览器支持:IE8、firefox4、chrome8 opera10。
1.首先,如果要接收从其他窗口发送的消息,必须监视窗口对象的消息事件,如下所示:
复制代码如下: window . addeventlistener(" message ",function () {},false);
2.其次,需要使用窗口对象的postMessage方法向其他窗口发送消息,定义如下:
复制代码如下: otherwindow.postmessage(消息,目标源);
该方法使用两个参数,第一个参数是发送的消息文本,但也可以是任何javascript对象,第二个参数是接收消息的对象窗口的url地址(例如:http:127.0.0.1:8080/),但我们也可以在url地址字符串中使用通配符“*”来指定所有域,但我们仍然建议使用特定的域名。
演示文稿:
现在,如果我在hosts文件下绑定两个域名,如下所示:
127 . 0 . 0 . 1 longen.example.com
现在,如果abc.example.com域名下有一个abc.html页面,longen.example.com域名下有一个def.html页面,我希望这两个不同域名下的页面可以互相交流。abc.html法典如下:
='message' style='color:red '的表单p标签;' font-size :24 px;'向iframe子窗口发送消息:/labeinputtype=' text ' name=' Message ' value=' send ' id=' Message '/inputtype=' submit ' value=' submit ' id=' submit '/p/来自表单h4的消息目标iframe: /h4 p id='test '还没有信息/p iframe id=' iframe ' src=' http:http://longen.example.com/WebSocket/def.html'样式=' display3360none'/iframejs代码如下:
var win=document . getelementbyid(' iframe ')。contentWindowdocument . getelementbyid(' submit ')。onclick=function(e){ e . preventdefault();win . postmessage(document . getelementbyid(' message ')。value,' http://longen . example.com ');} window . addeventlistener(' message '),函数(e){ e . preventdefault();Document.getelementbyid ('test ')。innerhtml='来自' e.origin '的消息: n ' e . data;},false);Def.html法典如下:
HTML代码:
Form p label for='message '向父窗口ABC . html:/label input type=' text ' name=' message ' value=' send ' id=' message '/input type=' submit '/p/form p id=' test 2 '还没有消息。/pJS代码如下:
var parentwin=window.parentwindow . addevent listener(' message '),函数(e){ document . getelementbyid(' test2 ')。innerhtml=' field' e.origin '从父窗口传输,内容数据:' e . data;parentwin.postMessage('HI!你给我发了e.data。' http://ABC . example.com ');},false);当我点击abc.html页面,可以看到如下效果,内容是从def.html返回的。如下所示:
我们需要了解以下信息:
您可以通过监听窗口对象的消息事件来接收消息。您可以通过访问消息事件的origin属性来获取消息的发送源。您可以通过访问消息事件的data属性来获取消息内容。使用postMessage方法发送消息。通过访问消息事件的source属性,可以获得消息发送源的window对象(准确地说,应该是window的代理对象)。有了以上的基础知识点,我们就可以延伸到ajax POST的跨域问题了。
二:使用邮件后知识点解决创建交互式、快速动态网页应用的网页开发技术中邮政跨域问题。
原理:原理也很简单,假如我们的域名abc.example.com下的abc.html页面需要发创建交互式、快速动态网页应用的网页开发技术请求(跨域,域名为longen.example.com)下,那么我们还是先跨页面文档的形式,和上面一样,我们可以现在longen.example.com下建立一个页面,比如叫def.html .那么我们现在还是在abc.html页面嵌入一个隐藏域iframe src路径指向longen.example.com域下def,html页面。过程还是和跨文档类似,只是现在在def.html页面中在window.onmessage事件内写创建交互式、快速动态网页应用的网页开发技术请求即可,如下代码:
abc.example.com下的abc.html页面如下:
超文本标记语言代码和上面一样,下面是射流研究…代码:
var win=文档。getelementbyid(' iframe ').contentWindowdocument。getelementbyid(' submit ').onclick=function(e){ e . prevent default();赢了。邮件(文档。getelementbyid(' message ').值' http://longen。例子。com/');}窗口。addeventlistener(' message '),函数(e){ e . prevent default();alert(e . data的类型)var JSON=JSON。解析(例如数据);控制台。日志(JSON);alert(json.url)},false);def.html代码如下:
射流研究…代码如下:
//获取跨域数据window.onmessage=function(e){ $ .Ajax({ URL : ' http://longen。例子。com/webSocket/test。PHP ',type:'POST ',dataType:'text ',//data : { msg 3360 e . data },success : function(RES){ var parent win=win win win。父母;parentwin.postMessage(res,' http://ABC。例子。com’);//跨域发送数据} });};test.php代码如下:
?php $data=array(url=1,name='2 ',' xx-xx '=' xx ');echo JSON _ encode($ data);如上实现方式就可以实现阿贾克斯邮报跨域了。
以上内容是关于使用HTML5中邮件后知识点解决埃阿斯中邮政跨域问题的相关介绍,希望大家喜欢。