浅谈js中几种实用的跨域方法原理详解


Posted in Javascript onDecember 02, 2016

这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域。

下表给出了相对http://store.company.com/dir/page.html同源检测的结果:

那么在a.html页面中,我们怎么把data.html页面载入进来呢?显然我们不能直接在a.html页面中通过改变window.location来载入data.html页面,因为我们想要即使a.html页面不跳转也能得到data.html里的数据。答案就是在a.html页面中使用一个隐藏的iframe来充当一个中间人角色,由iframe去获取data.html的数据,然后a.html再去得到iframe获取到的数据。

充当中间人的iframe想要获取到data.html的通过window.name设置的数据,只需要把这个iframe的src设为3water.com/data.html就行了。然后a.html想要得到iframe所获取到的数据,也就是想要得到iframe的window.name的值,还必须把这个iframe的src设成跟a.html页面同一个域才行,不然根据前面讲的同源策略,a.html是不能访问到iframe里的window.name属性的。这就是整个跨域过程。

看下a.html页面的代码:

浅谈js中几种实用的跨域方法原理详解

上面的代码只是最简单的原理演示代码,你可以对使用js封装上面的过程,比如动态的创建iframe,动态的注册各种事件等等,当然为了安全,获取完数据后,还可以销毁作为代理的iframe。网上也有很多类似的现成代码,有兴趣的可以去找一下。

通过window.name来进行跨域,就是这样子的。

 4、使用HTML5中新引进的window.postMessage方法来跨域传送数据

window.postMessage(message,targetOrigin)  方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

调用postMessage方法的window对象是指要接收消息的那一个window对象,该方法的第一个参数message为要发送的消息,类型只能为字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 *  。

需要接收消息的window对象,可是通过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。

上面所说的向其他window对象发送消息,其实就是指一个页面有几个框架的那种情况,因为每一个框架都有一个window对象。在讨论第二种方法的时候,我们说过,不同域的框架间是可以获取到对方的window对象的,而且也可以使用window.postMessage这个方法。下面看一个简单的示例,有两个页面

浅谈js中几种实用的跨域方法原理详解

浅谈js中几种实用的跨域方法原理详解

我们运行a页面后得到的结果:

浅谈js中几种实用的跨域方法原理详解

我们看到b页面成功的收到了消息。

使用postMessage来跨域传送数据还是比较直观和方便的,但是缺点是IE6、IE7不支持,所以用不用还得根据实际需要来决定。

结语:

除了以上几种方法外,还有flash、在服务器上设置代理页面等跨域方式,这里就不做介绍了。

以上四种方法,可以根据项目的实际情况来进行选择应用,个人认为window.name的方法既不复杂,也能兼容到几乎所有浏览器,这真是极好的一种跨域方法。

Javascript 相关文章推荐
Firebug入门指南(Firefox浏览器)
Aug 21 Javascript
ExtJS[Desktop]实现图标换行示例代码
Nov 17 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
Apr 04 Javascript
一个jquery实现的不错的多行文字图片滚动效果
Sep 28 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
Aug 12 Javascript
JavaScript获取客户端IP的方法(新方法)
Mar 11 Javascript
bootstrap中使用google prettify让代码高亮的方法
Oct 21 Javascript
详解angular用$sce服务来过滤HTML标签
Apr 11 Javascript
微信小程序获取微信运动步数的实例代码
Jul 20 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
Nov 27 Javascript
Vue+ElementUI项目使用webpack输出MPA的方法
Aug 27 Javascript
深入理解Antd-Select组件的用法
Feb 25 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 #Javascript
探讨跨域请求资源的几种方式(总结)
Dec 02 #Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
Dec 02 #Javascript
JavaScript 计算笛卡尔积实例详解
Dec 02 #Javascript
jQuery联动日历的实例解析
Dec 02 #Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
Dec 02 #Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 #Javascript
You might like
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php 高性能书写
2010/12/11 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
提高php编程效率技巧
2015/08/13 PHP
纯php生成随机密码
2015/10/30 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
优雅的将ElementUI表格变身成树形表格的方法步骤
2019/04/11 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python爬取qq music中的音乐url及批量下载
2017/03/23 Python
python读取文本中的坐标方法
2018/10/14 Python
Django框架验证码用法实例分析
2019/05/10 Python
Python 实现大整数乘法算法的示例代码
2019/09/17 Python
Python项目跨域问题解决方案
2020/06/22 Python
如何在pycharm中安装第三方包
2020/10/27 Python
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
学生实习自我鉴定
2013/10/11 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
员工保密承诺书
2014/05/28 职场文书
任命书模板
2014/06/04 职场文书
开展创先争优活动总结
2014/08/28 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
整改通知书格式
2015/04/22 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
JavaScript获取URL参数的方法分享
2022/04/07 Javascript