文章插图
在页面 http://example.com/b.html 中也设置document.domain,而且这也是必须的,虽然这个文档的domain就是example.com,但是还是必须显示的设置document.domain的值:
文章插图
这样我们就可以通过js访问到iframe中的各种属性和对象了 。
不过如果你想在http://www.example.com/a.html 页面中通过ajax直接请求http://example.com/b.html 页面,即使你设置了相同的document.domain也还是不行的,所以修改document.domain的方法只适用于不同子域的框架间的交互 。如果你想通过ajax的方法去与不同子域的页面交互,除了使用jsonp的方法外,还可以用一个隐藏的iframe来做一个代理 。原理就是让这个iframe载入一个与你想要通过ajax获取数据的目标页面处在相同的域的页面,所以这个iframe中的页面是可以正常使用ajax去获取你要的数据的,然后就是通过我们刚刚讲得修改document.domain的方法,让我们能通过js完全控制这个iframe,这样我们就可以让iframe去发送ajax请求,然后收到的数据我们也可以获得了 。
3、使用window.name来进行跨域
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置 。
比如:有一个页面a.html,它里面有这样的代码:
文章插图
【js中几种实用的跨域方法原理详解】
再看看b.html页面的代码:
文章插图
a.html页面载入后3秒,跳转到了b.html页面,结果为:
文章插图
我们看到在b.html页面上成功获取到了它的上一个页面a.html给window.name设置的值 。如果在之后所有载入的页面都没对window.name进行修改的话,那么所有这些页面获取到的window.name的值都是a.html页面设置的那个值 。当然,如果有需要,其中的任何一个页面都可以对window.name的值进行修改 。注意,window.name的值只能是字符串的形式,这个字符串的大小最大能允许2M左右甚至更大的一个容量,具体取决于不同的浏览器,但一般是够用了 。
上面的例子中,我们用到的页面a.html和b.html是处于同一个域的,但是即使a.html与b.html处于不同的域中,上述结论同样是适用的,这也正是利用window.name进行跨域的原理 。
下面就来看一看具体是怎么样通过window.name来跨域获取数据的 。还是举例说明 。
比如有一个www.example.com/a.html页面,需要通过a.html页面里的js来获取另一个位于不同域上的页面www.cnblogs.com/data.html里的数据 。
data.html页面里的代码很简单,就是给当前的window.name设置一个a.html页面想要得到的数据值 。data.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设为www.cnblogs.com/data.html就行了 。然后a.html想要得到iframe所获取到的数据,也就是想要得到iframe的window.name的值,还必须把这个iframe的src设成跟a.html页面同一个域才行,不然根据前面讲的同源策略,a.html是不能访问到iframe里的window.name属性的 。这就是整个跨域过程 。
看下a.html页面的代码:
文章插图
上面的代码只是最简单的原理演示代码,你可以对使用js封装上面的过程,比如动态的创建iframe,动态的注册各种事件等等,当然为了安全,获取完数据后,还可以销毁作为代理的iframe 。网上也有很多类似的现成代码,有兴趣的可以去找一下 。
通过window.name来进行跨域,就是这样子的 。
4、使用HTML5中新引进的window.postMessage方法来跨域传送数据
推荐阅读
- 机器学习算法中的7个损失函数的详细指南
- 淘宝直播系统抽奖怎样才更容易中 淘宝直播间抽奖中奖技巧
- 如何挑选牛蹄
- 如何挑选牛筋?
- 什么是禅茶 什么是茶禅 有区别吗
- 如何处理牛舌
- 如何挑选白牛肝菌
- 西游记里的沙僧最后成为什么佛 西游记中为什么不能没有沙僧
- 梦到一条龙在空中盘旋 梦见两条龙在天上盘旋
- 中国文人以茶怡情 以茶养生之道