最近在做網站的時候用到了一個大檔案上傳的功能,也就是說通過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做個最佳化才行