最近我的開發一個小的OA項目,屬於複習階段.使用的技術主要是spring mvc做爲前端框架,mybatis做爲數據庫持久化技術.前臺使用jquery和一些jquery的插件.
在開發到中間階段時候發現本身好像忽略了一個小問題,整個項目一直在firefox下測試,沒有在IE下測試,不肯定是否會出現兼容問題.因爲jquery的天生兼容性良好,我就沒有過多的關注.在項目接近收尾階段,我開啓了IE測試,不過此次發現確實存在了兼容性問題,並且問題很是嚴重.
因爲爲了簡便,我在提交表單的操做上採用jquery.form.js,這個組件.它提供了ajaxSubmit這個方法,可以進行異步表單提交,並在提交成功後,執行success函數.個人系統在一個表單頁面既有普通的內容,也有file標籤,進行文件上傳的控制.springmvc的controller中須要寫一段這樣的代碼:[code="java"]MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;[/code]這是爲了將普通的httprequest轉換爲spring的request,進而獲取文件流等信息.在ajaxSubmit這種提交請求下,firefox下面測試徹底正常,可以順利上傳,執行回調函數;可是若是在IE瀏覽器下面操做,這個位置會進行ClassCast類轉換異常,一樣也不會執行回調函數.並且,一些表單若是設置爲[code="java"]enctype="multipart/form-data"[/code]這個屬性,success回調函數也一樣不能執行,並且在spring mvc的controller中,會將會穿頁面的json字符串解析爲要跳轉的頁面,不回傳給ajax請求.也就說明ajax請求,在IE瀏覽器下,是不能進行文件上傳操做的. 參數傳遞過程當中,在IE瀏覽器下也會發生亂碼,並且火狐下仍是正常.
根據debug日誌分析,是IE下的請求頭和firefox下的請求頭髮生了重大的區別.firefox是application/json,IE的比較長,application/x-Microsoft-....這就致使了,一系列的問題發生. 看來仍是瀏覽器的不兼容致使,並且短期內也沒什麼好辦法去重構這個問題,只能採用分而治之的狀況了,若是不須要上傳的頁面,還能夠繼續使用,可是enctype="multipart/form-data"這個屬性必須去掉,否則會出現亂碼和ajax回調函數不執行的狀況.若是肯定須要上傳的頁面,最好仍是普通的表單提交,不然不兼容的話,實在沒辦法.
除了要噴微軟對於瀏覽器的兼容性沒有計劃以外,這個問題也給咱們敲響了一個警鐘,測試要儘早作,不要最後作,不然風險很大,並且出現問題沒法規避. 前端