Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

IE8上的跨域API调用处理

  之前写过一篇叫“跨域API的调用处理”的文章,介绍了跨域API调用的一些简化方法。但现在测试发现,在IE8上这个方法无法通过。IE8认为一旦窗口访问了跨域的资源就应该断开与父窗口的关联,即使跨域访问只是一瞬间。所以我们需要写额外的兼容代码。
  我们要做的就是侦测window.open打开的窗口是否关闭,但并没有直接的接口,即使有也不支持跨域。所以我们要根据浏览器特性自己来检测。下面是代码:
<!-- saved from url=(0026)http://127.0.0.1/test.html -->
<input type="button" value="打开" />
<script>
document.querySelector("input").onclick=function(){
  var w=open("//localhost");
  (function callee(){
    try{
      //访问 w.location.href 在不同浏览器上和不同的状态得到的结果不同
      //Chrome
      //同域:可以正常访问
      //跨域:抛出
      //关闭:得到 undefined
      //Firefox
      //同域:可以正常访问
      //跨域:抛出
      //关闭:location 不存在
      //IE8
      //同域:可以正常访问
      //跨域:抛出
      //关闭:抛出 错误代码 e.number=-2147467259
      if(w.location&&w.location.href)throw 0;
    }catch(e){
      if(e.number!=-2147467259)
        return setTimeout(callee,100);
    };
    console.log("页面关闭");
  })();
};
</script>
  在同域下,我们可以得到子窗口的网址。但只要一跨域就什么都获取不到了,而且尝试获取那些信息还会产生异常。这是所有浏览器上都类似的行为,我们的重点是在子窗口关闭后浏览器的行为。这在上面代码的注释中已经写清楚了,我就不再重复了。因此我们只要检测页面关闭这个行为所造成的结果就可以检测到页面是否已被关闭。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^