页面刷新的JS全局变量问题

下面是一个描述跨域解决办法的帖子,我的问题用粗体表明
3. window.name
我们来看以下一个场景:

随意打开一个页面,输入以下代码:

window.name = "My window's name";
location.href = "http://www.qq.com/";
再检测 window.name :

window.name; // My window's name
可以看到,如果在一个标签里面跳转网页的话,我们的 window.name 是不会改变的。
基于这个思想,我们可以在某个页面设置好 window.name 的值,然后跳转到另外一个页面。在这个页面中就可以获取到我们刚刚设置的 window.name 了。

由于安全原因,浏览器始终会保持 window.name 是 string 类型。
这个方法也可以应用到与 <iframe> 的交互上来。

我的页面(http://one.example.com/index....中内嵌了一个 <iframe>:

<iframe id="iframe" src="http://omg.com/iframe.html&qu...
在 iframe.html 中设置好了 window.name 为我们要传递的字符串。
我们在 index.html 中写了下面的代码:

var iframe = document.getElementById('iframe');
var data = '';

iframe.onload = function() {

data = iframe.contentWindow.name;

};
定睛一看,为毛线报错?
细心的读者们肯定已经发现了,两个页面完全不同源啊!
由于 window.name 不随着 URL 的跳转而改变,所以我们使用一个暗黑技术来解决这个问题:

var iframe = document.getElementById('iframe');
var data = '';

iframe.onload = function() {

iframe.onload = function(){
    data = iframe.contentWindow.name;
}
iframe.src = 'about:blank';

};
或者将里面的 about:blank 替换成某个同源页面(最好是空页面,减少加载时间)。
上述代码执行之后,我得到的data是空的,我觉得在执行iframe.src='about:blank'后,iframe页面里面的name值消失了???

阅读 7.8k
1 个回答

全局变量有很多种方式可以代替,
既然你使用到了iframe,完全可以使用回调函数赋值
或者用cookie、localstorage

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题