浅谈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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
jQuery插件 tabBox实现代码
Feb 09 Javascript
基于jQuery的树控件实现代码(asp.net+json)
Jul 11 Javascript
jQuery bind事件使用详解
May 05 Javascript
jQuery筛选器children()案例详解(图文)
Feb 17 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
Jun 10 Javascript
jquery简单倒计时实现方法
Dec 18 Javascript
Bootstrap实现弹性搜索框
Jul 11 Javascript
javascript-解决mongoose数据查询的异步操作
Dec 22 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
Nov 09 jQuery
浅谈一种让小程序支持JSX语法的新思路
Jun 16 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
Aug 27 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与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
Python 模拟登陆的两种实现方法
2017/08/10 Python
python实现最小二乘法线性拟合
2019/07/19 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
教育孩子心得体会
2014/01/01 职场文书
求职信范文大全
2014/05/26 职场文书
室内设计专业自荐信
2014/05/31 职场文书
法律讲堂观后感
2015/06/11 职场文书
个人催款函范文
2015/06/24 职场文书
浅析Python实现DFA算法
2021/06/26 Python
修改并编译golang源码的操作步骤
2021/07/25 Golang
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
python 单机五子棋对战游戏
2022/04/28 Python