初来此处,给大家带来一个奇怪的ie bug,兼对比ie和ff ajax处理方式

开发中遇到的,苦恼了我2天的时间,终于搞定了。好了废话不说了,看一个实例吧。初次发帖可能格式有点问题。

<html>
<head>
<script language="javascript" src="mootools.js" type="text/javascript"></script>
</head>
<body onunload="a.cancel();b.cancel();c.cancel()">
<a href="/index.html" target="_blank">123</a>
</body>
<script>

var a=new Ajax('test.php', {method: 'get',onComplete:go}).request();//new ajax是mootools里面对ajax封装的类,可以用大家自己的替代.
var b=new Ajax('test.php', {method: 'get',onComplete:go}).request();
var c=new Ajax('test.php', {method: 'get',onComplete:go}).request();

function go(html){
	alert(html);
}
</script>
</html>


上面这个是html文件


<?php
	sleep(5);
	echo "alert(0)";
?>


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里面。你只需要这样加入
window.attachEvent('onunload',function(){a.cancel();});
window.attachEvent('onunload',function(){b.cancel();});
window.attachEvent('onunload',function(){c.cancel();});
就ok了,如果你没用mootools.js你使用
req.abort();//req是你的ie中ajax请求对象

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

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。

你可能感兴趣的:(Ajax,PHP,IE,Go,mootools)