360doc
一个奇怪的ie bug,兼对比ie和ff ajax处理方式(转载)
Java代码 复制代码
  1. <html>   
  2. <head>   
  3. <script language="javascript" src="mootools.js" type="text/javascript"></script>   
  4. </head>   
  5. <body onunload="a.cancel();b.cancel();c.cancel()">   
  6. <a href="/index.html" target="_blank">123</a>   
  7. </body>   
  8. <script>   
  9.   
  10. var a=new Ajax('test.php', {method: 'get',onComplete:go}).request();//new ajax是mootools里面对ajax封装的类,可以用大家自己的替代.   
  11. var b=new Ajax('test.php', {method: 'get',onComplete:go}).request();   
  12. var c=new Ajax('test.php', {method: 'get',onComplete:go}).request();   
  13.   
  14. function go(html){   
  15.     alert(html);   
  16. }   
  17. </script>   
  18. </html>  


上面这个是html文件

Java代码 复制代码
  1.   
  2. <?php   
  3.     sleep(5);   
  4.     echo "alert(0)";   
  5. ?>  

php文件,不知道为啥出现了两个一样的,大家拷贝一段就行了,你也可以用servlet改写一下,反正很简单,就是让他老人家休息一下,然后给个字符串就行了。

把html和php放在一起,然后加上mootools.js或者你自己的ajax实现。然后配置好apache,我是放在根目录了,就是127.0.0.1大家随便放(只要你能找到就ok)。

Q1.好了先打开一个页面,你会发现页面首先呈现123。然后5秒后弹出2个alert,10秒中弹出1个alert。这是一次个问题,为啥这样呢?ajax不是异步调用的吗?firefox什么样呢?
A1.ie是傻瓜式,就是无论啥ajax请求一样或者不一样的,他也一次发两个(当然你发送大于等于2个时),他不会同时发送两个,其他的要等到那两个返回,再发,不过还是最多一次两个。
   ff是智能式,他的原理是如果请求是相同的,他会一个一个发,如果是不同的他会一起发。

Q2.现在在刚才的页面基础上点那个123的链接(在新窗口中打开本页),然后在5秒中之内关闭窗口,你会发现什么??试过再往下看。
























Boom,ie完蛋了或者说你这个域完蛋了,看看是不是再访问127.0.0.1的域都是白页了,你只有把同一进程的ie关掉才能恢复正常。
A2.这是为啥呢?据我分析ie发出ajax请求后,他是不见棺材不掉泪的类型,它默认是一直等待,就算你把那个ie关掉,只要同一进程的ie还开着,他就一直等,其实等来也没有结果了(这是个人揣测,具体ie咋实现的微软好像没有说,要不就是说了我没找到.......)。咋办呢?就这个问题困扰我好久,后来发现了,可以abort掉请求的,在mootools.js里面用cancel函数在XHR里面。你只需要这样加入
Java代码 复制代码
  1. window.attachEvent('onunload',function(){a.cancel();});   
  2. window.attachEvent('onunload',function(){b.cancel();});   
  3. window.attachEvent('onunload',function(){c.cancel();});  
就ok了,如果你没用mootools.js你使用
Java代码 复制代码
  1. req.abort();//req是你的ieajax请求对象  

这样这个问题就可以解决了,满怀欣喜的用了这个方法,结果在生产环境中发现还是出现白页现象,忽然有种从天堂到地狱的感觉。接着我继续分析。

Q3.在你的html代码<body>中加入这个<img src="/test.php" id="img"/>。然后继续刚才的操作吧,呵呵,发现啥了,白页又出来了吧。咋解决呢?
A3.最后我分析因为照片没有加载完,所以不会调用onunload方法,最后找到了onbeforeunload方法,这次终于解决了这个问题。



总结:一个看似很奇怪的生产环境中出现白页(ie不请求服务器的现象)背后却有这么多技术点,不过ff就不会有这bug,总之ie 是king of the bug and king of the leak。
  (cathy 的分类目录 [program])
相关文章
发表评论
发送评论时内容自动复制到剪切板