最近在做网站的时候用到了一个大文件上传的功能,也就是说通过INPUT 的文件上传表单元素,支持上传任意大小字节的文件,同时在浏览器上显示上传进度。服务端就是利用HttpWorkRequest类,同网上其它大文件上传的原理是一样的。
客户端是在调用form的submit方法之后,再用AJAX方式从服务器上取得当前上传的进度信息,这种方式在IE6和FF下都没有问题。因为自己家里和工作的电脑都没有装IE7,所以就没有在IE7下面测过。
前几天在朋友有电脑上发现在IE7下,表单提交之后进度条信息没法显示了。一开始以为是服务端返回进度信息的handler有问题,调试了一下服务端发现能正常获取到进度信息,说明服务端是没有什么问题的;后来又以为是JS脚本被改动了,仔细的检查了代码后又在IE6和FF下复测了,结果是IE6和FF仍然是好的,而且JS代码也没有动过。为这事我专门在机子上装了IE7进行单步调试,最终发现原因在于submit之后调用AJAX能够执行到send方法,但是在表单没有完全提交之前,永远也不会调用回调函数。
回想之前调试服务端的时候,获取到的文件上传进度的信息都是99%,100%之类的。当时还以为是用的上传文件不是太大,又都是在本机调试,很快就上传完了的原因。现在看来问题就是出在这了,貌似IE7里面submit和AJAX请求用的是同一个TCP连接,要不然就是submit的时候AJAX被阻塞了(反正现象都一样,也没有深究),表单提交完了的时候才执行的,没有调用回调函数当然也就不会更新浏览器的进度信息了。
现在想想除了我在提交表单的时候用的是form的submit的方法,而不是用的submit的表单元素外,没有什么特别之处了(周一再去检验这个猜想)。最离奇的是IE6和FF都过了,唯独IE7过不了。google了一把,好像还没有发现跟我有同样现象的。本人自认为人品还是很不错的。。。郁闷.
今天难得有点时间,整理了一下以前留下的遗留问题,忽然发现这个IE7下面不能更新进度条的问题不再发生了,以前的N个网站都能够正常刷新进度,而相应的JS代码一直都没有改过,果真是RPWT,还是MS在新的补丁里面解决了这个问题?现在看来也不得而知了,从去年到今年,IE7已经打过N个补丁了,只有哪天重新系统的时候刚装完IE7的时候再来验证一下才会知道。不过倒是发现了另外一个以前没有注意到的地方,原来IE7也开始支持Native HttpXmlRequest了,也就是说在创建异步请求的对象实例的时候代码可以和FF一样直接new,但是看网上好多人提到貌似与以前的ActiveX方式创建的对象有不小的区别,具体用的时候会发生一些莫名其妙的问题。所以以前网上比较流行的跨浏览器的创建对象方式一上来就new HttpXmlRequest,失败了再去用ActiveX方式创建的过程得改一改了,把new HttpXmlRequest放到最后一种情况来判断。这个样以优先应用以前的ActiveX方式的对象。至于IE7中用new HttpXmlRequest方式创建的异步请求的对象嘛,暂时就不用考虑了,毕竟才刚出来,还不是行成熟。就算是要兼容,也得先把JS脚本争对IE7做个优化才行