浅谈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 相关文章推荐
js 刷新页面的代码小结 推荐
Apr 02 Javascript
JS获取页面input控件中所有text控件并追加样式属性
Feb 25 Javascript
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
node.js中的path.join方法使用说明
Dec 08 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
微信小程序 Image API实例详解
Sep 30 Javascript
原生js实现返回顶部缓冲效果
Jan 18 Javascript
Vue侦测相关api的实现方法
May 22 Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 Javascript
JavaScript前端开发时数值运算的小技巧
Jul 28 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
基于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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
php中配置文件操作 如config.php文件的读取修改等操作
2012/07/07 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
js列举css中所有图标的实现代码
2011/07/04 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
JS公共小方法之判断对象是否为domElement的实例
2016/11/25 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
vue + element-ui实现简洁的导入导出功能
2017/12/22 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
深入理解NumPy简明教程---数组1
2016/12/17 Python
django 常用orm操作详解
2017/09/13 Python
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python如何保证输入键入数字的方法
2019/08/23 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
python 负数取模运算实例
2020/06/03 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
求职自荐信格式
2013/12/04 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
解除劳动合同协议书
2014/09/17 职场文书
晋江市人民政府党组群众路线教育实践活动整改方案
2014/10/25 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
趣味运动会口号
2015/12/24 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS