chrome 的 try catch 的问题

金色海洋 2013-07-10 08:34:28

两个页面,一个父页,一个子页,父页里有一个iframe指向子页。

如果父页和子页在同一个域名里,那么可以访问 top.aa ,如果不在同一个域里面,子页虽然可以访问 top ,但是不能给 top.aa 设置值。

我想做一个“缓存”,把一些常用信息缓存在 top里。因为父页被更新的次数要远小于子页的更新次数。

但是问题是,并不一定在一个域名里,不在一个域名里就不做缓存了。

我想做一下判断,typeof top.__cache 在跨域的时候会报错,于是想用try,但是IE里面好用,chrome里面不好用。

折腾半天只好采用折中的办法来判断,虽然可以判断出来,但是还是会报错。

请问一下有没有更好的办法(注意,在chrome浏览器里面要好用)。我的代码如下:



try {
if (typeof top == "undefined")
canUseCache = false;
else {
top.t_m_p = "tmp";
if (top.t_m_p != "tmp") /*chrome里,抓不住这个异常,只好这么判断了*/
canUseCache = false;
else {
if (typeof top.__cache == "undefined")
top.__cache = {};

canUseCache = true;
}

}
} catch (e) {
/* 出异常,不允许访问,不缓存了。*/
canUseCache = false;
}
...全文
292 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
金色海洋 2013-07-11
  • 打赏
  • 举报
回复
引用 12 楼 dongxinxi 的回复:
没有跨域的时候用top.document.domain是可以的,已经测试过的 至于跨域时,没试过,如果报错,那么你先看下 canUseCache = window.top.document != undefined && window.top.document.domain != undefined && window.top.document.domain.toLowerCase() == document.domain.toLowerCase()); 你再试试看
如果跨域,且不让访问的时候,根本就不让读取 window.top.document ,任何操作、判断都会出错。 非常感谢热情回复。 估计其他人也都不会,算了结贴吧。 不过又出现问题了,最外面的页是 frameset。晕死,还有人用这个。不知道行不行了。
  • 打赏
  • 举报
回复
window.top.document.domain.toLowerCase() == document.domain.toLowerCase() 这个按照你的要求比较子域
  • 打赏
  • 举报
回复
没有跨域的时候用top.document.domain是可以的,已经测试过的 至于跨域时,没试过,如果报错,那么你先看下 canUseCache = window.top.document != undefined && window.top.document.domain != undefined && window.top.document.domain.toLowerCase() == document.domain.toLowerCase()); 你再试试看
  • 打赏
  • 举报
回复
canUseCache = top != "undefined" && regex.exec(top.location.href).toLowerCase() == regex.exec(window.location.href).toLowerCase();
  • 打赏
  • 举报
回复
为什么不直接能过url去判断是否跨域呢?比如
var regex = /:\/\/[^/]+/i;
canUseCache = top != "undefined" && regex.exec(top.location.href) != regex.exec(window.location.href));
lixionggao 2013-07-10
  • 打赏
  • 举报
回复
路过,看不懂.
金色海洋 2013-07-10
  • 打赏
  • 举报
回复
不能沉呀。呀呀
金色海洋 2013-07-10
  • 打赏
  • 举报
回复
才发现,没有父页的时候(直接在浏览器里打开子页),top 和 parent 都不是 "undefined" 而是 window 。 咋回事呢?
金色海洋 2013-07-10
  • 打赏
  • 举报
回复
有图有真相。chrome

var a = top.document.domain 也不行,top.document 都不行


金色海洋 2013-07-10
  • 打赏
  • 举报
回复
引用 8 楼 dongxinxi 的回复:
原来你说的是document.domain属性,这个属性是只读的,赋值就会报安全错误,不然就天下大乱了
那就直接通过比较它不就完了
top的类型是window,不是document
if(top != undefined && document.domain.toLowerCase() == top.document.domain.toLowerCase()){
}

不过这篇帖子提到一个问题 http://www.blogjava.net/ginew/archive/2006/04/13/40850.html


非常感谢!

1、关于 document.domain。
一开始是测试 a.com 和 w1.a.com ,这种关系是可以通过设置来允许访问。抱着侥幸和恐惧的心理没有继续测试。

看到你给的连接,不得不测试一下 w1.a.com 和 w2.a.com的情况 —— 这个紧张呀 —— 好在通过测试了。

chrome 、IE7-10都可以,IE6没测试环境,firefox没测试,因为根本就不用这个浏览器。我们专用chrome。




2、var a = top.document.domain.toLowerCase()

如果不允许跨域访问的话,那么这句直接报错,错误提示如下:(在chrome里面)。



Unsafe JavaScript attempt to access frame with URL http://a.nature.com/a.htm? from frame with URL http://b.nature.com/Demo/List.htm. The frame requesting access set 'document.domain' to 'nature.com', but the frame being accessed did not. Both must set 'document.domain' to the same value to allow access.


最郁闷的是这种错误没有被try捕获。

在IE里是可以捕获这个错误的。

var a = top.document.domain 也不行,top.document 都不行
  • 打赏
  • 举报
回复
原来你说的是document.domain属性,这个属性是只读的,赋值就会报安全错误,不然就天下大乱了 那就直接通过比较它不就完了 top的类型是window,不是document if(top != undefined && document.domain.toLowerCase() == top.document.domain.toLowerCase()){ } 不过这篇帖子提到一个问题 http://www.blogjava.net/ginew/archive/2006/04/13/40850.html
金色海洋 2013-07-10
  • 打赏
  • 举报
回复
关键是,我不能确定,父页一定会加上 domain = "a.com" ,如果没加上,还不能判断出来,那么程序就挂掉了,那么我的方案就会被否决。 所以不管怎么说,不能挂掉,还不能手动改设置,因为服务器上的任何修改都太麻烦,而且还容易忘。
金色海洋 2013-07-10
  • 打赏
  • 举报
回复
引用 4 楼 dongxinxi 的回复:
canUseCache = top != "undefined" && regex.exec(top.location.href).toLowerCase() == regex.exec(window.location.href).toLowerCase();
感谢提供代码,但是 父页地址 w1.a.com/a.htm 子页地址 w2.a.com/b.htm 判断url, 不可以访问吧? 但是如果在两个页面里都加上 domain = "a.com" 的话,那么就可以访问了。
金色海洋 2013-07-10
  • 打赏
  • 举报
回复
引用 3 楼 dongxinxi 的回复:
为什么不直接能过url去判断是否跨域呢?比如
var regex = /:\/\/[^/]+/i;
canUseCache = top != "undefined" && regex.exec(top.location.href) != regex.exec(window.location.href));
这个是肯定不行的,因为 是用 domain = "a.com" 的方式来强制可以访问的,如果判断url的话,那是不一定的。 因为 父页面 加上 domain = "a.com" 就可以访问,不加就不能访问,url是不变的。 另外,如果不允许访问的话, top.location.href 估计会报错,没测试。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧