A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

window对象有个name属性,该属性有个特征: 即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置.比如: 有一个页面a.html, 它里面有这样的代码:
再看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.itheima.com/example.html里的数据。  
example.html页面里的代码很简单,就是给当前的window.name设置一个a.html页面想要得到的数据值。example.html里的代码:

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


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

上面的代码只是最简单的原理演示代码,你可以对使用js封装上面的过程,比如动态的创建iframe,动态的注册各种事件等等,当然为了安全,获取完数据后,还可以销毁作为代理的iframe。网上也有很多类似的现成代码,有兴趣的可以去找一下。
通过window.name来进行跨域,就是这样子的,  还有很多可以优化的地方,  骚年们加油吧!!!!!!


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马